app-service.js 445 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365
  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.1.118: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. const token = uni.getStorageSync("fulfiller_token");
  759. uni.uploadFile({
  760. url: BASE_URL + "/fulfiller/app/upload",
  761. filePath,
  762. name: "file",
  763. header: {
  764. "clientid": CLIENT_ID,
  765. "X-Platform-Code": PLATFORM_CODE,
  766. "Authorization": token ? `Bearer ${token}` : ""
  767. },
  768. success: (res) => {
  769. try {
  770. const data = JSON.parse(res.data);
  771. if (data.code === 200) {
  772. resolve(data);
  773. } else {
  774. uni.showToast({ title: data.msg || "上传失败", icon: "none" });
  775. reject(data);
  776. }
  777. } catch (e) {
  778. reject(e);
  779. }
  780. },
  781. fail: (err) => {
  782. uni.showToast({ title: "上传失败", icon: "none" });
  783. reject(err);
  784. }
  785. });
  786. });
  787. }
  788. function updateAvatar(avatar) {
  789. return request({
  790. url: "/fulfiller/fulfiller/my/avatar",
  791. method: "PUT",
  792. data: { avatar }
  793. });
  794. }
  795. function updateName(name) {
  796. return request({
  797. url: "/fulfiller/fulfiller/my/name",
  798. method: "PUT",
  799. data: { name }
  800. });
  801. }
  802. function updateStatus(status) {
  803. return request({
  804. url: "/fulfiller/fulfiller/my/status",
  805. method: "PUT",
  806. data: { status }
  807. });
  808. }
  809. function updateCity(cityCode, cityName) {
  810. return request({
  811. url: "/fulfiller/fulfiller/my/city",
  812. method: "PUT",
  813. data: { cityCode, cityName }
  814. });
  815. }
  816. function getAuthInfo() {
  817. return request({
  818. url: "/fulfiller/fulfiller/my/auth",
  819. method: "GET"
  820. });
  821. }
  822. function updatePhone(phone, code) {
  823. return request({
  824. url: "/fulfiller/fulfiller/my/phone",
  825. method: "PUT",
  826. data: { phone, code }
  827. });
  828. }
  829. function updatePassword(oldPassword, newPassword) {
  830. return request({
  831. url: "/fulfiller/fulfiller/my/password",
  832. method: "PUT",
  833. data: { oldPassword, newPassword }
  834. });
  835. }
  836. function deleteAccount() {
  837. return request({
  838. url: "/fulfiller/fulfiller/my/account",
  839. method: "DELETE"
  840. });
  841. }
  842. function updateAuthInfo(data) {
  843. return request({
  844. url: "/fulfiller/fulfiller/my/auth",
  845. method: "POST",
  846. data
  847. });
  848. }
  849. function getPendingOrders(params) {
  850. return request({
  851. url: "/order/subOrder/listPendingAccept",
  852. method: "GET",
  853. data: params
  854. });
  855. }
  856. function acceptOrder(orderId) {
  857. return request({
  858. url: "/order/subOrder/accept",
  859. method: "PUT",
  860. data: { orderId }
  861. });
  862. }
  863. function getOrderCount() {
  864. return request({
  865. url: "/order/subOrder/count",
  866. method: "GET"
  867. });
  868. }
  869. function getMyOrders(params) {
  870. return request({
  871. url: "/order/subOrder/listOnMyOrder",
  872. method: "GET",
  873. data: params
  874. });
  875. }
  876. function getOrderInfo(id) {
  877. return request({
  878. url: `/order/subOrder/getInfo?id=${id}`,
  879. method: "GET"
  880. });
  881. }
  882. function getOrderLogs(orderId) {
  883. return request({
  884. url: `/order/subOrderLog/list?orderId=${orderId}`,
  885. method: "GET"
  886. });
  887. }
  888. function clockIn(data) {
  889. return request({
  890. url: "/order/subOrder/clockIn",
  891. method: "PUT",
  892. data
  893. });
  894. }
  895. const logic$7 = {
  896. data() {
  897. return {
  898. formData: {
  899. mobile: "",
  900. code: "",
  901. name: "",
  902. gender: 1,
  903. // 1男 2女
  904. birthday: "",
  905. password: "",
  906. serviceType: [],
  907. city: "",
  908. station: "",
  909. stationId: null
  910. },
  911. showPwd: false,
  912. isAgreed: false,
  913. serviceTypes: ["宠物接送", "上门喂遛", "上门洗护"],
  914. // 验证码倒计时
  915. countDown: 0,
  916. timer: null,
  917. // 日期选择器相关
  918. showPicker: false,
  919. years: [],
  920. months: [],
  921. days: [],
  922. pickerValue: [0, 0, 0],
  923. tempYear: 0,
  924. tempMonth: 0,
  925. tempDay: 0,
  926. // 城市选择器相关(从后端加载)
  927. showCityPicker: false,
  928. selectStep: 0,
  929. selectedPathway: [],
  930. currentList: [],
  931. selectedCityId: null,
  932. // 站点选择器相关(从后端加载)
  933. showStationPicker: false,
  934. stationList: [],
  935. // 协议弹窗
  936. showPrivacy: false,
  937. privacyTitle: "",
  938. privacyContent: ""
  939. };
  940. },
  941. created() {
  942. this.initDateData();
  943. },
  944. beforeDestroy() {
  945. if (this.timer)
  946. clearInterval(this.timer);
  947. },
  948. methods: {
  949. initDateData() {
  950. const now = /* @__PURE__ */ new Date();
  951. const currentYear = now.getFullYear();
  952. for (let i = 1980; i <= currentYear + 5; i++) {
  953. this.years.push(i);
  954. }
  955. for (let i = 1; i <= 12; i++) {
  956. this.months.push(i);
  957. }
  958. for (let i = 1; i <= 31; i++) {
  959. this.days.push(i);
  960. }
  961. },
  962. // 打开选择器
  963. openPicker() {
  964. const dateStr = this.formData.birthday || "2000-01-01";
  965. const [y, m, d] = dateStr.split("-").map(Number);
  966. const yIndex = this.years.indexOf(y);
  967. const mIndex = this.months.indexOf(m);
  968. const dIndex = this.days.indexOf(d);
  969. this.pickerValue = [
  970. yIndex > -1 ? yIndex : 0,
  971. mIndex > -1 ? mIndex : 0,
  972. dIndex > -1 ? dIndex : 0
  973. ];
  974. this.tempYear = this.years[this.pickerValue[0]];
  975. this.tempMonth = this.months[this.pickerValue[1]];
  976. this.tempDay = this.days[this.pickerValue[2]];
  977. this.showPicker = true;
  978. },
  979. closePicker() {
  980. this.showPicker = false;
  981. },
  982. onPickerChange(e) {
  983. const val = e.detail.value;
  984. this.tempYear = this.years[val[0]];
  985. this.tempMonth = this.months[val[1]];
  986. this.tempDay = this.days[val[2]];
  987. },
  988. confirmPicker() {
  989. const mStr = this.tempMonth < 10 ? "0" + this.tempMonth : this.tempMonth;
  990. const dStr = this.tempDay < 10 ? "0" + this.tempDay : this.tempDay;
  991. this.formData.birthday = `${this.tempYear}-${mStr}-${dStr}`;
  992. this.closePicker();
  993. },
  994. toggleService(item) {
  995. const idx = this.formData.serviceType.indexOf(item);
  996. if (idx > -1) {
  997. this.formData.serviceType.splice(idx, 1);
  998. } else {
  999. this.formData.serviceType.push(item);
  1000. }
  1001. },
  1002. // 验证码
  1003. async getVerifyCode() {
  1004. if (this.countDown > 0)
  1005. return;
  1006. if (!this.formData.mobile || this.formData.mobile.length !== 11) {
  1007. uni.showToast({ title: "请输入正确的手机号", icon: "none" });
  1008. return;
  1009. }
  1010. try {
  1011. const res = await sendSmsCode(this.formData.mobile);
  1012. this.countDown = 60;
  1013. this.timer = setInterval(() => {
  1014. this.countDown--;
  1015. if (this.countDown <= 0)
  1016. clearInterval(this.timer);
  1017. }, 1e3);
  1018. const devCode = res.data;
  1019. if (devCode) {
  1020. this.formData.code = devCode;
  1021. uni.showToast({ title: "验证码: " + devCode, icon: "none", duration: 3e3 });
  1022. } else {
  1023. uni.showToast({ title: "验证码已发送", icon: "none" });
  1024. }
  1025. } catch (err) {
  1026. formatAppLog("error", "at pages/recruit/logic.js:154", "发送验证码失败:", err);
  1027. }
  1028. },
  1029. // 城市选择器 logic(从后端加载)
  1030. async openCityPicker() {
  1031. this.showCityPicker = true;
  1032. if (this.selectedPathway.length === 0) {
  1033. await this.resetCityPicker();
  1034. }
  1035. },
  1036. async resetCityPicker() {
  1037. this.selectStep = 0;
  1038. this.selectedPathway = [];
  1039. await this.loadAreaChildren(0);
  1040. },
  1041. closeCityPicker() {
  1042. this.showCityPicker = false;
  1043. },
  1044. async loadAreaChildren(parentId) {
  1045. try {
  1046. const res = await getAreaChildren(parentId);
  1047. this.currentList = (res.data || []).filter((item) => item.type !== 2).map((item) => ({
  1048. id: item.id,
  1049. name: item.name,
  1050. type: item.type,
  1051. parentId: item.parentId
  1052. }));
  1053. } catch (err) {
  1054. formatAppLog("error", "at pages/recruit/logic.js:186", "加载区域数据失败:", err);
  1055. this.currentList = [];
  1056. }
  1057. },
  1058. async selectCityItem(item) {
  1059. this.selectedPathway[this.selectStep] = item;
  1060. if (item.type === 0) {
  1061. this.selectStep++;
  1062. this.selectedPathway = this.selectedPathway.slice(0, this.selectStep);
  1063. await this.loadAreaChildren(item.id);
  1064. if (this.currentList.length === 0) {
  1065. this.selectedCityId = item.id;
  1066. this.confirmCity();
  1067. }
  1068. } else {
  1069. this.selectedCityId = item.id;
  1070. this.confirmCity();
  1071. }
  1072. },
  1073. async jumpToStep(step) {
  1074. this.selectStep = step;
  1075. if (step === 0) {
  1076. await this.loadAreaChildren(0);
  1077. } else {
  1078. const parent = this.selectedPathway[step - 1];
  1079. if (parent) {
  1080. await this.loadAreaChildren(parent.id);
  1081. }
  1082. }
  1083. },
  1084. confirmCity() {
  1085. const fullPath = this.selectedPathway.map((i) => i.name).join(" ");
  1086. this.formData.city = fullPath;
  1087. this.formData.station = "";
  1088. this.formData.stationId = null;
  1089. const lastSelected = this.selectedPathway[this.selectedPathway.length - 1];
  1090. if (lastSelected) {
  1091. this.loadStations(lastSelected.id);
  1092. }
  1093. this.closeCityPicker();
  1094. },
  1095. // 站点选择器(从后端加载,只取type=2的站点)
  1096. async loadStations(parentId) {
  1097. try {
  1098. const res = await getAreaChildren(parentId);
  1099. this.stationList = (res.data || []).filter((item) => item.type === 2).map((item) => ({
  1100. id: item.id,
  1101. name: item.name
  1102. }));
  1103. } catch (err) {
  1104. formatAppLog("error", "at pages/recruit/logic.js:245", "加载站点数据失败:", err);
  1105. this.stationList = [];
  1106. }
  1107. },
  1108. openStationPicker() {
  1109. if (this.stationList.length === 0) {
  1110. uni.showToast({ title: "请先选择工作城市", icon: "none" });
  1111. return;
  1112. }
  1113. this.showStationPicker = true;
  1114. },
  1115. closeStationPicker() {
  1116. this.showStationPicker = false;
  1117. },
  1118. selectStation(item) {
  1119. this.formData.station = item.name;
  1120. this.formData.stationId = item.id;
  1121. this.closeStationPicker();
  1122. },
  1123. openPrivacy() {
  1124. this.privacyTitle = "宠宝履约者说明";
  1125. this.privacyContent = "1. 履约职责\n作为宠宝履约者,您需要按照平台标准完成宠物接送、喂遛或洗护服务,确保宠物安全与健康。\n\n2. 结算方式\n服务费用将根据订单类型和距离计算,定期结算至您的账户。具体结算周期请查看钱包说明。\n\n3. 行为规范\n请在这个过程中保持专业,穿着整洁,礼貌待人。严禁虐待宠物,违反者将承担法律责任。";
  1126. this.showPrivacy = true;
  1127. },
  1128. goToAuth() {
  1129. if (!this.isAgreed) {
  1130. uni.showToast({ title: "请勾选协议", icon: "none" });
  1131. return;
  1132. }
  1133. if (!this.formData.mobile || this.formData.mobile.length !== 11) {
  1134. uni.showToast({ title: "请输入正确的手机号", icon: "none" });
  1135. return;
  1136. }
  1137. if (!this.formData.name) {
  1138. uni.showToast({ title: "请输入姓名", icon: "none" });
  1139. return;
  1140. }
  1141. if (this.formData.serviceType.length === 0) {
  1142. uni.showToast({ title: "请选择服务类型", icon: "none" });
  1143. return;
  1144. }
  1145. uni.setStorageSync("recruit_form_data", JSON.stringify(this.formData));
  1146. const services = JSON.stringify(this.formData.serviceType);
  1147. uni.navigateTo({
  1148. url: `/pages/recruit/auth?services=${services}`
  1149. });
  1150. }
  1151. }
  1152. };
  1153. const _sfc_main$z = {
  1154. ...logic$7,
  1155. components: {
  1156. PrivacyPopup: __easycom_0
  1157. }
  1158. };
  1159. function _sfc_render$y(_ctx, _cache, $props, $setup, $data, $options) {
  1160. const _component_privacy_popup = resolveEasycom(vue.resolveDynamicComponent("privacy-popup"), __easycom_0);
  1161. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  1162. vue.createElementVNode("view", { class: "card" }, [
  1163. vue.createElementVNode("view", { class: "form-item" }, [
  1164. vue.createElementVNode("text", { class: "label" }, "手机号"),
  1165. vue.createElementVNode("view", { class: "input-box" }, [
  1166. vue.createElementVNode("view", { class: "prefix-area" }, [
  1167. vue.createElementVNode("text", { class: "prefix" }, "+86"),
  1168. vue.createElementVNode("text", { class: "arrow-down" }, "﹀")
  1169. ]),
  1170. vue.withDirectives(vue.createElementVNode(
  1171. "input",
  1172. {
  1173. class: "input",
  1174. type: "number",
  1175. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.formData.mobile = $event)
  1176. },
  1177. null,
  1178. 512
  1179. /* NEED_PATCH */
  1180. ), [
  1181. [vue.vModelText, _ctx.formData.mobile]
  1182. ])
  1183. ])
  1184. ]),
  1185. vue.createElementVNode("view", { class: "form-item" }, [
  1186. vue.createElementVNode("text", { class: "label" }, "验证码"),
  1187. vue.createElementVNode("view", { class: "input-box" }, [
  1188. vue.withDirectives(vue.createElementVNode(
  1189. "input",
  1190. {
  1191. class: "input",
  1192. type: "number",
  1193. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.formData.code = $event),
  1194. placeholder: "验证码"
  1195. },
  1196. null,
  1197. 512
  1198. /* NEED_PATCH */
  1199. ), [
  1200. [vue.vModelText, _ctx.formData.code]
  1201. ]),
  1202. vue.createElementVNode(
  1203. "text",
  1204. {
  1205. class: "get-code-text",
  1206. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.getVerifyCode && _ctx.getVerifyCode(...args))
  1207. },
  1208. vue.toDisplayString(_ctx.countDown > 0 ? _ctx.countDown + "s" : "获取验证码"),
  1209. 1
  1210. /* TEXT */
  1211. )
  1212. ])
  1213. ]),
  1214. vue.createElementVNode("view", { class: "form-item" }, [
  1215. vue.createElementVNode("text", { class: "label" }, "姓名"),
  1216. vue.createElementVNode("view", { class: "input-box" }, [
  1217. vue.withDirectives(vue.createElementVNode(
  1218. "input",
  1219. {
  1220. class: "input",
  1221. type: "text",
  1222. "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.formData.name = $event)
  1223. },
  1224. null,
  1225. 512
  1226. /* NEED_PATCH */
  1227. ), [
  1228. [vue.vModelText, _ctx.formData.name]
  1229. ])
  1230. ])
  1231. ]),
  1232. vue.createElementVNode("view", { class: "form-item" }, [
  1233. vue.createElementVNode("text", { class: "label" }, "性别"),
  1234. vue.createElementVNode("view", { class: "gender-group" }, [
  1235. vue.createElementVNode("view", {
  1236. class: "radio-item",
  1237. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.formData.gender = 1)
  1238. }, [
  1239. vue.createElementVNode(
  1240. "text",
  1241. {
  1242. class: vue.normalizeClass(["radio-icon", { active: _ctx.formData.gender === 1 }])
  1243. },
  1244. vue.toDisplayString(_ctx.formData.gender === 1 ? "♂" : "○"),
  1245. 3
  1246. /* TEXT, CLASS */
  1247. ),
  1248. vue.createElementVNode(
  1249. "text",
  1250. {
  1251. class: vue.normalizeClass(["radio-label", { active: _ctx.formData.gender === 1 }])
  1252. },
  1253. " 男",
  1254. 2
  1255. /* CLASS */
  1256. )
  1257. ]),
  1258. vue.createElementVNode("view", {
  1259. class: "radio-item",
  1260. onClick: _cache[5] || (_cache[5] = ($event) => _ctx.formData.gender = 2)
  1261. }, [
  1262. vue.createElementVNode(
  1263. "text",
  1264. {
  1265. class: vue.normalizeClass(["radio-icon", { active: _ctx.formData.gender === 2 }])
  1266. },
  1267. vue.toDisplayString(_ctx.formData.gender === 2 ? "♀" : "○"),
  1268. 3
  1269. /* TEXT, CLASS */
  1270. ),
  1271. vue.createElementVNode(
  1272. "text",
  1273. {
  1274. class: vue.normalizeClass(["radio-label", { active: _ctx.formData.gender === 2 }])
  1275. },
  1276. " 女",
  1277. 2
  1278. /* CLASS */
  1279. )
  1280. ])
  1281. ])
  1282. ]),
  1283. vue.createElementVNode("view", { class: "form-item" }, [
  1284. vue.createElementVNode("text", { class: "label" }, "生日"),
  1285. vue.createElementVNode("view", {
  1286. class: "input-box",
  1287. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.openPicker && _ctx.openPicker(...args))
  1288. }, [
  1289. vue.createElementVNode(
  1290. "text",
  1291. null,
  1292. vue.toDisplayString(_ctx.formData.birthday || "请选择生日"),
  1293. 1
  1294. /* TEXT */
  1295. ),
  1296. (vue.openBlock(), vue.createElementBlock("svg", {
  1297. class: "arrow-right",
  1298. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1299. viewBox: "0 0 1024 1024",
  1300. version: "1.1",
  1301. xmlns: "http://www.w3.org/2000/svg"
  1302. }, [
  1303. vue.createElementVNode("path", {
  1304. 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",
  1305. fill: "#CCCCCC"
  1306. })
  1307. ]))
  1308. ])
  1309. ]),
  1310. vue.createElementVNode("view", { class: "form-item" }, [
  1311. vue.createElementVNode("text", { class: "label" }, "密码"),
  1312. vue.createElementVNode("view", { class: "input-box" }, [
  1313. vue.withDirectives(vue.createElementVNode("input", {
  1314. class: "input",
  1315. password: !_ctx.showPwd,
  1316. "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => _ctx.formData.password = $event),
  1317. placeholder: "设置登录密码"
  1318. }, null, 8, ["password"]), [
  1319. [vue.vModelText, _ctx.formData.password]
  1320. ]),
  1321. vue.createElementVNode("view", {
  1322. class: "monkey-icon",
  1323. onClick: _cache[8] || (_cache[8] = ($event) => _ctx.showPwd = !_ctx.showPwd)
  1324. }, [
  1325. _ctx.showPwd ? (vue.openBlock(), vue.createElementBlock("svg", {
  1326. key: 0,
  1327. class: "svg-icon",
  1328. viewBox: "0 0 24 24",
  1329. fill: "none",
  1330. xmlns: "http://www.w3.org/2000/svg"
  1331. }, [
  1332. vue.createElementVNode("path", {
  1333. 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",
  1334. fill: "#CCCCCC"
  1335. })
  1336. ])) : (vue.openBlock(), vue.createElementBlock("svg", {
  1337. key: 1,
  1338. class: "svg-icon",
  1339. viewBox: "0 0 24 24",
  1340. fill: "none",
  1341. xmlns: "http://www.w3.org/2000/svg"
  1342. }, [
  1343. vue.createElementVNode("path", {
  1344. d: "M12 7C7 7 2.73 10.11 1 14.5",
  1345. stroke: "#CCCCCC",
  1346. "stroke-width": "2",
  1347. "stroke-linecap": "round"
  1348. }),
  1349. vue.createElementVNode("path", {
  1350. d: "M23 14.5C21.27 10.11 17 7 12 7",
  1351. stroke: "#CCCCCC",
  1352. "stroke-width": "2",
  1353. "stroke-linecap": "round"
  1354. }),
  1355. vue.createElementVNode("path", {
  1356. d: "M12 7V4",
  1357. stroke: "#CCCCCC",
  1358. "stroke-width": "2",
  1359. "stroke-linecap": "round"
  1360. }),
  1361. vue.createElementVNode("path", {
  1362. d: "M16 8L18 5",
  1363. stroke: "#CCCCCC",
  1364. "stroke-width": "2",
  1365. "stroke-linecap": "round"
  1366. }),
  1367. vue.createElementVNode("path", {
  1368. d: "M8 8L6 5",
  1369. stroke: "#CCCCCC",
  1370. "stroke-width": "2",
  1371. "stroke-linecap": "round"
  1372. }),
  1373. vue.createElementVNode("path", {
  1374. d: "M20 10L22 8",
  1375. stroke: "#CCCCCC",
  1376. "stroke-width": "2",
  1377. "stroke-linecap": "round"
  1378. }),
  1379. vue.createElementVNode("path", {
  1380. d: "M4 10L2 8",
  1381. stroke: "#CCCCCC",
  1382. "stroke-width": "2",
  1383. "stroke-linecap": "round"
  1384. })
  1385. ]))
  1386. ])
  1387. ])
  1388. ])
  1389. ]),
  1390. vue.createElementVNode("view", { class: "card" }, [
  1391. vue.createElementVNode("view", { class: "section-title" }, "服务类型"),
  1392. vue.createElementVNode("view", { class: "service-types" }, [
  1393. (vue.openBlock(true), vue.createElementBlock(
  1394. vue.Fragment,
  1395. null,
  1396. vue.renderList(_ctx.serviceTypes, (item, index) => {
  1397. return vue.openBlock(), vue.createElementBlock("view", {
  1398. class: vue.normalizeClass(["type-btn", { selected: _ctx.formData.serviceType.includes(item) }]),
  1399. key: index,
  1400. onClick: ($event) => _ctx.toggleService(item)
  1401. }, vue.toDisplayString(item), 11, ["onClick"]);
  1402. }),
  1403. 128
  1404. /* KEYED_FRAGMENT */
  1405. ))
  1406. ]),
  1407. vue.createElementVNode("view", { class: "form-item" }, [
  1408. vue.createElementVNode("text", { class: "label" }, "工作城市"),
  1409. vue.createElementVNode("view", {
  1410. class: "input-box",
  1411. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.openCityPicker && _ctx.openCityPicker(...args))
  1412. }, [
  1413. vue.createElementVNode(
  1414. "text",
  1415. {
  1416. style: vue.normalizeStyle({ color: _ctx.formData.city ? "#333" : "#ccc" })
  1417. },
  1418. vue.toDisplayString(_ctx.formData.city || "请选择工作城市"),
  1419. 5
  1420. /* TEXT, STYLE */
  1421. ),
  1422. (vue.openBlock(), vue.createElementBlock("svg", {
  1423. class: "arrow-right",
  1424. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1425. viewBox: "0 0 1024 1024",
  1426. version: "1.1",
  1427. xmlns: "http://www.w3.org/2000/svg"
  1428. }, [
  1429. vue.createElementVNode("path", {
  1430. 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",
  1431. fill: "#CCCCCC"
  1432. })
  1433. ]))
  1434. ])
  1435. ]),
  1436. vue.createElementVNode("view", { class: "form-item" }, [
  1437. vue.createElementVNode("text", { class: "label" }, "服务站点"),
  1438. vue.createElementVNode("view", {
  1439. class: "input-box",
  1440. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.openStationPicker && _ctx.openStationPicker(...args))
  1441. }, [
  1442. vue.createElementVNode(
  1443. "text",
  1444. {
  1445. style: vue.normalizeStyle({ color: _ctx.formData.station ? "#333" : "#ccc" })
  1446. },
  1447. vue.toDisplayString(_ctx.formData.station || "请选择服务站点"),
  1448. 5
  1449. /* TEXT, STYLE */
  1450. ),
  1451. (vue.openBlock(), vue.createElementBlock("svg", {
  1452. class: "arrow-right",
  1453. style: { "width": "24rpx", "height": "24rpx", "margin-left": "auto" },
  1454. viewBox: "0 0 1024 1024",
  1455. version: "1.1",
  1456. xmlns: "http://www.w3.org/2000/svg"
  1457. }, [
  1458. vue.createElementVNode("path", {
  1459. 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",
  1460. fill: "#CCCCCC"
  1461. })
  1462. ]))
  1463. ])
  1464. ])
  1465. ]),
  1466. vue.createElementVNode(
  1467. "view",
  1468. {
  1469. class: vue.normalizeClass(["picker-mask", { show: _ctx.showCityPicker }]),
  1470. onClick: _cache[14] || (_cache[14] = (...args) => _ctx.closeCityPicker && _ctx.closeCityPicker(...args))
  1471. },
  1472. [
  1473. vue.createElementVNode("view", {
  1474. class: "picker-content",
  1475. onClick: _cache[13] || (_cache[13] = vue.withModifiers(() => {
  1476. }, ["stop"]))
  1477. }, [
  1478. vue.createElementVNode("view", { class: "picker-header" }, [
  1479. vue.createElementVNode("text", {
  1480. class: "picker-btn-cancel",
  1481. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.closeCityPicker && _ctx.closeCityPicker(...args))
  1482. }, "取消"),
  1483. vue.createElementVNode("text", { class: "picker-title" }, "请选择工作城市"),
  1484. vue.createElementVNode("text", {
  1485. class: "picker-btn-confirm",
  1486. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.confirmCity && _ctx.confirmCity(...args))
  1487. }, "确定")
  1488. ]),
  1489. vue.createElementVNode("view", { class: "picker-body" }, [
  1490. vue.createElementVNode("view", { class: "timeline-area" }, [
  1491. (vue.openBlock(true), vue.createElementBlock(
  1492. vue.Fragment,
  1493. null,
  1494. vue.renderList(_ctx.selectedPathway, (item, index) => {
  1495. return vue.openBlock(), vue.createElementBlock("view", {
  1496. class: "timeline-item",
  1497. key: index,
  1498. onClick: ($event) => _ctx.jumpToStep(index)
  1499. }, [
  1500. vue.createElementVNode("view", { class: "timeline-dot" }),
  1501. vue.createElementVNode(
  1502. "text",
  1503. null,
  1504. vue.toDisplayString(item.name),
  1505. 1
  1506. /* TEXT */
  1507. )
  1508. ], 8, ["onClick"]);
  1509. }),
  1510. 128
  1511. /* KEYED_FRAGMENT */
  1512. )),
  1513. _ctx.selectStep === _ctx.selectedPathway.length ? (vue.openBlock(), vue.createElementBlock("view", {
  1514. key: 0,
  1515. class: "timeline-item active"
  1516. }, [
  1517. vue.createElementVNode("view", { class: "timeline-dot" }),
  1518. vue.createElementVNode("text", null, "请选择")
  1519. ])) : vue.createCommentVNode("v-if", true)
  1520. ]),
  1521. vue.createElementVNode("scroll-view", {
  1522. "scroll-y": "",
  1523. class: "list-area"
  1524. }, [
  1525. (vue.openBlock(true), vue.createElementBlock(
  1526. vue.Fragment,
  1527. null,
  1528. vue.renderList(_ctx.currentList, (item, index) => {
  1529. return vue.openBlock(), vue.createElementBlock("view", {
  1530. class: "list-item",
  1531. key: item.id,
  1532. onClick: ($event) => _ctx.selectCityItem(item)
  1533. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  1534. }),
  1535. 128
  1536. /* KEYED_FRAGMENT */
  1537. )),
  1538. _ctx.currentList.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  1539. key: 0,
  1540. style: { "padding": "20rpx", "color": "#999" }
  1541. }, " 无数据 ")) : vue.createCommentVNode("v-if", true)
  1542. ])
  1543. ])
  1544. ])
  1545. ],
  1546. 2
  1547. /* CLASS */
  1548. ),
  1549. vue.createElementVNode(
  1550. "view",
  1551. {
  1552. class: vue.normalizeClass(["picker-mask", { show: _ctx.showStationPicker }]),
  1553. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.closeStationPicker && _ctx.closeStationPicker(...args))
  1554. },
  1555. [
  1556. vue.createElementVNode("view", {
  1557. class: "picker-content",
  1558. onClick: _cache[16] || (_cache[16] = vue.withModifiers(() => {
  1559. }, ["stop"]))
  1560. }, [
  1561. vue.createElementVNode("view", {
  1562. class: "picker-header",
  1563. style: { "justify-content": "center", "position": "relative" }
  1564. }, [
  1565. vue.createElementVNode("text", {
  1566. class: "picker-btn-cancel",
  1567. style: { "position": "absolute", "left": "30rpx" },
  1568. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.closeStationPicker && _ctx.closeStationPicker(...args))
  1569. }, "取消"),
  1570. vue.createElementVNode("text", { class: "picker-title" }, "选择服务站点")
  1571. ]),
  1572. vue.createElementVNode("scroll-view", {
  1573. "scroll-y": "",
  1574. class: "picker-list"
  1575. }, [
  1576. (vue.openBlock(true), vue.createElementBlock(
  1577. vue.Fragment,
  1578. null,
  1579. vue.renderList(_ctx.stationList, (item, index) => {
  1580. return vue.openBlock(), vue.createElementBlock("view", {
  1581. class: "station-item",
  1582. key: index,
  1583. onClick: ($event) => _ctx.selectStation(item)
  1584. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  1585. }),
  1586. 128
  1587. /* KEYED_FRAGMENT */
  1588. ))
  1589. ])
  1590. ])
  1591. ],
  1592. 2
  1593. /* CLASS */
  1594. ),
  1595. vue.createElementVNode("view", { class: "footer-actions" }, [
  1596. vue.createElementVNode("view", { class: "agreement-row" }, [
  1597. vue.createElementVNode(
  1598. "view",
  1599. {
  1600. class: vue.normalizeClass(["checkbox", { checked: _ctx.isAgreed }]),
  1601. onClick: _cache[18] || (_cache[18] = ($event) => _ctx.isAgreed = !_ctx.isAgreed)
  1602. },
  1603. [
  1604. _ctx.isAgreed ? (vue.openBlock(), vue.createElementBlock("text", {
  1605. key: 0,
  1606. class: "check-mark"
  1607. }, "✓")) : vue.createCommentVNode("v-if", true)
  1608. ],
  1609. 2
  1610. /* CLASS */
  1611. ),
  1612. vue.createElementVNode("text", { class: "agree-text" }, [
  1613. vue.createTextVNode("我已阅读并同意 "),
  1614. vue.createElementVNode("text", {
  1615. style: { "color": "#2979ff" },
  1616. onClick: _cache[19] || (_cache[19] = vue.withModifiers((...args) => _ctx.openPrivacy && _ctx.openPrivacy(...args), ["stop"]))
  1617. }, "《宠宝履约者说明》")
  1618. ])
  1619. ]),
  1620. vue.createElementVNode("view", { class: "footer-btn-area" }, [
  1621. vue.createElementVNode("button", {
  1622. class: "submit-btn",
  1623. onClick: _cache[20] || (_cache[20] = (...args) => _ctx.goToAuth && _ctx.goToAuth(...args))
  1624. }, "下一步,实名认证")
  1625. ])
  1626. ]),
  1627. vue.createElementVNode(
  1628. "view",
  1629. {
  1630. class: vue.normalizeClass(["picker-mask", { show: _ctx.showPicker }]),
  1631. onClick: _cache[25] || (_cache[25] = (...args) => _ctx.closePicker && _ctx.closePicker(...args))
  1632. },
  1633. [
  1634. vue.createElementVNode("view", {
  1635. class: "picker-content",
  1636. onClick: _cache[24] || (_cache[24] = vue.withModifiers(() => {
  1637. }, ["stop"]))
  1638. }, [
  1639. vue.createElementVNode("view", { class: "picker-header" }, [
  1640. vue.createElementVNode("text", {
  1641. class: "picker-btn-cancel",
  1642. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.closePicker && _ctx.closePicker(...args))
  1643. }, "取消"),
  1644. vue.createElementVNode("text", { class: "picker-title" }, "选择出生日期"),
  1645. vue.createElementVNode("text", {
  1646. class: "picker-btn-confirm",
  1647. onClick: _cache[22] || (_cache[22] = (...args) => _ctx.confirmPicker && _ctx.confirmPicker(...args))
  1648. }, "确定")
  1649. ]),
  1650. vue.createElementVNode("picker-view", {
  1651. class: "picker-view",
  1652. "indicator-style": "height: 50px;",
  1653. value: _ctx.pickerValue,
  1654. onChange: _cache[23] || (_cache[23] = (...args) => _ctx.onPickerChange && _ctx.onPickerChange(...args))
  1655. }, [
  1656. vue.createElementVNode("picker-view-column", null, [
  1657. (vue.openBlock(true), vue.createElementBlock(
  1658. vue.Fragment,
  1659. null,
  1660. vue.renderList(_ctx.years, (item, index) => {
  1661. return vue.openBlock(), vue.createElementBlock(
  1662. "view",
  1663. {
  1664. class: "picker-item",
  1665. key: index
  1666. },
  1667. vue.toDisplayString(item) + "年",
  1668. 1
  1669. /* TEXT */
  1670. );
  1671. }),
  1672. 128
  1673. /* KEYED_FRAGMENT */
  1674. ))
  1675. ]),
  1676. vue.createElementVNode("picker-view-column", null, [
  1677. (vue.openBlock(true), vue.createElementBlock(
  1678. vue.Fragment,
  1679. null,
  1680. vue.renderList(_ctx.months, (item, index) => {
  1681. return vue.openBlock(), vue.createElementBlock(
  1682. "view",
  1683. {
  1684. class: "picker-item",
  1685. key: index
  1686. },
  1687. vue.toDisplayString(item) + "月",
  1688. 1
  1689. /* TEXT */
  1690. );
  1691. }),
  1692. 128
  1693. /* KEYED_FRAGMENT */
  1694. ))
  1695. ]),
  1696. vue.createElementVNode("picker-view-column", null, [
  1697. (vue.openBlock(true), vue.createElementBlock(
  1698. vue.Fragment,
  1699. null,
  1700. vue.renderList(_ctx.days, (item, index) => {
  1701. return vue.openBlock(), vue.createElementBlock(
  1702. "view",
  1703. {
  1704. class: "picker-item",
  1705. key: index
  1706. },
  1707. vue.toDisplayString(item) + "日",
  1708. 1
  1709. /* TEXT */
  1710. );
  1711. }),
  1712. 128
  1713. /* KEYED_FRAGMENT */
  1714. ))
  1715. ])
  1716. ], 40, ["value"])
  1717. ])
  1718. ],
  1719. 2
  1720. /* CLASS */
  1721. ),
  1722. vue.createVNode(_component_privacy_popup, {
  1723. visible: _ctx.showPrivacy,
  1724. title: _ctx.privacyTitle,
  1725. content: _ctx.privacyContent,
  1726. onClose: _cache[26] || (_cache[26] = ($event) => _ctx.showPrivacy = false)
  1727. }, null, 8, ["visible", "title", "content"])
  1728. ]);
  1729. }
  1730. const PagesRecruitForm = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["render", _sfc_render$y], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/form.vue"]]);
  1731. const logic$6 = {
  1732. data() {
  1733. return {
  1734. formData: {
  1735. idType: "居民身份证",
  1736. name: "",
  1737. idNumber: "",
  1738. expiryDate: ""
  1739. },
  1740. idCardFront: "",
  1741. // 身份证正面本地预览路径
  1742. idCardBack: "",
  1743. // 身份证反面本地预览路径
  1744. idCardFrontOssId: "",
  1745. // 身份证正面 OSS ID
  1746. idCardBackOssId: "",
  1747. // 身份证反面 OSS ID
  1748. showDatePicker: false,
  1749. pickerValue: [0, 0, 0],
  1750. // YYYY-MM-DD
  1751. years: [],
  1752. months: [],
  1753. days: [],
  1754. serviceType: []
  1755. // 接收上一页的服务类型
  1756. };
  1757. },
  1758. onLoad(options) {
  1759. if (options.services) {
  1760. try {
  1761. this.serviceType = JSON.parse(options.services);
  1762. } catch (e) {
  1763. formatAppLog("error", "at pages/recruit/auth_logic.js:29", "Parse services failed", e);
  1764. }
  1765. }
  1766. this.initDateData();
  1767. this.restoreAuthData();
  1768. },
  1769. methods: {
  1770. // --- 日期选择器逻辑 (简化版, 仅示意) ---
  1771. initDateData() {
  1772. const date = /* @__PURE__ */ new Date();
  1773. const year = date.getFullYear();
  1774. for (let i = year; i <= year + 20; i++) {
  1775. this.years.push(i);
  1776. }
  1777. for (let i = 1; i <= 12; i++) {
  1778. this.months.push(i);
  1779. }
  1780. for (let i = 1; i <= 31; i++) {
  1781. this.days.push(i);
  1782. }
  1783. },
  1784. openDatePicker() {
  1785. },
  1786. onDateChange(e) {
  1787. this.formData.expiryDate = e.detail.value;
  1788. },
  1789. // --- 数据持久化(防止返回上一级丢失) ---
  1790. restoreAuthData() {
  1791. try {
  1792. const saved = uni.getStorageSync("recruit_auth_data");
  1793. if (saved) {
  1794. const d = JSON.parse(saved);
  1795. this.formData.name = d.name || "";
  1796. this.formData.idNumber = d.idNumber || "";
  1797. this.formData.expiryDate = d.expiryDate || "";
  1798. this.idCardFront = d.idCardFront || "";
  1799. this.idCardBack = d.idCardBack || "";
  1800. this.idCardFrontOssId = d.idCardFrontOssId || "";
  1801. this.idCardBackOssId = d.idCardBackOssId || "";
  1802. }
  1803. } catch (e) {
  1804. formatAppLog("error", "at pages/recruit/auth_logic.js:76", "恢复认证数据失败", e);
  1805. }
  1806. },
  1807. saveAuthData() {
  1808. try {
  1809. uni.setStorageSync("recruit_auth_data", JSON.stringify({
  1810. name: this.formData.name,
  1811. idNumber: this.formData.idNumber,
  1812. expiryDate: this.formData.expiryDate,
  1813. idCardFront: this.idCardFront,
  1814. idCardBack: this.idCardBack,
  1815. idCardFrontOssId: this.idCardFrontOssId,
  1816. idCardBackOssId: this.idCardBackOssId
  1817. }));
  1818. } catch (e) {
  1819. formatAppLog("error", "at pages/recruit/auth_logic.js:91", "保存认证数据失败", e);
  1820. }
  1821. },
  1822. // --- 图片上传(选择后自动上传到OSS) ---
  1823. chooseImage(side) {
  1824. uni.chooseImage({
  1825. count: 1,
  1826. sizeType: ["compressed"],
  1827. sourceType: ["album", "camera"],
  1828. success: async (res) => {
  1829. const tempPath = res.tempFilePaths[0];
  1830. if (side === "front") {
  1831. this.idCardFront = tempPath;
  1832. } else {
  1833. this.idCardBack = tempPath;
  1834. }
  1835. try {
  1836. uni.showLoading({ title: "上传中..." });
  1837. const uploadRes = await uploadFile(tempPath);
  1838. if (side === "front") {
  1839. this.idCardFrontOssId = uploadRes.data.ossId;
  1840. } else {
  1841. this.idCardBackOssId = uploadRes.data.ossId;
  1842. }
  1843. uni.hideLoading();
  1844. this.saveAuthData();
  1845. } catch (err) {
  1846. uni.hideLoading();
  1847. formatAppLog("error", "at pages/recruit/auth_logic.js:121", "上传身份证图片失败:", err);
  1848. }
  1849. }
  1850. });
  1851. },
  1852. // --- 提交 ---
  1853. goToQualifications() {
  1854. this.saveAuthData();
  1855. try {
  1856. const stored = uni.getStorageSync("recruit_form_data");
  1857. if (stored) {
  1858. const data = JSON.parse(stored);
  1859. data.realName = this.formData.name;
  1860. data.idNumber = this.formData.idNumber;
  1861. data.expiryDate = this.formData.expiryDate;
  1862. data.idCardFrontOssId = this.idCardFrontOssId;
  1863. data.idCardBackOssId = this.idCardBackOssId;
  1864. uni.setStorageSync("recruit_form_data", JSON.stringify(data));
  1865. }
  1866. } catch (e) {
  1867. formatAppLog("error", "at pages/recruit/auth_logic.js:158", "保存认证数据失败", e);
  1868. }
  1869. const services = JSON.stringify(this.serviceType);
  1870. uni.navigateTo({
  1871. url: `/pages/recruit/qualifications?services=${services}`
  1872. });
  1873. }
  1874. }
  1875. };
  1876. const _sfc_main$y = logic$6;
  1877. function _sfc_render$x(_ctx, _cache, $props, $setup, $data, $options) {
  1878. return vue.openBlock(), vue.createElementBlock("view", { class: "auth-container" }, [
  1879. vue.createElementVNode("view", { class: "top-tip" }, "请确保身份信息的准确,以免影响后续履约费用结算。"),
  1880. vue.createElementVNode("view", { class: "form-card" }, [
  1881. vue.createElementVNode("view", { class: "form-item" }, [
  1882. vue.createElementVNode("text", { class: "label" }, "证件类型"),
  1883. vue.createElementVNode("view", { class: "read-only-text" }, "居民身份证")
  1884. ]),
  1885. vue.createElementVNode("view", { class: "form-item" }, [
  1886. vue.createElementVNode("text", { class: "label" }, "真实姓名"),
  1887. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1888. vue.withDirectives(vue.createElementVNode(
  1889. "input",
  1890. {
  1891. class: "input-area",
  1892. type: "text",
  1893. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.formData.name = $event),
  1894. placeholder: "证件姓名",
  1895. "placeholder-class": "input-placeholder"
  1896. },
  1897. null,
  1898. 512
  1899. /* NEED_PATCH */
  1900. ), [
  1901. [vue.vModelText, _ctx.formData.name]
  1902. ])
  1903. ])
  1904. ]),
  1905. vue.createElementVNode("view", { class: "form-item" }, [
  1906. vue.createElementVNode("text", { class: "label" }, "证件号码"),
  1907. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1908. vue.withDirectives(vue.createElementVNode(
  1909. "input",
  1910. {
  1911. class: "input-area",
  1912. type: "idcard",
  1913. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.formData.idNumber = $event),
  1914. placeholder: "身份证号",
  1915. "placeholder-class": "input-placeholder"
  1916. },
  1917. null,
  1918. 512
  1919. /* NEED_PATCH */
  1920. ), [
  1921. [vue.vModelText, _ctx.formData.idNumber]
  1922. ])
  1923. ])
  1924. ]),
  1925. vue.createElementVNode("view", { class: "form-item" }, [
  1926. vue.createElementVNode("text", { class: "label" }, "有效日期"),
  1927. vue.createElementVNode("view", { class: "gray-input-box" }, [
  1928. vue.createElementVNode(
  1929. "picker",
  1930. {
  1931. mode: "date",
  1932. onChange: _cache[2] || (_cache[2] = (...args) => _ctx.onDateChange && _ctx.onDateChange(...args)),
  1933. style: { "width": "100%" }
  1934. },
  1935. [
  1936. vue.createElementVNode(
  1937. "view",
  1938. {
  1939. class: vue.normalizeClass(["input-area", { "input-placeholder": !_ctx.formData.expiryDate }])
  1940. },
  1941. vue.toDisplayString(_ctx.formData.expiryDate || "选择有效结束期限"),
  1942. 3
  1943. /* TEXT, CLASS */
  1944. )
  1945. ],
  1946. 32
  1947. /* NEED_HYDRATION */
  1948. ),
  1949. (vue.openBlock(), vue.createElementBlock("svg", {
  1950. class: "arrow-right",
  1951. viewBox: "0 0 1024 1024",
  1952. version: "1.1",
  1953. xmlns: "http://www.w3.org/2000/svg"
  1954. }, [
  1955. vue.createElementVNode("path", {
  1956. 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",
  1957. fill: "#CCCCCC"
  1958. })
  1959. ]))
  1960. ])
  1961. ])
  1962. ]),
  1963. vue.createElementVNode("view", { class: "upload-card" }, [
  1964. vue.createElementVNode("view", {
  1965. class: "upload-box",
  1966. onClick: _cache[3] || (_cache[3] = ($event) => _ctx.chooseImage("front"))
  1967. }, [
  1968. _ctx.idCardFront ? (vue.openBlock(), vue.createElementBlock("image", {
  1969. key: 0,
  1970. src: _ctx.idCardFront,
  1971. class: "preview-img",
  1972. mode: "aspectFill"
  1973. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  1974. vue.Fragment,
  1975. { key: 1 },
  1976. [
  1977. (vue.openBlock(), vue.createElementBlock("svg", {
  1978. class: "camera-icon",
  1979. viewBox: "0 0 24 24",
  1980. fill: "none",
  1981. xmlns: "http://www.w3.org/2000/svg"
  1982. }, [
  1983. vue.createElementVNode("path", {
  1984. 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",
  1985. fill: "#E0E0E0"
  1986. }),
  1987. vue.createElementVNode("circle", {
  1988. cx: "12",
  1989. cy: "12",
  1990. r: "3",
  1991. stroke: "#CCCCCC",
  1992. "stroke-width": "2"
  1993. }),
  1994. vue.createElementVNode("path", {
  1995. 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",
  1996. fill: "#CCCCCC"
  1997. })
  1998. ])),
  1999. vue.createElementVNode("text", { class: "upload-text" }, "点击上传")
  2000. ],
  2001. 64
  2002. /* STABLE_FRAGMENT */
  2003. ))
  2004. ]),
  2005. vue.createElementVNode("text", { class: "card-label" }, "证件带照片面")
  2006. ]),
  2007. vue.createElementVNode("view", { class: "upload-card" }, [
  2008. vue.createElementVNode("view", {
  2009. class: "upload-box",
  2010. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.chooseImage("back"))
  2011. }, [
  2012. _ctx.idCardBack ? (vue.openBlock(), vue.createElementBlock("image", {
  2013. key: 0,
  2014. src: _ctx.idCardBack,
  2015. class: "preview-img",
  2016. mode: "aspectFill"
  2017. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  2018. vue.Fragment,
  2019. { key: 1 },
  2020. [
  2021. (vue.openBlock(), vue.createElementBlock("svg", {
  2022. class: "camera-icon",
  2023. viewBox: "0 0 24 24",
  2024. fill: "none",
  2025. xmlns: "http://www.w3.org/2000/svg"
  2026. }, [
  2027. vue.createElementVNode("path", {
  2028. 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",
  2029. fill: "#CCCCCC"
  2030. })
  2031. ])),
  2032. vue.createElementVNode("text", { class: "upload-text" }, "点击上传")
  2033. ],
  2034. 64
  2035. /* STABLE_FRAGMENT */
  2036. ))
  2037. ]),
  2038. vue.createElementVNode("text", { class: "card-label" }, "证件国徽面")
  2039. ]),
  2040. vue.createElementVNode("view", { class: "footer-btn-area" }, [
  2041. vue.createElementVNode("button", {
  2042. class: "next-btn",
  2043. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.goToQualifications && _ctx.goToQualifications(...args))
  2044. }, "下一步,完善资质")
  2045. ])
  2046. ]);
  2047. }
  2048. const PagesRecruitAuth = /* @__PURE__ */ _export_sfc(_sfc_main$y, [["render", _sfc_render$x], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/auth.vue"]]);
  2049. const logic$5 = {
  2050. data() {
  2051. return {
  2052. serviceTypes: [],
  2053. // 从上一页传递过来的服务类型列表
  2054. qualifications: {},
  2055. // 存储本地预览路径 { '宠物接送': ['path1', ...], ... }
  2056. qualOssIds: {}
  2057. // 存储OSS ID { '宠物接送': ['id1', ...], ... }
  2058. };
  2059. },
  2060. onLoad(options) {
  2061. if (options.services) {
  2062. try {
  2063. this.serviceTypes = JSON.parse(options.services);
  2064. this.serviceTypes.forEach((type) => {
  2065. this.qualifications[type] = [];
  2066. this.qualOssIds[type] = [];
  2067. });
  2068. } catch (e) {
  2069. formatAppLog("error", "at pages/recruit/qualifications_logic.js:21", "Parse services failed", e);
  2070. }
  2071. }
  2072. },
  2073. methods: {
  2074. chooseImage(serviceName) {
  2075. uni.chooseImage({
  2076. count: 9,
  2077. sizeType: ["compressed"],
  2078. sourceType: ["album", "camera"],
  2079. success: async (res) => {
  2080. if (!this.qualifications[serviceName]) {
  2081. this.qualifications[serviceName] = [];
  2082. this.qualOssIds[serviceName] = [];
  2083. }
  2084. for (const tempPath of res.tempFilePaths) {
  2085. this.qualifications[serviceName].push(tempPath);
  2086. this.$forceUpdate();
  2087. try {
  2088. const uploadRes = await uploadFile(tempPath);
  2089. this.qualOssIds[serviceName].push(uploadRes.data.ossId);
  2090. } catch (err) {
  2091. formatAppLog("error", "at pages/recruit/qualifications_logic.js:44", "上传资质图片失败:", err);
  2092. }
  2093. }
  2094. }
  2095. });
  2096. },
  2097. deleteImage(serviceName, index) {
  2098. this.qualifications[serviceName].splice(index, 1);
  2099. if (this.qualOssIds[serviceName]) {
  2100. this.qualOssIds[serviceName].splice(index, 1);
  2101. }
  2102. this.$forceUpdate();
  2103. },
  2104. goBackToForm() {
  2105. const pages = getCurrentPages();
  2106. if (pages.length > 2) {
  2107. uni.navigateBack({
  2108. delta: 2
  2109. });
  2110. } else {
  2111. uni.reLaunch({
  2112. url: "/pages/recruit/form"
  2113. });
  2114. }
  2115. },
  2116. async submit() {
  2117. let recruitData = {};
  2118. try {
  2119. const stored = uni.getStorageSync("recruit_form_data");
  2120. if (stored) {
  2121. recruitData = JSON.parse(stored);
  2122. }
  2123. } catch (e) {
  2124. formatAppLog("error", "at pages/recruit/qualifications_logic.js:80", "读取招募表单数据失败", e);
  2125. }
  2126. const allQualOssIds = [];
  2127. Object.values(this.qualOssIds).forEach((ids) => {
  2128. allQualOssIds.push(...ids);
  2129. });
  2130. const auditData = {
  2131. name: recruitData.name || "",
  2132. phone: recruitData.mobile || "",
  2133. password: recruitData.password || "",
  2134. gender: recruitData.gender === 1 ? "0" : "1",
  2135. birthday: recruitData.birthday || "",
  2136. serviceTypes: JSON.stringify(recruitData.serviceType || []),
  2137. city: recruitData.city || "",
  2138. stationId: recruitData.stationId || null,
  2139. realName: recruitData.realName || "",
  2140. idCard: recruitData.idNumber || "",
  2141. idValidDate: recruitData.expiryDate || "",
  2142. idCardFront: recruitData.idCardFrontOssId || null,
  2143. idCardBack: recruitData.idCardBackOssId || null,
  2144. qualifications: JSON.stringify(allQualOssIds)
  2145. };
  2146. uni.showLoading({ title: "提交中..." });
  2147. try {
  2148. await submitAudit(auditData);
  2149. uni.hideLoading();
  2150. uni.reLaunch({
  2151. url: "/pages/recruit/success"
  2152. });
  2153. } catch (err) {
  2154. uni.hideLoading();
  2155. formatAppLog("error", "at pages/recruit/qualifications_logic.js:116", "提交申请失败:", err);
  2156. }
  2157. }
  2158. }
  2159. };
  2160. const _sfc_main$x = logic$5;
  2161. function _sfc_render$w(_ctx, _cache, $props, $setup, $data, $options) {
  2162. return vue.openBlock(), vue.createElementBlock("view", { class: "qual-container" }, [
  2163. vue.createElementVNode("view", { class: "top-tip" }, "根据国家政策要求,请尽快完成实名认证与健康认证,否则无法开展配送业务。我们承诺将严格保管好您的个人信息。"),
  2164. _ctx.serviceTypes.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  2165. key: 0,
  2166. class: "empty-state"
  2167. }, [
  2168. vue.createElementVNode("text", { class: "empty-tip" }, "请返回第一步选择服务类型"),
  2169. vue.createElementVNode("button", {
  2170. class: "back-btn",
  2171. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goBackToForm && _ctx.goBackToForm(...args))
  2172. }, "返回选择")
  2173. ])) : vue.createCommentVNode("v-if", true),
  2174. (vue.openBlock(true), vue.createElementBlock(
  2175. vue.Fragment,
  2176. null,
  2177. vue.renderList(_ctx.serviceTypes, (type, index) => {
  2178. return vue.openBlock(), vue.createElementBlock("view", {
  2179. class: "qual-card",
  2180. key: index
  2181. }, [
  2182. vue.createElementVNode(
  2183. "view",
  2184. { class: "card-title" },
  2185. vue.toDisplayString(type) + "服务资质",
  2186. 1
  2187. /* TEXT */
  2188. ),
  2189. vue.createElementVNode("view", { class: "upload-wrapper" }, [
  2190. (vue.openBlock(true), vue.createElementBlock(
  2191. vue.Fragment,
  2192. null,
  2193. vue.renderList(_ctx.qualifications[type], (img, imgIndex) => {
  2194. return vue.openBlock(), vue.createElementBlock("view", {
  2195. class: "img-item",
  2196. key: imgIndex
  2197. }, [
  2198. vue.createElementVNode("image", {
  2199. src: img,
  2200. class: "preview-img",
  2201. mode: "aspectFill",
  2202. onClick: ($event) => _ctx.previewImage(type, imgIndex)
  2203. }, null, 8, ["src", "onClick"]),
  2204. vue.createElementVNode("view", {
  2205. class: "delete-btn",
  2206. onClick: vue.withModifiers(($event) => _ctx.deleteImage(type, imgIndex), ["stop"])
  2207. }, "×", 8, ["onClick"])
  2208. ]);
  2209. }),
  2210. 128
  2211. /* KEYED_FRAGMENT */
  2212. )),
  2213. vue.createElementVNode("view", {
  2214. class: "upload-box",
  2215. onClick: ($event) => _ctx.chooseImage(type)
  2216. }, [
  2217. vue.createElementVNode("text", { class: "plus-icon" }, "+"),
  2218. vue.createElementVNode("text", { class: "upload-text" }, "上传")
  2219. ], 8, ["onClick"])
  2220. ])
  2221. ]);
  2222. }),
  2223. 128
  2224. /* KEYED_FRAGMENT */
  2225. )),
  2226. vue.createElementVNode("view", { class: "footer-actions" }, [
  2227. vue.createElementVNode("button", {
  2228. class: "submit-btn",
  2229. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.submit && _ctx.submit(...args))
  2230. }, "立即提交")
  2231. ])
  2232. ]);
  2233. }
  2234. const PagesRecruitQualifications = /* @__PURE__ */ _export_sfc(_sfc_main$x, [["render", _sfc_render$w], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/qualifications.vue"]]);
  2235. const logic$4 = {
  2236. data() {
  2237. return {
  2238. station: "民治街道第一站",
  2239. name: "张三哥",
  2240. phone: "+8613612345678"
  2241. };
  2242. },
  2243. methods: {
  2244. goHome() {
  2245. uni.reLaunch({
  2246. url: "/pages/login/login"
  2247. });
  2248. }
  2249. }
  2250. };
  2251. const _sfc_main$w = logic$4;
  2252. function _sfc_render$v(_ctx, _cache, $props, $setup, $data, $options) {
  2253. return vue.openBlock(), vue.createElementBlock("view", { class: "success-container" }, [
  2254. vue.createElementVNode("view", { class: "icon-area" }, [
  2255. (vue.openBlock(), vue.createElementBlock("svg", {
  2256. class: "success-icon",
  2257. viewBox: "0 0 1024 1024",
  2258. version: "1.1",
  2259. xmlns: "http://www.w3.org/2000/svg"
  2260. }, [
  2261. vue.createElementVNode("path", {
  2262. 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",
  2263. fill: "#64D01D"
  2264. }),
  2265. vue.createElementVNode("path", {
  2266. 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",
  2267. fill: "#64D01D"
  2268. })
  2269. ])),
  2270. vue.createElementVNode("text", { class: "main-title" }, "提交成功")
  2271. ]),
  2272. vue.createElementVNode("text", { class: "sub-tip" }, "请保持手机畅通,等待平台工作人员与您联系"),
  2273. vue.createElementVNode("view", { class: "info-card" }, [
  2274. vue.createElementVNode("view", { class: "info-item" }, [
  2275. vue.createElementVNode("text", { class: "label" }, "服务站点:"),
  2276. vue.createElementVNode(
  2277. "text",
  2278. { class: "value" },
  2279. vue.toDisplayString(_ctx.station),
  2280. 1
  2281. /* TEXT */
  2282. )
  2283. ]),
  2284. vue.createElementVNode("view", { class: "info-item" }, [
  2285. vue.createElementVNode("text", { class: "label" }, "报 名 人 :"),
  2286. vue.createElementVNode(
  2287. "text",
  2288. { class: "value" },
  2289. vue.toDisplayString(_ctx.name),
  2290. 1
  2291. /* TEXT */
  2292. )
  2293. ]),
  2294. vue.createElementVNode("view", { class: "info-item" }, [
  2295. vue.createElementVNode("text", { class: "label" }, "联系手机:"),
  2296. vue.createElementVNode(
  2297. "text",
  2298. { class: "value" },
  2299. vue.toDisplayString(_ctx.phone),
  2300. 1
  2301. /* TEXT */
  2302. )
  2303. ])
  2304. ]),
  2305. vue.createElementVNode("view", {
  2306. class: "footer-btn",
  2307. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goHome && _ctx.goHome(...args))
  2308. }, "我知道了")
  2309. ]);
  2310. }
  2311. const PagesRecruitSuccess = /* @__PURE__ */ _export_sfc(_sfc_main$w, [["render", _sfc_render$v], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/recruit/success.vue"]]);
  2312. const _sfc_main$v = {
  2313. data() {
  2314. return {
  2315. mobile: "",
  2316. code: "",
  2317. countDown: 0,
  2318. timer: null
  2319. };
  2320. },
  2321. computed: {
  2322. mobileMask() {
  2323. if (!this.mobile)
  2324. return "";
  2325. return this.mobile.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
  2326. }
  2327. },
  2328. onLoad(options) {
  2329. if (options.mobile) {
  2330. this.mobile = options.mobile;
  2331. } else {
  2332. this.mobile = "13412346783";
  2333. }
  2334. },
  2335. methods: {
  2336. getVerifyCode() {
  2337. if (this.countDown > 0)
  2338. return;
  2339. this.countDown = 60;
  2340. this.timer = setInterval(() => {
  2341. this.countDown--;
  2342. if (this.countDown <= 0) {
  2343. clearInterval(this.timer);
  2344. }
  2345. }, 1e3);
  2346. uni.showToast({ title: "验证码已发送", icon: "none" });
  2347. },
  2348. nextStep() {
  2349. if (!this.code) {
  2350. uni.showToast({ title: "请输入验证码", icon: "none" });
  2351. return;
  2352. }
  2353. uni.navigateTo({
  2354. url: "/pages/login/reset-pwd-set"
  2355. });
  2356. }
  2357. }
  2358. };
  2359. function _sfc_render$u(_ctx, _cache, $props, $setup, $data, $options) {
  2360. return vue.openBlock(), vue.createElementBlock("view", { class: "reset-container" }, [
  2361. vue.createElementVNode("view", { class: "content" }, [
  2362. vue.createElementVNode(
  2363. "view",
  2364. { class: "tip-text" },
  2365. "请输入 +86 " + vue.toDisplayString($options.mobileMask) + " 收到的短信验证码,进行验证~",
  2366. 1
  2367. /* TEXT */
  2368. ),
  2369. vue.createElementVNode("view", { class: "input-group" }, [
  2370. vue.createElementVNode("text", { class: "label" }, "验证码"),
  2371. vue.createElementVNode("view", { class: "input-wrapper" }, [
  2372. vue.withDirectives(vue.createElementVNode(
  2373. "input",
  2374. {
  2375. class: "code-input",
  2376. type: "number",
  2377. maxlength: "6",
  2378. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.code = $event)
  2379. },
  2380. null,
  2381. 512
  2382. /* NEED_PATCH */
  2383. ), [
  2384. [vue.vModelText, $data.code]
  2385. ]),
  2386. vue.createElementVNode("view", {
  2387. class: "get-code-btn",
  2388. onClick: _cache[1] || (_cache[1] = (...args) => $options.getVerifyCode && $options.getVerifyCode(...args))
  2389. }, [
  2390. vue.createElementVNode(
  2391. "text",
  2392. { class: "btn-text" },
  2393. vue.toDisplayString($data.countDown > 0 ? `${$data.countDown}s` : "获取验证码"),
  2394. 1
  2395. /* TEXT */
  2396. )
  2397. ])
  2398. ])
  2399. ]),
  2400. vue.createElementVNode("button", {
  2401. class: "next-btn",
  2402. onClick: _cache[2] || (_cache[2] = (...args) => $options.nextStep && $options.nextStep(...args))
  2403. }, "下一步")
  2404. ])
  2405. ]);
  2406. }
  2407. 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"]]);
  2408. const _sfc_main$u = {
  2409. data() {
  2410. return {
  2411. pwd1: "",
  2412. pwd2: ""
  2413. };
  2414. },
  2415. methods: {
  2416. confirmReset() {
  2417. if (!this.pwd1 || !this.pwd2) {
  2418. uni.showToast({ title: "请输入密码", icon: "none" });
  2419. return;
  2420. }
  2421. if (this.pwd1 !== this.pwd2) {
  2422. uni.showToast({ title: "两次密码不一致", icon: "none" });
  2423. return;
  2424. }
  2425. uni.showToast({ title: "重置成功", icon: "success" });
  2426. setTimeout(() => {
  2427. uni.navigateBack({
  2428. delta: 2
  2429. // 返回到登录页
  2430. });
  2431. }, 1500);
  2432. }
  2433. }
  2434. };
  2435. function _sfc_render$t(_ctx, _cache, $props, $setup, $data, $options) {
  2436. return vue.openBlock(), vue.createElementBlock("view", { class: "reset-container" }, [
  2437. vue.createElementVNode("view", { class: "content" }, [
  2438. vue.createElementVNode("view", { class: "tip-text" }, "请输入新密码,并重新登录验证"),
  2439. vue.createElementVNode("view", { class: "input-form" }, [
  2440. vue.createElementVNode("view", { class: "input-row" }, [
  2441. vue.withDirectives(vue.createElementVNode(
  2442. "input",
  2443. {
  2444. class: "pwd-input",
  2445. type: "text",
  2446. password: "",
  2447. placeholder: "限12-20位字母和数字组合",
  2448. "placeholder-style": "color:#ccc",
  2449. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.pwd1 = $event)
  2450. },
  2451. null,
  2452. 512
  2453. /* NEED_PATCH */
  2454. ), [
  2455. [vue.vModelText, $data.pwd1]
  2456. ])
  2457. ]),
  2458. vue.createElementVNode("view", { class: "divider" }),
  2459. vue.createElementVNode("view", { class: "input-row" }, [
  2460. vue.withDirectives(vue.createElementVNode(
  2461. "input",
  2462. {
  2463. class: "pwd-input",
  2464. type: "text",
  2465. password: "",
  2466. placeholder: "限12-20位字母和数字组合",
  2467. "placeholder-style": "color:#ccc",
  2468. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.pwd2 = $event)
  2469. },
  2470. null,
  2471. 512
  2472. /* NEED_PATCH */
  2473. ), [
  2474. [vue.vModelText, $data.pwd2]
  2475. ])
  2476. ]),
  2477. vue.createElementVNode("view", { class: "divider" })
  2478. ]),
  2479. vue.createElementVNode("button", {
  2480. class: "confirm-btn",
  2481. onClick: _cache[2] || (_cache[2] = (...args) => $options.confirmReset && $options.confirmReset(...args))
  2482. }, "确定")
  2483. ])
  2484. ]);
  2485. }
  2486. 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"]]);
  2487. function getServiceList() {
  2488. return request({
  2489. url: "/service/list/listOnTaskHall",
  2490. method: "GET"
  2491. });
  2492. }
  2493. const logic$3 = {
  2494. data() {
  2495. return {
  2496. taskList: [],
  2497. currentFilter: "default",
  2498. // default, distance, time
  2499. filterCondition: "筛选条件",
  2500. sortDistance: "asc",
  2501. // asc, desc
  2502. sortTime: "asc",
  2503. scrollTop: 0,
  2504. // Track scroll position
  2505. isFilterShow: false,
  2506. tempFilter: {
  2507. service: null,
  2508. distance: "全部",
  2509. amount: "全部"
  2510. },
  2511. activeFilter: {
  2512. service: null,
  2513. distance: "全部",
  2514. amount: "全部"
  2515. },
  2516. workStatus: "working",
  2517. // working | resting
  2518. showConfirmModal: false,
  2519. showPetModal: false,
  2520. currentPetInfo: {},
  2521. showRejectModal: false,
  2522. rejectReason: "",
  2523. currentOrder: null,
  2524. showAcceptConfirmModal: false,
  2525. showNavModal: false,
  2526. navTargetItem: null,
  2527. navTargetPointType: "",
  2528. profile: null,
  2529. profileLoading: false,
  2530. serviceList: [],
  2531. orderStats: {
  2532. total: 0,
  2533. reject: 0,
  2534. award: 0,
  2535. punishment: 0
  2536. }
  2537. };
  2538. },
  2539. onPageScroll(e) {
  2540. this.scrollTop = e.scrollTop;
  2541. },
  2542. onLoad() {
  2543. this.checkWorkStatus();
  2544. this.loadServiceList();
  2545. this.loadTaskList();
  2546. },
  2547. onShow() {
  2548. this.checkWorkStatus();
  2549. if (isLoggedIn()) {
  2550. this.loadProfile();
  2551. this.loadOrderStats();
  2552. }
  2553. },
  2554. methods: {
  2555. async loadProfile() {
  2556. if (this.profileLoading)
  2557. return;
  2558. this.profileLoading = true;
  2559. try {
  2560. const res = await getMyProfile();
  2561. this.profile = res.data || null;
  2562. } catch (err) {
  2563. formatAppLog("error", "at pages/home/logic.js:71", "获取个人信息失败:", err);
  2564. } finally {
  2565. this.profileLoading = false;
  2566. }
  2567. },
  2568. async loadServiceList() {
  2569. try {
  2570. const res = await getServiceList();
  2571. this.serviceList = res.data || [];
  2572. } catch (err) {
  2573. formatAppLog("error", "at pages/home/logic.js:81", "获取服务类型失败:", err);
  2574. }
  2575. },
  2576. async loadOrderStats() {
  2577. try {
  2578. const res = await getOrderCount();
  2579. this.orderStats = res.data || { total: 0, reject: 0, award: 0, punishment: 0 };
  2580. } catch (err) {
  2581. formatAppLog("error", "at pages/home/logic.js:89", "获取订单统计失败:", err);
  2582. }
  2583. },
  2584. checkWorkStatus() {
  2585. const status = uni.getStorageSync("workStatus");
  2586. if (status) {
  2587. this.workStatus = status;
  2588. } else {
  2589. this.workStatus = "working";
  2590. uni.setStorageSync("workStatus", "working");
  2591. }
  2592. },
  2593. toggleFilter() {
  2594. if (this.workStatus === "resting")
  2595. return;
  2596. this.isFilterShow = !this.isFilterShow;
  2597. },
  2598. goToWorkStatus() {
  2599. uni.navigateTo({
  2600. url: "/pages/home/work-status"
  2601. });
  2602. },
  2603. startWork() {
  2604. this.showConfirmModal = true;
  2605. },
  2606. confirmStartWork() {
  2607. this.workStatus = "working";
  2608. uni.setStorageSync("workStatus", "working");
  2609. this.loadTaskList();
  2610. this.showConfirmModal = false;
  2611. uni.showToast({ title: "已开始接单", icon: "success" });
  2612. },
  2613. closeConfirmModal() {
  2614. this.showConfirmModal = false;
  2615. },
  2616. showPetProfile(item) {
  2617. this.currentPetInfo = item;
  2618. this.showPetModal = true;
  2619. },
  2620. closePetProfile() {
  2621. this.showPetModal = false;
  2622. },
  2623. openRejectModal(item) {
  2624. this.currentOrder = item;
  2625. this.rejectReason = "";
  2626. this.showRejectModal = true;
  2627. },
  2628. closeRejectModal() {
  2629. this.showRejectModal = false;
  2630. this.currentOrder = null;
  2631. },
  2632. confirmReject() {
  2633. if (!this.rejectReason.trim()) {
  2634. uni.showToast({ title: "请输入拒绝理由", icon: "none" });
  2635. return;
  2636. }
  2637. uni.showToast({ title: "已拒绝接单", icon: "success" });
  2638. this.showRejectModal = false;
  2639. },
  2640. openAcceptModal(item) {
  2641. this.currentOrder = item;
  2642. this.showAcceptConfirmModal = true;
  2643. },
  2644. closeAcceptModal() {
  2645. this.showAcceptConfirmModal = false;
  2646. this.currentOrder = null;
  2647. },
  2648. async confirmAccept() {
  2649. var _a;
  2650. if (!((_a = this.currentOrder) == null ? void 0 : _a.id))
  2651. return;
  2652. try {
  2653. await acceptOrder(this.currentOrder.id);
  2654. uni.showToast({ title: "接单成功", icon: "success" });
  2655. this.showAcceptConfirmModal = false;
  2656. this.currentOrder = null;
  2657. this.loadTaskList();
  2658. this.loadProfile();
  2659. } catch (err) {
  2660. formatAppLog("error", "at pages/home/logic.js:167", "接单失败:", err);
  2661. uni.showToast({ title: "接单失败", icon: "none" });
  2662. }
  2663. },
  2664. openNavigation(item, pointType) {
  2665. this.navTargetItem = item;
  2666. this.navTargetPointType = pointType;
  2667. this.showNavModal = true;
  2668. },
  2669. closeNavModal() {
  2670. this.showNavModal = false;
  2671. },
  2672. chooseMap(mapType) {
  2673. let item = this.navTargetItem;
  2674. let pointType = this.navTargetPointType;
  2675. let name = pointType === "start" ? item.startLocation : item.endLocation;
  2676. let address = pointType === "start" ? item.startAddress : item.endAddress;
  2677. this.showNavModal = false;
  2678. uni.openLocation({
  2679. latitude: 30.52,
  2680. // Mock lat
  2681. longitude: 114.31,
  2682. // Mock lng
  2683. name: name || "目的地",
  2684. address: address || "默认地址",
  2685. success: function() {
  2686. formatAppLog("log", "at pages/home/logic.js:193", "打开导航成功: " + mapType);
  2687. }
  2688. });
  2689. },
  2690. selectService(type) {
  2691. this.tempFilter.service = type;
  2692. },
  2693. selectDistance(type) {
  2694. this.tempFilter.distance = type;
  2695. },
  2696. selectAmount(type) {
  2697. this.tempFilter.amount = type;
  2698. },
  2699. resetFilter() {
  2700. this.tempFilter = {
  2701. service: null,
  2702. distance: "全部",
  2703. amount: "全部"
  2704. };
  2705. },
  2706. confirmFilter() {
  2707. this.activeFilter = { ...this.tempFilter };
  2708. this.isFilterShow = false;
  2709. uni.showToast({ title: "筛选已生效", icon: "none" });
  2710. },
  2711. closeFilter() {
  2712. this.isFilterShow = false;
  2713. },
  2714. goToDetail(item) {
  2715. formatAppLog("log", "at pages/home/logic.js:223", "Go to detail", item);
  2716. },
  2717. async loadTaskList() {
  2718. try {
  2719. const params = {
  2720. service: this.activeFilter.service,
  2721. minPrice: this.getMinPrice(),
  2722. maxPrice: this.getMaxPrice(),
  2723. pageNum: 1,
  2724. pageSize: 20
  2725. };
  2726. const res = await getPendingOrders(params);
  2727. this.taskList = (res.rows || []).map((item) => this.transformOrder(item));
  2728. } catch (err) {
  2729. formatAppLog("error", "at pages/home/logic.js:237", "获取订单列表失败:", err);
  2730. uni.showToast({ title: "加载失败", icon: "none" });
  2731. this.taskList = [];
  2732. }
  2733. },
  2734. getMinPrice() {
  2735. const amount = this.activeFilter.amount;
  2736. if (amount === "100以下")
  2737. return 0;
  2738. if (amount === "100-200")
  2739. return 1e4;
  2740. if (amount === "200-500")
  2741. return 2e4;
  2742. if (amount === "500以上")
  2743. return 5e4;
  2744. return void 0;
  2745. },
  2746. getMaxPrice() {
  2747. const amount = this.activeFilter.amount;
  2748. if (amount === "100以下")
  2749. return 1e4;
  2750. if (amount === "100-200")
  2751. return 2e4;
  2752. if (amount === "200-500")
  2753. return 5e4;
  2754. return void 0;
  2755. },
  2756. transformOrder(item) {
  2757. const service = this.serviceList.find((s) => s.id === item.service);
  2758. const serviceText = (service == null ? void 0 : service.name) || "未知";
  2759. const serviceIcon = (service == null ? void 0 : service.icon) || "";
  2760. const mode = (service == null ? void 0 : service.mode) || 0;
  2761. const isRoundTrip = mode === 1;
  2762. return {
  2763. id: item.id,
  2764. type: isRoundTrip ? 1 : item.service,
  2765. typeText: serviceText,
  2766. typeIcon: serviceIcon,
  2767. price: (item.price / 100).toFixed(2),
  2768. timeLabel: isRoundTrip ? "取货时间" : "服务时间",
  2769. time: item.serviceTime,
  2770. petAvatar: "/static/dog.png",
  2771. petName: item.petName,
  2772. petBreed: item.breed,
  2773. petGender: "M",
  2774. petAge: "",
  2775. petWeight: "",
  2776. petPersonality: "",
  2777. petHobby: "",
  2778. petRemark: "",
  2779. petTags: [],
  2780. petLogs: [],
  2781. startLocation: isRoundTrip ? item.fromAddress : "",
  2782. startAddress: isRoundTrip ? item.fromAddress : "",
  2783. startDistance: "0km",
  2784. endLocation: item.customerName + " " + item.customerPhone,
  2785. endAddress: item.toAddress,
  2786. endDistance: "0km",
  2787. serviceContent: "",
  2788. remark: item.remark || ""
  2789. };
  2790. },
  2791. setFilter(type) {
  2792. this.currentFilter = type;
  2793. if (type === "distance") {
  2794. this.sortDistance = this.sortDistance === "asc" ? "desc" : "asc";
  2795. uni.showToast({ title: `按距离${this.sortDistance === "asc" ? "升序" : "降序"}`, icon: "none" });
  2796. } else if (type === "time") {
  2797. this.sortTime = this.sortTime === "asc" ? "desc" : "asc";
  2798. uni.showToast({ title: `按时间${this.sortTime === "asc" ? "升序" : "降序"}`, icon: "none" });
  2799. }
  2800. },
  2801. showFilterDropdown() {
  2802. this.toggleFilter();
  2803. }
  2804. }
  2805. };
  2806. const _imports_0$3 = "/static/icons/bell.svg";
  2807. const _imports_3$2 = "/static/icons/nav_arrow.svg";
  2808. const _imports_2$3 = "/static/empty-rest.png";
  2809. const _sfc_main$t = {
  2810. ...logic$3
  2811. };
  2812. function _sfc_render$s(_ctx, _cache, $props, $setup, $data, $options) {
  2813. var _a, _b, _c;
  2814. return vue.openBlock(), vue.createElementBlock(
  2815. vue.Fragment,
  2816. null,
  2817. [
  2818. vue.createElementVNode("view", { class: "container" }, [
  2819. vue.createElementVNode(
  2820. "view",
  2821. {
  2822. class: "custom-nav-bar",
  2823. style: vue.normalizeStyle({ backgroundColor: _ctx.scrollTop > 20 ? "#fff" : "transparent" })
  2824. },
  2825. [
  2826. vue.createElementVNode("text", { class: "nav-title" }, "任务中心")
  2827. ],
  2828. 4
  2829. /* STYLE */
  2830. ),
  2831. vue.createElementVNode("view", { class: "nav-bg" }, [
  2832. vue.createElementVNode("view", { class: "bg-circle-left" }),
  2833. vue.createElementVNode("view", { class: "bg-circle-right" })
  2834. ]),
  2835. vue.createElementVNode("view", { class: "header-section" }, [
  2836. vue.createElementVNode("view", { class: "user-info" }, [
  2837. vue.createElementVNode("image", {
  2838. class: "avatar",
  2839. src: ((_a = _ctx.profile) == null ? void 0 : _a.avatarUrl) || "/static/touxiang.png",
  2840. mode: "aspectFill"
  2841. }, null, 8, ["src"]),
  2842. vue.createElementVNode("view", { class: "info-content" }, [
  2843. vue.createElementVNode("view", { class: "top-row" }, [
  2844. vue.createElementVNode(
  2845. "text",
  2846. { class: "name" },
  2847. vue.toDisplayString(((_b = _ctx.profile) == null ? void 0 : _b.name) || "未登录"),
  2848. 1
  2849. /* TEXT */
  2850. ),
  2851. vue.createElementVNode(
  2852. "view",
  2853. {
  2854. class: vue.normalizeClass(["status-pill", { "resting": _ctx.workStatus === "resting" }]),
  2855. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.goToWorkStatus && _ctx.goToWorkStatus(...args))
  2856. },
  2857. [
  2858. vue.createElementVNode("view", { class: "status-dot-bg" }, [
  2859. _ctx.workStatus === "working" ? (vue.openBlock(), vue.createElementBlock("text", {
  2860. key: 0,
  2861. class: "check-mark"
  2862. }, "✔")) : (vue.openBlock(), vue.createElementBlock("text", {
  2863. key: 1,
  2864. class: "check-mark",
  2865. style: { "font-size": "16rpx", "line-height": "20rpx" }
  2866. }, "✕"))
  2867. ]),
  2868. vue.createElementVNode(
  2869. "text",
  2870. { class: "status-text" },
  2871. vue.toDisplayString(_ctx.workStatus === "working" ? "接单中" : "正在休息"),
  2872. 1
  2873. /* TEXT */
  2874. ),
  2875. vue.createElementVNode("text", { class: "arrow-down" }, "▼")
  2876. ],
  2877. 2
  2878. /* CLASS */
  2879. )
  2880. ]),
  2881. vue.createElementVNode("view", { class: "bottom-row" }, [
  2882. vue.createElementVNode(
  2883. "text",
  2884. { class: "city-label" },
  2885. "接单城市:" + vue.toDisplayString(((_c = _ctx.profile) == null ? void 0 : _c.cityName) || "暂无"),
  2886. 1
  2887. /* TEXT */
  2888. ),
  2889. vue.createElementVNode("text", { class: "city-arrow" }, ">")
  2890. ])
  2891. ]),
  2892. vue.createElementVNode("view", { class: "notification-box" }, [
  2893. vue.createElementVNode("image", {
  2894. class: "bell-img",
  2895. src: _imports_0$3
  2896. }),
  2897. vue.createElementVNode("view", { class: "badge-count" }, "2")
  2898. ])
  2899. ]),
  2900. vue.createElementVNode("view", { class: "stats-card" }, [
  2901. vue.createElementVNode("view", { class: "stat-item" }, [
  2902. vue.createElementVNode(
  2903. "text",
  2904. { class: "num" },
  2905. vue.toDisplayString(_ctx.orderStats.total),
  2906. 1
  2907. /* TEXT */
  2908. ),
  2909. vue.createElementVNode("text", { class: "label" }, "累计接单")
  2910. ]),
  2911. vue.createElementVNode("view", { class: "divider" }),
  2912. vue.createElementVNode("view", { class: "stat-item" }, [
  2913. vue.createElementVNode(
  2914. "text",
  2915. { class: "num" },
  2916. vue.toDisplayString(_ctx.orderStats.reject),
  2917. 1
  2918. /* TEXT */
  2919. ),
  2920. vue.createElementVNode("text", { class: "label" }, "拒接订单")
  2921. ]),
  2922. vue.createElementVNode("view", { class: "divider" }),
  2923. vue.createElementVNode("view", { class: "stat-item" }, [
  2924. vue.createElementVNode(
  2925. "text",
  2926. { class: "num" },
  2927. vue.toDisplayString(_ctx.orderStats.award),
  2928. 1
  2929. /* TEXT */
  2930. ),
  2931. vue.createElementVNode("text", { class: "label" }, "奖励订单")
  2932. ]),
  2933. vue.createElementVNode("view", { class: "divider" }),
  2934. vue.createElementVNode("view", { class: "stat-item" }, [
  2935. vue.createElementVNode(
  2936. "text",
  2937. { class: "num" },
  2938. vue.toDisplayString(_ctx.orderStats.punishment),
  2939. 1
  2940. /* TEXT */
  2941. ),
  2942. vue.createElementVNode("text", { class: "label" }, "惩罚订单")
  2943. ])
  2944. ])
  2945. ]),
  2946. vue.createElementVNode("view", { class: "task-header" }, [
  2947. vue.createElementVNode(
  2948. "view",
  2949. {
  2950. class: "header-inner",
  2951. style: vue.normalizeStyle({ backgroundColor: _ctx.scrollTop > 300 || _ctx.isFilterShow ? "#fff" : "transparent" })
  2952. },
  2953. [
  2954. vue.createElementVNode("view", { class: "left-title" }, [
  2955. vue.createElementVNode("view", { class: "orange-bar" }),
  2956. vue.createElementVNode("text", { class: "title" }, "任务大厅"),
  2957. vue.createElementVNode(
  2958. "text",
  2959. { class: "count" },
  2960. "- (" + vue.toDisplayString(_ctx.taskList.length) + "单)",
  2961. 1
  2962. /* TEXT */
  2963. )
  2964. ]),
  2965. vue.createElementVNode("view", { class: "filter-options" }, [
  2966. vue.createElementVNode(
  2967. "view",
  2968. {
  2969. class: vue.normalizeClass(["filter-item", { active: _ctx.currentFilter === "distance" }]),
  2970. onClick: _cache[1] || (_cache[1] = ($event) => _ctx.setFilter("distance"))
  2971. },
  2972. [
  2973. vue.createTextVNode(" 距离 "),
  2974. vue.createElementVNode("view", { class: "sort-icon" }, [
  2975. vue.createElementVNode(
  2976. "view",
  2977. {
  2978. class: vue.normalizeClass(["up", { active: _ctx.currentFilter === "distance" && _ctx.sortDistance === "asc" }])
  2979. },
  2980. null,
  2981. 2
  2982. /* CLASS */
  2983. ),
  2984. vue.createElementVNode(
  2985. "view",
  2986. {
  2987. class: vue.normalizeClass(["down", { active: _ctx.currentFilter === "distance" && _ctx.sortDistance === "desc" }])
  2988. },
  2989. null,
  2990. 2
  2991. /* CLASS */
  2992. )
  2993. ])
  2994. ],
  2995. 2
  2996. /* CLASS */
  2997. ),
  2998. vue.createElementVNode(
  2999. "view",
  3000. {
  3001. class: vue.normalizeClass(["filter-item", { active: _ctx.currentFilter === "time" }]),
  3002. onClick: _cache[2] || (_cache[2] = ($event) => _ctx.setFilter("time"))
  3003. },
  3004. [
  3005. vue.createTextVNode(" 时间 "),
  3006. vue.createElementVNode("view", { class: "sort-icon" }, [
  3007. vue.createElementVNode(
  3008. "view",
  3009. {
  3010. class: vue.normalizeClass(["up", { active: _ctx.currentFilter === "time" && _ctx.sortTime === "asc" }])
  3011. },
  3012. null,
  3013. 2
  3014. /* CLASS */
  3015. ),
  3016. vue.createElementVNode(
  3017. "view",
  3018. {
  3019. class: vue.normalizeClass(["down", { active: _ctx.currentFilter === "time" && _ctx.sortTime === "desc" }])
  3020. },
  3021. null,
  3022. 2
  3023. /* CLASS */
  3024. )
  3025. ])
  3026. ],
  3027. 2
  3028. /* CLASS */
  3029. ),
  3030. vue.createElementVNode("view", {
  3031. class: "dropdown",
  3032. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.showFilterDropdown && _ctx.showFilterDropdown(...args))
  3033. }, [
  3034. vue.createElementVNode("text", null, "筛选条件"),
  3035. vue.createElementVNode("text", { class: "arrow-down" }, "﹀")
  3036. ])
  3037. ])
  3038. ],
  3039. 4
  3040. /* STYLE */
  3041. ),
  3042. _ctx.isFilterShow ? (vue.openBlock(), vue.createElementBlock("view", {
  3043. key: 0,
  3044. class: "filter-mask",
  3045. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.closeFilter && _ctx.closeFilter(...args))
  3046. })) : vue.createCommentVNode("v-if", true),
  3047. vue.createElementVNode(
  3048. "view",
  3049. {
  3050. class: vue.normalizeClass(["filter-panel", { show: _ctx.isFilterShow }])
  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.service === null }]),
  3060. onClick: _cache[5] || (_cache[5] = ($event) => _ctx.selectService(null))
  3061. },
  3062. "全部",
  3063. 2
  3064. /* CLASS */
  3065. ),
  3066. (vue.openBlock(true), vue.createElementBlock(
  3067. vue.Fragment,
  3068. null,
  3069. vue.renderList(_ctx.serviceList, (item) => {
  3070. return vue.openBlock(), vue.createElementBlock("view", {
  3071. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.service === item.id }]),
  3072. key: item.id,
  3073. onClick: ($event) => _ctx.selectService(item.id)
  3074. }, vue.toDisplayString(item.name), 11, ["onClick"]);
  3075. }),
  3076. 128
  3077. /* KEYED_FRAGMENT */
  3078. ))
  3079. ])
  3080. ]),
  3081. vue.createElementVNode("view", { class: "filter-section" }, [
  3082. vue.createElementVNode("text", { class: "section-title" }, "距离"),
  3083. vue.createElementVNode("view", { class: "options-grid" }, [
  3084. vue.createElementVNode(
  3085. "view",
  3086. {
  3087. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "全部" }]),
  3088. onClick: _cache[6] || (_cache[6] = ($event) => _ctx.selectDistance("全部"))
  3089. },
  3090. "全部",
  3091. 2
  3092. /* CLASS */
  3093. ),
  3094. vue.createElementVNode(
  3095. "view",
  3096. {
  3097. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "2公里内" }]),
  3098. onClick: _cache[7] || (_cache[7] = ($event) => _ctx.selectDistance("2公里内"))
  3099. },
  3100. "2公里内",
  3101. 2
  3102. /* CLASS */
  3103. ),
  3104. vue.createElementVNode(
  3105. "view",
  3106. {
  3107. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "5公里内" }]),
  3108. onClick: _cache[8] || (_cache[8] = ($event) => _ctx.selectDistance("5公里内"))
  3109. },
  3110. "5公里内",
  3111. 2
  3112. /* CLASS */
  3113. ),
  3114. vue.createElementVNode(
  3115. "view",
  3116. {
  3117. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "10公里内" }]),
  3118. onClick: _cache[9] || (_cache[9] = ($event) => _ctx.selectDistance("10公里内"))
  3119. },
  3120. "10公里内",
  3121. 2
  3122. /* CLASS */
  3123. ),
  3124. vue.createElementVNode(
  3125. "view",
  3126. {
  3127. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "20公里内" }]),
  3128. onClick: _cache[10] || (_cache[10] = ($event) => _ctx.selectDistance("20公里内"))
  3129. },
  3130. "20公里内",
  3131. 2
  3132. /* CLASS */
  3133. ),
  3134. vue.createElementVNode(
  3135. "view",
  3136. {
  3137. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.distance === "50公里内" }]),
  3138. onClick: _cache[11] || (_cache[11] = ($event) => _ctx.selectDistance("50公里内"))
  3139. },
  3140. "50公里内",
  3141. 2
  3142. /* CLASS */
  3143. )
  3144. ])
  3145. ]),
  3146. vue.createElementVNode("view", { class: "filter-section" }, [
  3147. vue.createElementVNode("text", { class: "section-title" }, "金额"),
  3148. vue.createElementVNode("view", { class: "options-grid" }, [
  3149. vue.createElementVNode(
  3150. "view",
  3151. {
  3152. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "全部" }]),
  3153. onClick: _cache[12] || (_cache[12] = ($event) => _ctx.selectAmount("全部"))
  3154. },
  3155. "全部",
  3156. 2
  3157. /* CLASS */
  3158. ),
  3159. vue.createElementVNode(
  3160. "view",
  3161. {
  3162. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "100以下" }]),
  3163. onClick: _cache[13] || (_cache[13] = ($event) => _ctx.selectAmount("100以下"))
  3164. },
  3165. "100以下",
  3166. 2
  3167. /* CLASS */
  3168. ),
  3169. vue.createElementVNode(
  3170. "view",
  3171. {
  3172. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "100-200" }]),
  3173. onClick: _cache[14] || (_cache[14] = ($event) => _ctx.selectAmount("100-200"))
  3174. },
  3175. "100-200",
  3176. 2
  3177. /* CLASS */
  3178. ),
  3179. vue.createElementVNode(
  3180. "view",
  3181. {
  3182. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "200-500" }]),
  3183. onClick: _cache[15] || (_cache[15] = ($event) => _ctx.selectAmount("200-500"))
  3184. },
  3185. "200-500",
  3186. 2
  3187. /* CLASS */
  3188. ),
  3189. vue.createElementVNode(
  3190. "view",
  3191. {
  3192. class: vue.normalizeClass(["option-btn", { active: _ctx.tempFilter.amount === "500以上" }]),
  3193. onClick: _cache[16] || (_cache[16] = ($event) => _ctx.selectAmount("500以上"))
  3194. },
  3195. "500以上",
  3196. 2
  3197. /* CLASS */
  3198. )
  3199. ])
  3200. ]),
  3201. vue.createElementVNode("view", { class: "filter-actions" }, [
  3202. vue.createElementVNode("button", {
  3203. class: "action-btn reset",
  3204. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.resetFilter && _ctx.resetFilter(...args))
  3205. }, "重置"),
  3206. vue.createElementVNode("button", {
  3207. class: "action-btn confirm",
  3208. onClick: _cache[18] || (_cache[18] = (...args) => _ctx.confirmFilter && _ctx.confirmFilter(...args))
  3209. }, "确认")
  3210. ])
  3211. ],
  3212. 2
  3213. /* CLASS */
  3214. )
  3215. ]),
  3216. _ctx.workStatus === "working" ? (vue.openBlock(), vue.createElementBlock("scroll-view", {
  3217. key: 0,
  3218. "scroll-y": "",
  3219. class: "task-list"
  3220. }, [
  3221. (vue.openBlock(true), vue.createElementBlock(
  3222. vue.Fragment,
  3223. null,
  3224. vue.renderList(_ctx.taskList, (item, index) => {
  3225. return vue.openBlock(), vue.createElementBlock("view", {
  3226. class: "task-card",
  3227. key: index,
  3228. onClick: ($event) => _ctx.goToDetail(item)
  3229. }, [
  3230. vue.createElementVNode("view", { class: "card-header" }, [
  3231. vue.createElementVNode("view", { class: "type-badge" }, [
  3232. vue.createElementVNode("image", {
  3233. class: "type-icon",
  3234. src: item.typeIcon
  3235. }, null, 8, ["src"]),
  3236. vue.createElementVNode(
  3237. "text",
  3238. { class: "type-text" },
  3239. vue.toDisplayString(item.typeText),
  3240. 1
  3241. /* TEXT */
  3242. )
  3243. ]),
  3244. vue.createElementVNode(
  3245. "text",
  3246. { class: "price" },
  3247. "¥" + vue.toDisplayString(item.price),
  3248. 1
  3249. /* TEXT */
  3250. )
  3251. ]),
  3252. vue.createElementVNode("view", { class: "card-body" }, [
  3253. vue.createElementVNode("view", { class: "time-row" }, [
  3254. vue.createElementVNode(
  3255. "text",
  3256. { class: "label" },
  3257. vue.toDisplayString(item.timeLabel) + ":",
  3258. 1
  3259. /* TEXT */
  3260. ),
  3261. vue.createElementVNode(
  3262. "text",
  3263. { class: "value" },
  3264. vue.toDisplayString(item.time),
  3265. 1
  3266. /* TEXT */
  3267. )
  3268. ]),
  3269. vue.createElementVNode("view", { class: "pet-card" }, [
  3270. vue.createElementVNode("image", {
  3271. class: "pet-avatar",
  3272. src: item.petAvatar,
  3273. mode: "aspectFill"
  3274. }, null, 8, ["src"]),
  3275. vue.createElementVNode("view", { class: "pet-info" }, [
  3276. vue.createElementVNode(
  3277. "text",
  3278. { class: "pet-name" },
  3279. vue.toDisplayString(item.petName),
  3280. 1
  3281. /* TEXT */
  3282. ),
  3283. vue.createElementVNode(
  3284. "text",
  3285. { class: "pet-breed" },
  3286. "品种: " + vue.toDisplayString(item.petBreed),
  3287. 1
  3288. /* TEXT */
  3289. )
  3290. ]),
  3291. vue.createElementVNode("view", {
  3292. class: "pet-profile-btn",
  3293. onClick: vue.withModifiers(($event) => _ctx.showPetProfile(item), ["stop"])
  3294. }, "宠物档案", 8, ["onClick"])
  3295. ]),
  3296. vue.createElementVNode("view", { class: "route-info" }, [
  3297. item.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  3298. vue.Fragment,
  3299. { key: 0 },
  3300. [
  3301. vue.createElementVNode("view", {
  3302. class: "route-item",
  3303. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "start"), ["stop"])
  3304. }, [
  3305. vue.createElementVNode("view", { class: "icon-circle start" }, "取"),
  3306. vue.createElementVNode("view", { class: "route-line-vertical" }),
  3307. vue.createElementVNode("view", { class: "address-box" }, [
  3308. vue.createElementVNode(
  3309. "text",
  3310. { class: "addr-title" },
  3311. vue.toDisplayString(item.startLocation),
  3312. 1
  3313. /* TEXT */
  3314. ),
  3315. vue.createElementVNode(
  3316. "text",
  3317. { class: "addr-desc" },
  3318. vue.toDisplayString(item.startAddress),
  3319. 1
  3320. /* TEXT */
  3321. )
  3322. ]),
  3323. vue.createElementVNode("view", { class: "distance-tag" }, [
  3324. vue.createElementVNode(
  3325. "text",
  3326. null,
  3327. vue.toDisplayString(item.startDistance),
  3328. 1
  3329. /* TEXT */
  3330. ),
  3331. vue.createElementVNode("image", {
  3332. class: "nav-arrow",
  3333. src: _imports_3$2
  3334. })
  3335. ])
  3336. ], 8, ["onClick"]),
  3337. vue.createElementVNode("view", {
  3338. class: "route-item",
  3339. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  3340. }, [
  3341. vue.createElementVNode("view", { class: "icon-circle end" }, "送"),
  3342. vue.createElementVNode("view", { class: "address-box" }, [
  3343. vue.createElementVNode(
  3344. "text",
  3345. { class: "addr-title" },
  3346. vue.toDisplayString(item.endLocation),
  3347. 1
  3348. /* TEXT */
  3349. ),
  3350. vue.createElementVNode(
  3351. "text",
  3352. { class: "addr-desc" },
  3353. vue.toDisplayString(item.endAddress),
  3354. 1
  3355. /* TEXT */
  3356. )
  3357. ]),
  3358. vue.createElementVNode("view", { class: "distance-tag" }, [
  3359. vue.createElementVNode(
  3360. "text",
  3361. null,
  3362. vue.toDisplayString(item.endDistance),
  3363. 1
  3364. /* TEXT */
  3365. ),
  3366. vue.createElementVNode("image", {
  3367. class: "nav-arrow",
  3368. src: _imports_3$2
  3369. })
  3370. ])
  3371. ], 8, ["onClick"])
  3372. ],
  3373. 64
  3374. /* STABLE_FRAGMENT */
  3375. )) : (vue.openBlock(), vue.createElementBlock(
  3376. vue.Fragment,
  3377. { key: 1 },
  3378. [
  3379. vue.createElementVNode("view", {
  3380. class: "route-item",
  3381. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  3382. }, [
  3383. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  3384. vue.createElementVNode("view", { class: "address-box" }, [
  3385. vue.createElementVNode(
  3386. "text",
  3387. { class: "addr-title" },
  3388. vue.toDisplayString(item.endLocation),
  3389. 1
  3390. /* TEXT */
  3391. ),
  3392. vue.createElementVNode(
  3393. "text",
  3394. { class: "addr-desc" },
  3395. vue.toDisplayString(item.endAddress),
  3396. 1
  3397. /* TEXT */
  3398. )
  3399. ]),
  3400. vue.createElementVNode("view", { class: "distance-tag" }, [
  3401. vue.createElementVNode(
  3402. "text",
  3403. null,
  3404. vue.toDisplayString(item.endDistance),
  3405. 1
  3406. /* TEXT */
  3407. ),
  3408. vue.createElementVNode("image", {
  3409. class: "nav-arrow",
  3410. src: _imports_3$2
  3411. })
  3412. ])
  3413. ], 8, ["onClick"]),
  3414. item.serviceContent ? (vue.openBlock(), vue.createElementBlock("view", {
  3415. key: 0,
  3416. class: "service-content"
  3417. }, [
  3418. vue.createElementVNode("text", { class: "content-label" }, "服务内容:"),
  3419. vue.createElementVNode(
  3420. "text",
  3421. null,
  3422. vue.toDisplayString(item.serviceContent),
  3423. 1
  3424. /* TEXT */
  3425. )
  3426. ])) : vue.createCommentVNode("v-if", true)
  3427. ],
  3428. 64
  3429. /* STABLE_FRAGMENT */
  3430. ))
  3431. ]),
  3432. item.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  3433. key: 0,
  3434. class: "remark-box"
  3435. }, [
  3436. vue.createElementVNode(
  3437. "text",
  3438. null,
  3439. "备注:" + vue.toDisplayString(item.remark),
  3440. 1
  3441. /* TEXT */
  3442. )
  3443. ])) : vue.createCommentVNode("v-if", true)
  3444. ]),
  3445. vue.createElementVNode("view", { class: "action-btns" }, [
  3446. vue.createElementVNode("button", {
  3447. class: "btn reject",
  3448. onClick: vue.withModifiers(($event) => _ctx.openRejectModal(item), ["stop"])
  3449. }, "拒绝", 8, ["onClick"]),
  3450. vue.createElementVNode("button", {
  3451. class: "btn accept",
  3452. onClick: vue.withModifiers(($event) => _ctx.openAcceptModal(item), ["stop"])
  3453. }, "接单", 8, ["onClick"])
  3454. ])
  3455. ], 8, ["onClick"]);
  3456. }),
  3457. 128
  3458. /* KEYED_FRAGMENT */
  3459. )),
  3460. vue.createElementVNode("view", { style: { "height": "120rpx" } })
  3461. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  3462. key: 1,
  3463. class: "empty-state"
  3464. }, [
  3465. vue.createElementVNode("image", {
  3466. class: "empty-icon",
  3467. src: _imports_2$3,
  3468. mode: "aspectFit"
  3469. }),
  3470. vue.createElementVNode("text", { class: "empty-text" }, "当前处于休息中,暂时无法接单"),
  3471. vue.createElementVNode("button", {
  3472. class: "start-work-btn",
  3473. onClick: _cache[19] || (_cache[19] = (...args) => _ctx.startWork && _ctx.startWork(...args))
  3474. }, "开工接单")
  3475. ])),
  3476. _ctx.showConfirmModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3477. key: 2,
  3478. class: "modal-mask"
  3479. }, [
  3480. vue.createElementVNode("view", { class: "custom-modal" }, [
  3481. vue.createElementVNode("text", { class: "modal-title" }, "提示"),
  3482. vue.createElementVNode("text", { class: "modal-content" }, "是否确定结束休息,开始接单?"),
  3483. vue.createElementVNode("view", { class: "modal-btns" }, [
  3484. vue.createElementVNode("button", {
  3485. class: "modal-btn cancel",
  3486. onClick: _cache[20] || (_cache[20] = (...args) => _ctx.closeConfirmModal && _ctx.closeConfirmModal(...args))
  3487. }, "取消"),
  3488. vue.createElementVNode("button", {
  3489. class: "modal-btn confirm",
  3490. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.confirmStartWork && _ctx.confirmStartWork(...args))
  3491. }, "确定")
  3492. ])
  3493. ])
  3494. ])) : vue.createCommentVNode("v-if", true),
  3495. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3496. key: 3,
  3497. class: "pet-modal-mask",
  3498. onClick: _cache[25] || (_cache[25] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3499. }, [
  3500. vue.createElementVNode("view", {
  3501. class: "pet-modal-content",
  3502. onClick: _cache[24] || (_cache[24] = vue.withModifiers(() => {
  3503. }, ["stop"]))
  3504. }, [
  3505. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  3506. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  3507. vue.createElementVNode("view", {
  3508. class: "close-icon-btn",
  3509. onClick: _cache[22] || (_cache[22] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3510. }, "×")
  3511. ]),
  3512. vue.createElementVNode("scroll-view", {
  3513. "scroll-y": "",
  3514. class: "pet-modal-scroll"
  3515. }, [
  3516. vue.createElementVNode("view", { class: "pet-base-info" }, [
  3517. vue.createElementVNode("image", {
  3518. class: "pm-avatar",
  3519. src: _ctx.currentPetInfo.petAvatar,
  3520. mode: "aspectFill"
  3521. }, null, 8, ["src"]),
  3522. vue.createElementVNode("view", { class: "pm-info-text" }, [
  3523. vue.createElementVNode("view", { class: "pm-name-row" }, [
  3524. vue.createElementVNode(
  3525. "text",
  3526. { class: "pm-name" },
  3527. vue.toDisplayString(_ctx.currentPetInfo.petName),
  3528. 1
  3529. /* TEXT */
  3530. ),
  3531. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  3532. key: 0,
  3533. class: "pm-gender"
  3534. }, [
  3535. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  3536. vue.createElementVNode("text", null, "公")
  3537. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  3538. key: 1,
  3539. class: "pm-gender female"
  3540. }, [
  3541. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  3542. vue.createElementVNode("text", null, "母")
  3543. ])) : vue.createCommentVNode("v-if", true)
  3544. ]),
  3545. vue.createElementVNode(
  3546. "text",
  3547. { class: "pm-breed" },
  3548. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  3549. 1
  3550. /* TEXT */
  3551. )
  3552. ])
  3553. ]),
  3554. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  3555. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  3556. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  3557. vue.createElementVNode(
  3558. "text",
  3559. { class: "pm-val" },
  3560. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  3561. 1
  3562. /* TEXT */
  3563. )
  3564. ]),
  3565. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  3566. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  3567. vue.createElementVNode(
  3568. "text",
  3569. { class: "pm-val" },
  3570. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  3571. 1
  3572. /* TEXT */
  3573. )
  3574. ]),
  3575. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3576. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  3577. vue.createElementVNode(
  3578. "text",
  3579. { class: "pm-val" },
  3580. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  3581. 1
  3582. /* TEXT */
  3583. )
  3584. ]),
  3585. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3586. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  3587. vue.createElementVNode(
  3588. "text",
  3589. { class: "pm-val" },
  3590. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  3591. 1
  3592. /* TEXT */
  3593. )
  3594. ]),
  3595. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  3596. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  3597. vue.createElementVNode(
  3598. "text",
  3599. { class: "pm-val" },
  3600. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  3601. 1
  3602. /* TEXT */
  3603. )
  3604. ])
  3605. ]),
  3606. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  3607. key: 0,
  3608. class: "pm-tags"
  3609. }, [
  3610. (vue.openBlock(true), vue.createElementBlock(
  3611. vue.Fragment,
  3612. null,
  3613. vue.renderList(_ctx.currentPetInfo.petTags, (tag, index) => {
  3614. return vue.openBlock(), vue.createElementBlock(
  3615. "view",
  3616. {
  3617. class: "pm-tag",
  3618. key: index
  3619. },
  3620. vue.toDisplayString(tag),
  3621. 1
  3622. /* TEXT */
  3623. );
  3624. }),
  3625. 128
  3626. /* KEYED_FRAGMENT */
  3627. ))
  3628. ])) : vue.createCommentVNode("v-if", true),
  3629. vue.createElementVNode("view", { class: "pm-section-title" }, [
  3630. vue.createElementVNode("view", { class: "orange-bar" }),
  3631. vue.createElementVNode("text", null, "备注日志")
  3632. ]),
  3633. vue.createElementVNode("view", { class: "pm-log-list" }, [
  3634. (vue.openBlock(true), vue.createElementBlock(
  3635. vue.Fragment,
  3636. null,
  3637. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  3638. return vue.openBlock(), vue.createElementBlock("view", {
  3639. class: "pm-log-item",
  3640. key: lIndex
  3641. }, [
  3642. vue.createElementVNode(
  3643. "text",
  3644. { class: "pm-log-date" },
  3645. vue.toDisplayString(log.date),
  3646. 1
  3647. /* TEXT */
  3648. ),
  3649. vue.createElementVNode(
  3650. "text",
  3651. { class: "pm-log-text" },
  3652. vue.toDisplayString(log.content),
  3653. 1
  3654. /* TEXT */
  3655. ),
  3656. vue.createElementVNode(
  3657. "text",
  3658. { class: "pm-log-recorder" },
  3659. vue.toDisplayString(log.recorder === "系统记录" ? "" : "记录人: ") + vue.toDisplayString(log.recorder),
  3660. 1
  3661. /* TEXT */
  3662. )
  3663. ]);
  3664. }),
  3665. 128
  3666. /* KEYED_FRAGMENT */
  3667. ))
  3668. ]),
  3669. vue.createElementVNode("view", { style: { "height": "40rpx" } }),
  3670. vue.createElementVNode("button", {
  3671. class: "pm-bottom-close",
  3672. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  3673. }, "关闭"),
  3674. vue.createElementVNode("view", { style: { "height": "20rpx" } })
  3675. ])
  3676. ])
  3677. ])) : vue.createCommentVNode("v-if", true)
  3678. ]),
  3679. _ctx.showRejectModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3680. key: 0,
  3681. class: "modal-mask"
  3682. }, [
  3683. vue.createElementVNode("view", { class: "custom-modal" }, [
  3684. vue.createElementVNode("text", { class: "modal-title" }, "拒绝接单"),
  3685. vue.withDirectives(vue.createElementVNode(
  3686. "textarea",
  3687. {
  3688. class: "reject-textarea",
  3689. "onUpdate:modelValue": _cache[26] || (_cache[26] = ($event) => _ctx.rejectReason = $event),
  3690. placeholder: "请输入拒绝理由(必填)",
  3691. maxlength: "100"
  3692. },
  3693. null,
  3694. 512
  3695. /* NEED_PATCH */
  3696. ), [
  3697. [vue.vModelText, _ctx.rejectReason]
  3698. ]),
  3699. vue.createElementVNode("view", { class: "modal-btns mt-30" }, [
  3700. vue.createElementVNode("button", {
  3701. class: "modal-btn cancel",
  3702. onClick: _cache[27] || (_cache[27] = (...args) => _ctx.closeRejectModal && _ctx.closeRejectModal(...args))
  3703. }, "取消"),
  3704. vue.createElementVNode("button", {
  3705. class: "modal-btn confirm",
  3706. onClick: _cache[28] || (_cache[28] = (...args) => _ctx.confirmReject && _ctx.confirmReject(...args))
  3707. }, "提交")
  3708. ])
  3709. ])
  3710. ])) : vue.createCommentVNode("v-if", true),
  3711. _ctx.showAcceptConfirmModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3712. key: 1,
  3713. class: "modal-mask"
  3714. }, [
  3715. vue.createElementVNode("view", { class: "custom-modal" }, [
  3716. vue.createElementVNode("text", { class: "modal-title" }, "接单确认"),
  3717. vue.createElementVNode("view", { class: "modal-content-box" }, [
  3718. vue.createElementVNode("text", { class: "modal-content-main" }, "请确认是否接收此订单?"),
  3719. vue.createElementVNode("text", { class: "modal-content-sub" }, "接单后请尽快通过电话联系用户")
  3720. ]),
  3721. vue.createElementVNode("view", { class: "modal-btns mt-30" }, [
  3722. vue.createElementVNode("button", {
  3723. class: "modal-btn cancel",
  3724. onClick: _cache[29] || (_cache[29] = (...args) => _ctx.closeAcceptModal && _ctx.closeAcceptModal(...args))
  3725. }, "再想想"),
  3726. vue.createElementVNode("button", {
  3727. class: "modal-btn confirm",
  3728. onClick: _cache[30] || (_cache[30] = (...args) => _ctx.confirmAccept && _ctx.confirmAccept(...args))
  3729. }, "确认接单")
  3730. ])
  3731. ])
  3732. ])) : vue.createCommentVNode("v-if", true),
  3733. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  3734. key: 2,
  3735. class: "nav-modal-mask",
  3736. onClick: _cache[36] || (_cache[36] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  3737. }, [
  3738. vue.createElementVNode("view", {
  3739. class: "nav-action-sheet",
  3740. onClick: _cache[35] || (_cache[35] = vue.withModifiers(() => {
  3741. }, ["stop"]))
  3742. }, [
  3743. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  3744. vue.createElementVNode("view", {
  3745. class: "nav-sheet-item",
  3746. onClick: _cache[31] || (_cache[31] = ($event) => _ctx.chooseMap("高德"))
  3747. }, "高德地图"),
  3748. vue.createElementVNode("view", {
  3749. class: "nav-sheet-item",
  3750. onClick: _cache[32] || (_cache[32] = ($event) => _ctx.chooseMap("腾讯"))
  3751. }, "腾讯地图"),
  3752. vue.createElementVNode("view", {
  3753. class: "nav-sheet-item",
  3754. onClick: _cache[33] || (_cache[33] = ($event) => _ctx.chooseMap("百度"))
  3755. }, "百度地图"),
  3756. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  3757. vue.createElementVNode("view", {
  3758. class: "nav-sheet-item cancel",
  3759. onClick: _cache[34] || (_cache[34] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  3760. }, "取消")
  3761. ])
  3762. ])) : vue.createCommentVNode("v-if", true)
  3763. ],
  3764. 64
  3765. /* STABLE_FRAGMENT */
  3766. );
  3767. }
  3768. const PagesHomeIndex = /* @__PURE__ */ _export_sfc(_sfc_main$t, [["render", _sfc_render$s], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/home/index.vue"]]);
  3769. const _sfc_main$s = {
  3770. data() {
  3771. return {
  3772. status: "working"
  3773. // working | resting
  3774. };
  3775. },
  3776. onShow() {
  3777. const savedStatus = uni.getStorageSync("workStatus");
  3778. if (savedStatus) {
  3779. this.status = savedStatus;
  3780. }
  3781. },
  3782. methods: {
  3783. toggleStatus() {
  3784. if (this.status === "working") {
  3785. this.status = "resting";
  3786. uni.setStorageSync("workStatus", "resting");
  3787. } else {
  3788. this.status = "working";
  3789. uni.setStorageSync("workStatus", "working");
  3790. }
  3791. }
  3792. }
  3793. };
  3794. function _sfc_render$r(_ctx, _cache, $props, $setup, $data, $options) {
  3795. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  3796. vue.createElementVNode("view", { class: "signboard-container" }, [
  3797. vue.createElementVNode("view", { class: "rope" }),
  3798. vue.createElementVNode("view", { class: "nail" }),
  3799. vue.createElementVNode(
  3800. "view",
  3801. {
  3802. class: vue.normalizeClass(["board", { "resting": $data.status === "resting" }])
  3803. },
  3804. [
  3805. vue.createElementVNode("view", { class: "screw top-left" }),
  3806. vue.createElementVNode("view", { class: "screw top-right" }),
  3807. vue.createElementVNode("view", { class: "screw bottom-left" }),
  3808. vue.createElementVNode("view", { class: "screw bottom-right" }),
  3809. vue.createElementVNode("view", { class: "board-inner" }, [
  3810. vue.createElementVNode(
  3811. "text",
  3812. { class: "status-text" },
  3813. vue.toDisplayString($data.status === "working" ? "接单中" : "休息中"),
  3814. 1
  3815. /* TEXT */
  3816. )
  3817. ])
  3818. ],
  3819. 2
  3820. /* CLASS */
  3821. )
  3822. ]),
  3823. vue.createElementVNode("view", { class: "status-desc" }, [
  3824. vue.createElementVNode(
  3825. "text",
  3826. null,
  3827. vue.toDisplayString($data.status === "working" ? "当前处于工作接单中,正常接收新订单" : "当前处于休息状态,暂停接收新订单"),
  3828. 1
  3829. /* TEXT */
  3830. )
  3831. ]),
  3832. vue.createElementVNode("view", { class: "action-area" }, [
  3833. vue.createElementVNode(
  3834. "button",
  3835. {
  3836. class: vue.normalizeClass(["action-btn", { "stop": $data.status === "working", "stopped": $data.status === "resting" }]),
  3837. onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleStatus && $options.toggleStatus(...args))
  3838. },
  3839. vue.toDisplayString($data.status === "working" ? "停止接单" : "已停止接单"),
  3840. 3
  3841. /* TEXT, CLASS */
  3842. ),
  3843. vue.createElementVNode("view", { class: "tips" }, [
  3844. $data.status === "working" ? (vue.openBlock(), vue.createElementBlock("text", { key: 0 }, "当您希望长时间不再接收订单时,请点击上方按钮停止接单,开启后需手动恢复。")) : (vue.openBlock(), vue.createElementBlock("text", { key: 1 }, "点击上方按钮恢复接单,开始接收新的任务推送。"))
  3845. ])
  3846. ])
  3847. ]);
  3848. }
  3849. 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"]]);
  3850. const logic$2 = {
  3851. data() {
  3852. return {
  3853. currentTab: 0,
  3854. tabs: ["待接送/服务", "配送/服务中", "已完成", "已拒绝"],
  3855. typeFilterOptions: ["全部类型"],
  3856. currentTypeFilterIdx: 0,
  3857. activeDropdown: 0,
  3858. hasTimeFilter: false,
  3859. currentMonth: "2026年2月",
  3860. weekDays: ["日", "一", "二", "三", "四", "五", "六"],
  3861. calendarDays: [],
  3862. selectedDateRange: [],
  3863. allOrderList: [],
  3864. serviceList: [],
  3865. searchContent: "",
  3866. startServiceTime: "",
  3867. endServiceTime: "",
  3868. showPetModal: false,
  3869. currentPetInfo: {},
  3870. showNavModal: false,
  3871. navTargetItem: null,
  3872. navTargetPointType: "",
  3873. activeCallItem: null,
  3874. showRemarkInput: false,
  3875. remarkText: ""
  3876. };
  3877. },
  3878. created() {
  3879. this.initCalendar();
  3880. },
  3881. async onLoad() {
  3882. await this.loadServiceList();
  3883. await this.loadOrders();
  3884. },
  3885. onShow() {
  3886. this.loadOrders();
  3887. },
  3888. watch: {
  3889. currentTab() {
  3890. this.loadOrders();
  3891. },
  3892. currentTypeFilterIdx() {
  3893. this.loadOrders();
  3894. }
  3895. },
  3896. computed: {
  3897. orderList() {
  3898. return this.allOrderList;
  3899. }
  3900. },
  3901. methods: {
  3902. async loadServiceList() {
  3903. try {
  3904. const res = await getServiceList();
  3905. this.serviceList = res.data || [];
  3906. this.typeFilterOptions = ["全部类型", ...this.serviceList.map((s) => s.name)];
  3907. } catch (err) {
  3908. formatAppLog("error", "at pages/orders/logic.js:62", "获取服务类型失败:", err);
  3909. }
  3910. },
  3911. async loadOrders() {
  3912. var _a;
  3913. try {
  3914. const statusMap = { 0: 2, 1: 3, 2: 5, 3: null };
  3915. const serviceId = this.currentTypeFilterIdx > 0 ? (_a = this.serviceList[this.currentTypeFilterIdx - 1]) == null ? void 0 : _a.id : void 0;
  3916. const params = {
  3917. status: statusMap[this.currentTab],
  3918. content: this.searchContent || void 0,
  3919. service: serviceId,
  3920. startServiceTime: this.startServiceTime || void 0,
  3921. endServiceTime: this.endServiceTime || void 0
  3922. };
  3923. formatAppLog("log", "at pages/orders/logic.js:76", "订单列表请求参数:", params);
  3924. const res = await getMyOrders(params);
  3925. formatAppLog("log", "at pages/orders/logic.js:78", "订单列表响应:", res);
  3926. const orders = res.rows || [];
  3927. formatAppLog("log", "at pages/orders/logic.js:80", "订单数量:", orders.length);
  3928. this.allOrderList = orders.map((order) => this.transformOrder(order, this.currentTab));
  3929. } catch (err) {
  3930. formatAppLog("error", "at pages/orders/logic.js:83", "获取订单列表失败:", err);
  3931. this.allOrderList = [];
  3932. }
  3933. },
  3934. transformOrder(order, tabIndex) {
  3935. const service = this.serviceList.find((s) => s.id === order.service);
  3936. const serviceText = (service == null ? void 0 : service.name) || "未知";
  3937. const serviceIcon = (service == null ? void 0 : service.icon) || "/static/icons/car.svg";
  3938. const mode = (service == null ? void 0 : service.mode) || 0;
  3939. const isRoundTrip = mode === 1;
  3940. let statusText = "接单";
  3941. if (tabIndex === 0) {
  3942. statusText = "接单";
  3943. } else if (tabIndex === 1) {
  3944. statusText = isRoundTrip ? "出发" : "开始";
  3945. } else if (tabIndex === 2) {
  3946. statusText = "已完成";
  3947. } else if (tabIndex === 3) {
  3948. statusText = "已拒绝";
  3949. }
  3950. return {
  3951. id: order.id,
  3952. type: isRoundTrip ? 1 : 2,
  3953. typeText: serviceText,
  3954. typeIcon: serviceIcon,
  3955. statusText,
  3956. price: (order.price / 100).toFixed(2),
  3957. timeLabel: isRoundTrip ? "取货时间" : "服务时间",
  3958. time: order.serviceTime || "",
  3959. petAvatar: "/static/dog.png",
  3960. petName: order.petName || "",
  3961. petBreed: order.breed || "",
  3962. startLocation: order.fromAddress || "",
  3963. startAddress: order.fromAddress || "",
  3964. startDistance: "0km",
  3965. endLocation: (order.customerName || "") + " " + (order.customerPhone || ""),
  3966. endAddress: order.toAddress || "",
  3967. endDistance: "0km",
  3968. serviceContent: order.remark || "",
  3969. remark: order.remark || ""
  3970. };
  3971. },
  3972. getDisplayStatus(item) {
  3973. if (item.statusText === "已完成")
  3974. return "已完成";
  3975. if (item.statusText === "已拒绝")
  3976. return "已拒绝";
  3977. if (item.statusText === "接单") {
  3978. return item.type === 1 ? "待接送" : "待服务";
  3979. }
  3980. return item.type === 1 ? "配送中" : "服务中";
  3981. },
  3982. getStatusClass(item) {
  3983. let display = this.getDisplayStatus(item);
  3984. if (display === "已完成")
  3985. return "finish";
  3986. if (display === "已拒绝")
  3987. return "reject";
  3988. if (display === "配送中" || display === "服务中")
  3989. return "processing";
  3990. return "highlight";
  3991. },
  3992. goToDetail(item) {
  3993. uni.navigateTo({ url: `/pages/orders/detail?id=${item.id}` });
  3994. },
  3995. showPetProfile(item) {
  3996. this.currentPetInfo = {
  3997. ...item,
  3998. petGender: "M",
  3999. petAge: "2岁",
  4000. petWeight: "15kg",
  4001. petPersonality: "活泼亲人,精力旺盛",
  4002. petHobby: "喜欢追飞盘,爱吃肉干",
  4003. petRemark: "肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。",
  4004. petTags: ["拉响警报", "不能吃鸡肉", "精力旺盛"],
  4005. petLogs: [
  4006. { date: "2026-02-09 14:00", content: "今天遛弯拉了两次粑粑,精神状态很好。", recorder: "王阿姨" },
  4007. { date: "2026-02-08 10:30", content: "有些挑食,剩了小半碗狗粮。", recorder: "李师傅" },
  4008. { date: "2026-02-05 09:00", content: "建档。", recorder: "系统记录" }
  4009. ]
  4010. };
  4011. this.showPetModal = true;
  4012. },
  4013. closePetProfile() {
  4014. this.showPetModal = false;
  4015. },
  4016. openNavigation(item, pointType) {
  4017. this.navTargetItem = item;
  4018. this.navTargetPointType = pointType;
  4019. this.showNavModal = true;
  4020. },
  4021. closeNavModal() {
  4022. this.showNavModal = false;
  4023. },
  4024. chooseMap(mapType) {
  4025. let item = this.navTargetItem;
  4026. let pointType = this.navTargetPointType;
  4027. let name = pointType === "start" ? item.startLocation : item.endLocation;
  4028. let address = pointType === "start" ? item.startAddress : item.endAddress;
  4029. this.showNavModal = false;
  4030. uni.openLocation({
  4031. latitude: 30.52,
  4032. longitude: 114.31,
  4033. name: name || "目的地",
  4034. address: address || "默认地址",
  4035. success: function() {
  4036. formatAppLog("log", "at pages/orders/logic.js:186", "打开导航成功: " + mapType);
  4037. }
  4038. });
  4039. },
  4040. toggleCallMenu(item) {
  4041. if (this.activeCallItem === item) {
  4042. this.activeCallItem = null;
  4043. } else {
  4044. this.activeCallItem = item;
  4045. }
  4046. },
  4047. closeCallMenu() {
  4048. this.activeCallItem = null;
  4049. },
  4050. doCall(type) {
  4051. let phoneNum = "";
  4052. if (type === "merchant") {
  4053. phoneNum = "18900008451";
  4054. } else if (type === "customer") {
  4055. phoneNum = "13800000001";
  4056. }
  4057. if (phoneNum) {
  4058. uni.makePhoneCall({ phoneNumber: phoneNum });
  4059. }
  4060. this.activeCallItem = null;
  4061. },
  4062. reportAbnormal(item) {
  4063. uni.navigateTo({ url: "/pages/orders/anomaly?orderId=" + (item.id || "") });
  4064. },
  4065. toggleDropdown(idx) {
  4066. if (this.activeDropdown === idx) {
  4067. this.activeDropdown = 0;
  4068. } else {
  4069. this.activeDropdown = idx;
  4070. }
  4071. },
  4072. closeDropdown() {
  4073. this.activeDropdown = 0;
  4074. },
  4075. selectType(index) {
  4076. this.currentTypeFilterIdx = index;
  4077. this.closeDropdown();
  4078. },
  4079. initCalendar() {
  4080. let days = [];
  4081. for (let i = 1; i <= 28; i++) {
  4082. days.push(i);
  4083. }
  4084. this.calendarDays = days;
  4085. this.selectedDateRange = [2, 4];
  4086. },
  4087. prevMonth() {
  4088. uni.showToast({ title: "上个月", icon: "none" });
  4089. },
  4090. nextMonth() {
  4091. uni.showToast({ title: "下个月", icon: "none" });
  4092. },
  4093. selectDateItem(day) {
  4094. if (this.selectedDateRange.length === 2) {
  4095. this.selectedDateRange = [day];
  4096. } else if (this.selectedDateRange.length === 1) {
  4097. let start = this.selectedDateRange[0];
  4098. if (day > start) {
  4099. this.selectedDateRange = [start, day];
  4100. } else if (day < start) {
  4101. this.selectedDateRange = [day, start];
  4102. } else {
  4103. this.selectedDateRange = [];
  4104. }
  4105. } else {
  4106. this.selectedDateRange = [day];
  4107. }
  4108. },
  4109. getDateClass(day) {
  4110. if (this.selectedDateRange.length === 0)
  4111. return "";
  4112. if (this.selectedDateRange.length === 1) {
  4113. return day === this.selectedDateRange[0] ? "is-start" : "";
  4114. }
  4115. let start = this.selectedDateRange[0];
  4116. let end = this.selectedDateRange[1];
  4117. if (day === start)
  4118. return "is-start";
  4119. if (day === end)
  4120. return "is-end";
  4121. if (day > start && day < end)
  4122. return "is-between";
  4123. return "";
  4124. },
  4125. resetTimeFilter() {
  4126. this.hasTimeFilter = false;
  4127. this.selectedDateRange = [];
  4128. uni.showToast({ title: "已重置服务时间", icon: "none" });
  4129. this.closeDropdown();
  4130. },
  4131. confirmTimeFilter() {
  4132. if (this.selectedDateRange.length === 0) {
  4133. uni.showToast({ title: "请先选择日期", icon: "none" });
  4134. return;
  4135. }
  4136. let text = this.selectedDateRange.length === 2 ? `${this.selectedDateRange[0]}日-${this.selectedDateRange[1]}日` : `${this.selectedDateRange[0]}日`;
  4137. uni.showToast({ title: "已应用: " + text, icon: "none" });
  4138. this.hasTimeFilter = true;
  4139. this.closeDropdown();
  4140. },
  4141. getMainActionText(item) {
  4142. return "查看详情";
  4143. },
  4144. mainAction(item) {
  4145. uni.navigateTo({ url: `/pages/orders/detail?id=${item.id}` });
  4146. },
  4147. openRemarkInput() {
  4148. this.remarkText = "";
  4149. this.showRemarkInput = true;
  4150. },
  4151. closeRemarkInput() {
  4152. this.showRemarkInput = false;
  4153. this.remarkText = "";
  4154. },
  4155. submitRemark() {
  4156. const text = this.remarkText.trim();
  4157. if (!text) {
  4158. uni.showToast({ title: "备注内容不能为空", icon: "none" });
  4159. return;
  4160. }
  4161. const now = /* @__PURE__ */ new Date();
  4162. 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")}`;
  4163. if (!this.currentPetInfo.petLogs) {
  4164. this.$set(this.currentPetInfo, "petLogs", []);
  4165. }
  4166. this.currentPetInfo.petLogs.unshift({
  4167. date: dateStr,
  4168. content: text,
  4169. recorder: "我"
  4170. });
  4171. uni.showToast({ title: "备注已添加", icon: "success" });
  4172. this.closeRemarkInput();
  4173. }
  4174. }
  4175. };
  4176. const _sfc_main$r = {
  4177. ...logic$2
  4178. };
  4179. function _sfc_render$q(_ctx, _cache, $props, $setup, $data, $options) {
  4180. return vue.openBlock(), vue.createElementBlock(
  4181. vue.Fragment,
  4182. null,
  4183. [
  4184. vue.createElementVNode("view", { class: "container" }, [
  4185. vue.createElementVNode("view", { class: "sticky-header" }, [
  4186. vue.createElementVNode("view", { class: "status-tabs" }, [
  4187. (vue.openBlock(true), vue.createElementBlock(
  4188. vue.Fragment,
  4189. null,
  4190. vue.renderList(_ctx.tabs, (tab, index) => {
  4191. return vue.openBlock(), vue.createElementBlock("view", {
  4192. class: vue.normalizeClass(["tab-item", { active: _ctx.currentTab === index }]),
  4193. key: index,
  4194. onClick: ($event) => _ctx.currentTab = index
  4195. }, [
  4196. vue.createElementVNode(
  4197. "text",
  4198. null,
  4199. vue.toDisplayString(tab),
  4200. 1
  4201. /* TEXT */
  4202. ),
  4203. _ctx.currentTab === index ? (vue.openBlock(), vue.createElementBlock("view", {
  4204. key: 0,
  4205. class: "indicator"
  4206. })) : vue.createCommentVNode("v-if", true)
  4207. ], 10, ["onClick"]);
  4208. }),
  4209. 128
  4210. /* KEYED_FRAGMENT */
  4211. ))
  4212. ]),
  4213. vue.createElementVNode("view", { class: "search-bar" }, [
  4214. vue.createElementVNode("view", { class: "search-input-box" }, [
  4215. vue.createElementVNode("input", {
  4216. class: "search-input",
  4217. placeholder: "搜索地址/电话/姓名",
  4218. "placeholder-class": "ph-style"
  4219. })
  4220. ])
  4221. ]),
  4222. vue.createElementVNode("view", { class: "filter-wrapper" }, [
  4223. vue.createElementVNode("view", { class: "filter-bar" }, [
  4224. vue.createElementVNode(
  4225. "view",
  4226. {
  4227. class: vue.normalizeClass(["filter-item", { "active": _ctx.activeDropdown === 1 }]),
  4228. onClick: _cache[0] || (_cache[0] = ($event) => _ctx.toggleDropdown(1))
  4229. },
  4230. [
  4231. vue.createElementVNode(
  4232. "text",
  4233. {
  4234. class: vue.normalizeClass({ "active-text": _ctx.activeDropdown === 1 || _ctx.currentTypeFilterIdx > 0 })
  4235. },
  4236. vue.toDisplayString(_ctx.currentTypeFilterIdx > 0 ? _ctx.typeFilterOptions[_ctx.currentTypeFilterIdx] : "全部类型"),
  4237. 3
  4238. /* TEXT, CLASS */
  4239. ),
  4240. vue.createElementVNode(
  4241. "view",
  4242. {
  4243. class: vue.normalizeClass(["triangle", _ctx.activeDropdown === 1 ? "up" : "down"])
  4244. },
  4245. null,
  4246. 2
  4247. /* CLASS */
  4248. )
  4249. ],
  4250. 2
  4251. /* CLASS */
  4252. ),
  4253. vue.createElementVNode(
  4254. "view",
  4255. {
  4256. class: vue.normalizeClass(["filter-item", { "active": _ctx.activeDropdown === 2 }]),
  4257. onClick: _cache[1] || (_cache[1] = ($event) => _ctx.toggleDropdown(2))
  4258. },
  4259. [
  4260. vue.createElementVNode(
  4261. "text",
  4262. {
  4263. class: vue.normalizeClass({ "active-text": _ctx.activeDropdown === 2 || _ctx.hasTimeFilter })
  4264. },
  4265. "服务时间",
  4266. 2
  4267. /* CLASS */
  4268. ),
  4269. vue.createElementVNode(
  4270. "view",
  4271. {
  4272. class: vue.normalizeClass(["triangle", _ctx.activeDropdown === 2 ? "up" : "down"])
  4273. },
  4274. null,
  4275. 2
  4276. /* CLASS */
  4277. )
  4278. ],
  4279. 2
  4280. /* CLASS */
  4281. )
  4282. ]),
  4283. _ctx.activeDropdown !== 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  4284. key: 0,
  4285. class: "dropdown-mask",
  4286. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.closeDropdown && _ctx.closeDropdown(...args))
  4287. })) : vue.createCommentVNode("v-if", true),
  4288. _ctx.activeDropdown === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  4289. key: 1,
  4290. class: "dropdown-panel"
  4291. }, [
  4292. (vue.openBlock(true), vue.createElementBlock(
  4293. vue.Fragment,
  4294. null,
  4295. vue.renderList(_ctx.typeFilterOptions, (item, index) => {
  4296. return vue.openBlock(), vue.createElementBlock("view", {
  4297. class: vue.normalizeClass(["type-option", { "selected": _ctx.currentTypeFilterIdx === index }]),
  4298. key: index,
  4299. onClick: ($event) => _ctx.selectType(index)
  4300. }, [
  4301. vue.createElementVNode(
  4302. "text",
  4303. null,
  4304. vue.toDisplayString(item),
  4305. 1
  4306. /* TEXT */
  4307. )
  4308. ], 10, ["onClick"]);
  4309. }),
  4310. 128
  4311. /* KEYED_FRAGMENT */
  4312. ))
  4313. ])) : vue.createCommentVNode("v-if", true),
  4314. _ctx.activeDropdown === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  4315. key: 2,
  4316. class: "dropdown-panel calendar-panel"
  4317. }, [
  4318. vue.createElementVNode("view", { class: "custom-calendar-container" }, [
  4319. vue.createElementVNode("view", { class: "cal-header" }, [
  4320. vue.createElementVNode("text", {
  4321. class: "cal-nav-btn",
  4322. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.prevMonth && _ctx.prevMonth(...args))
  4323. }, "‹"),
  4324. vue.createElementVNode(
  4325. "text",
  4326. { class: "cal-title" },
  4327. vue.toDisplayString(_ctx.currentMonth),
  4328. 1
  4329. /* TEXT */
  4330. ),
  4331. vue.createElementVNode("text", {
  4332. class: "cal-nav-btn",
  4333. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.nextMonth && _ctx.nextMonth(...args))
  4334. }, "›")
  4335. ]),
  4336. vue.createElementVNode("view", { class: "cal-weekdays" }, [
  4337. (vue.openBlock(true), vue.createElementBlock(
  4338. vue.Fragment,
  4339. null,
  4340. vue.renderList(_ctx.weekDays, (wk, idx) => {
  4341. return vue.openBlock(), vue.createElementBlock(
  4342. "text",
  4343. {
  4344. key: idx,
  4345. class: "wk-item"
  4346. },
  4347. vue.toDisplayString(wk),
  4348. 1
  4349. /* TEXT */
  4350. );
  4351. }),
  4352. 128
  4353. /* KEYED_FRAGMENT */
  4354. ))
  4355. ]),
  4356. vue.createElementVNode("view", { class: "cal-body" }, [
  4357. (vue.openBlock(true), vue.createElementBlock(
  4358. vue.Fragment,
  4359. null,
  4360. vue.renderList(_ctx.calendarDays, (day, idx) => {
  4361. return vue.openBlock(), vue.createElementBlock("view", {
  4362. key: idx,
  4363. class: vue.normalizeClass(["cal-day-box", _ctx.getDateClass(day)]),
  4364. onClick: ($event) => _ctx.selectDateItem(day)
  4365. }, [
  4366. vue.createElementVNode(
  4367. "view",
  4368. { class: "cal-day-text" },
  4369. vue.toDisplayString(day),
  4370. 1
  4371. /* TEXT */
  4372. )
  4373. ], 10, ["onClick"]);
  4374. }),
  4375. 128
  4376. /* KEYED_FRAGMENT */
  4377. ))
  4378. ])
  4379. ]),
  4380. vue.createElementVNode("view", { class: "calendar-actions" }, [
  4381. vue.createElementVNode("button", {
  4382. class: "cal-btn reset",
  4383. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.resetTimeFilter && _ctx.resetTimeFilter(...args))
  4384. }, "重置"),
  4385. vue.createElementVNode("button", {
  4386. class: "cal-btn confirm",
  4387. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.confirmTimeFilter && _ctx.confirmTimeFilter(...args))
  4388. }, "确定")
  4389. ])
  4390. ])) : vue.createCommentVNode("v-if", true)
  4391. ])
  4392. ]),
  4393. vue.createElementVNode("scroll-view", {
  4394. "scroll-y": "",
  4395. class: "order-list"
  4396. }, [
  4397. (vue.openBlock(true), vue.createElementBlock(
  4398. vue.Fragment,
  4399. null,
  4400. vue.renderList(_ctx.orderList, (item, index) => {
  4401. return vue.openBlock(), vue.createElementBlock("view", {
  4402. class: "order-card",
  4403. key: index,
  4404. onClick: ($event) => _ctx.goToDetail(item)
  4405. }, [
  4406. vue.createElementVNode("view", { class: "card-header" }, [
  4407. vue.createElementVNode("view", { class: "type-badge" }, [
  4408. vue.createElementVNode("image", {
  4409. class: "type-icon",
  4410. src: item.typeIcon
  4411. }, null, 8, ["src"]),
  4412. vue.createElementVNode(
  4413. "text",
  4414. { class: "type-text" },
  4415. vue.toDisplayString(item.typeText),
  4416. 1
  4417. /* TEXT */
  4418. )
  4419. ]),
  4420. vue.createElementVNode(
  4421. "text",
  4422. {
  4423. class: vue.normalizeClass(["status-badge", _ctx.getStatusClass(item)])
  4424. },
  4425. vue.toDisplayString(_ctx.getDisplayStatus(item)),
  4426. 3
  4427. /* TEXT, CLASS */
  4428. )
  4429. ]),
  4430. vue.createElementVNode("view", { class: "card-body" }, [
  4431. vue.createElementVNode("view", { class: "time-row" }, [
  4432. vue.createElementVNode("view", { class: "time-col" }, [
  4433. vue.createElementVNode(
  4434. "text",
  4435. { class: "label" },
  4436. vue.toDisplayString(item.timeLabel) + ":",
  4437. 1
  4438. /* TEXT */
  4439. ),
  4440. vue.createElementVNode(
  4441. "text",
  4442. { class: "value" },
  4443. vue.toDisplayString(item.time),
  4444. 1
  4445. /* TEXT */
  4446. )
  4447. ]),
  4448. vue.createElementVNode(
  4449. "text",
  4450. { class: "price" },
  4451. "¥" + vue.toDisplayString(item.price),
  4452. 1
  4453. /* TEXT */
  4454. )
  4455. ]),
  4456. vue.createElementVNode("view", { class: "pet-card" }, [
  4457. vue.createElementVNode("image", {
  4458. class: "pet-avatar",
  4459. src: item.petAvatar,
  4460. mode: "aspectFill"
  4461. }, null, 8, ["src"]),
  4462. vue.createElementVNode("view", { class: "pet-info" }, [
  4463. vue.createElementVNode(
  4464. "text",
  4465. { class: "pet-name" },
  4466. vue.toDisplayString(item.petName),
  4467. 1
  4468. /* TEXT */
  4469. ),
  4470. vue.createElementVNode(
  4471. "text",
  4472. { class: "pet-breed" },
  4473. "品种: " + vue.toDisplayString(item.petBreed),
  4474. 1
  4475. /* TEXT */
  4476. )
  4477. ]),
  4478. vue.createElementVNode("view", {
  4479. class: "pet-profile-btn",
  4480. onClick: vue.withModifiers(($event) => _ctx.showPetProfile(item), ["stop"])
  4481. }, "宠物档案", 8, ["onClick"])
  4482. ]),
  4483. vue.createElementVNode("view", { class: "route-info" }, [
  4484. item.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  4485. vue.Fragment,
  4486. { key: 0 },
  4487. [
  4488. vue.createElementVNode("view", {
  4489. class: "route-item",
  4490. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "start"), ["stop"])
  4491. }, [
  4492. vue.createElementVNode("view", { class: "icon-circle start" }, "起"),
  4493. vue.createElementVNode("view", { class: "route-line-vertical" }),
  4494. vue.createElementVNode("view", { class: "address-box" }, [
  4495. vue.createElementVNode(
  4496. "text",
  4497. { class: "addr-title" },
  4498. vue.toDisplayString(item.startLocation),
  4499. 1
  4500. /* TEXT */
  4501. ),
  4502. vue.createElementVNode(
  4503. "text",
  4504. { class: "addr-desc" },
  4505. vue.toDisplayString(item.startAddress),
  4506. 1
  4507. /* TEXT */
  4508. )
  4509. ]),
  4510. vue.createElementVNode("view", { class: "distance-tag" }, [
  4511. vue.createElementVNode(
  4512. "text",
  4513. { class: "distance-text" },
  4514. vue.toDisplayString(item.startDistance),
  4515. 1
  4516. /* TEXT */
  4517. ),
  4518. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4519. vue.createElementVNode("image", {
  4520. class: "nav-arrow",
  4521. src: _imports_3$2
  4522. })
  4523. ])
  4524. ])
  4525. ], 8, ["onClick"]),
  4526. vue.createElementVNode("view", {
  4527. class: "route-item",
  4528. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  4529. }, [
  4530. vue.createElementVNode("view", { class: "icon-circle end" }, "终"),
  4531. vue.createElementVNode("view", { class: "address-box" }, [
  4532. vue.createElementVNode(
  4533. "text",
  4534. { class: "addr-title" },
  4535. vue.toDisplayString(item.endLocation),
  4536. 1
  4537. /* TEXT */
  4538. ),
  4539. vue.createElementVNode(
  4540. "text",
  4541. { class: "addr-desc" },
  4542. vue.toDisplayString(item.endAddress),
  4543. 1
  4544. /* TEXT */
  4545. )
  4546. ]),
  4547. vue.createElementVNode("view", { class: "distance-tag" }, [
  4548. vue.createElementVNode(
  4549. "text",
  4550. { class: "distance-text" },
  4551. vue.toDisplayString(item.endDistance),
  4552. 1
  4553. /* TEXT */
  4554. ),
  4555. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4556. vue.createElementVNode("image", {
  4557. class: "nav-arrow",
  4558. src: _imports_3$2
  4559. })
  4560. ])
  4561. ])
  4562. ], 8, ["onClick"])
  4563. ],
  4564. 64
  4565. /* STABLE_FRAGMENT */
  4566. )) : (vue.openBlock(), vue.createElementBlock(
  4567. vue.Fragment,
  4568. { key: 1 },
  4569. [
  4570. vue.createElementVNode("view", {
  4571. class: "route-item",
  4572. onClick: vue.withModifiers(($event) => _ctx.openNavigation(item, "end"), ["stop"])
  4573. }, [
  4574. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  4575. vue.createElementVNode("view", { class: "address-box" }, [
  4576. vue.createElementVNode(
  4577. "text",
  4578. { class: "addr-title" },
  4579. vue.toDisplayString(item.endLocation),
  4580. 1
  4581. /* TEXT */
  4582. ),
  4583. vue.createElementVNode(
  4584. "text",
  4585. { class: "addr-desc" },
  4586. vue.toDisplayString(item.endAddress),
  4587. 1
  4588. /* TEXT */
  4589. )
  4590. ]),
  4591. vue.createElementVNode("view", { class: "distance-tag" }, [
  4592. vue.createElementVNode(
  4593. "text",
  4594. { class: "distance-text" },
  4595. vue.toDisplayString(item.endDistance),
  4596. 1
  4597. /* TEXT */
  4598. ),
  4599. vue.createElementVNode("view", { class: "nav-icon-circle" }, [
  4600. vue.createElementVNode("image", {
  4601. class: "nav-arrow",
  4602. src: _imports_3$2
  4603. })
  4604. ])
  4605. ])
  4606. ], 8, ["onClick"]),
  4607. item.serviceContent ? (vue.openBlock(), vue.createElementBlock("view", {
  4608. key: 0,
  4609. class: "service-content"
  4610. }, [
  4611. vue.createElementVNode("text", { class: "content-label" }, "服务内容:"),
  4612. vue.createElementVNode(
  4613. "text",
  4614. null,
  4615. vue.toDisplayString(item.serviceContent),
  4616. 1
  4617. /* TEXT */
  4618. )
  4619. ])) : vue.createCommentVNode("v-if", true)
  4620. ],
  4621. 64
  4622. /* STABLE_FRAGMENT */
  4623. ))
  4624. ]),
  4625. item.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  4626. key: 0,
  4627. class: "remark-box"
  4628. }, [
  4629. vue.createElementVNode(
  4630. "text",
  4631. null,
  4632. "备注:" + vue.toDisplayString(item.remark),
  4633. 1
  4634. /* TEXT */
  4635. )
  4636. ])) : vue.createCommentVNode("v-if", true)
  4637. ]),
  4638. ["接单", "到达", "出发", "开始", "送达", "结束"].includes(item.statusText) ? (vue.openBlock(), vue.createElementBlock("view", {
  4639. key: 0,
  4640. class: "action-btns"
  4641. }, [
  4642. vue.createElementVNode("view", { class: "action-left" }, [
  4643. vue.createElementVNode("button", {
  4644. class: "btn normal",
  4645. onClick: vue.withModifiers(($event) => _ctx.toggleCallMenu(item), ["stop"])
  4646. }, "一键拨号", 8, ["onClick"]),
  4647. _ctx.activeCallItem === item ? (vue.openBlock(), vue.createElementBlock("view", {
  4648. key: 0,
  4649. class: "call-popover",
  4650. onClick: _cache[9] || (_cache[9] = vue.withModifiers(() => {
  4651. }, ["stop"]))
  4652. }, [
  4653. vue.createElementVNode("view", {
  4654. class: "call-pop-item",
  4655. onClick: _cache[7] || (_cache[7] = ($event) => _ctx.doCall("merchant"))
  4656. }, "联系商家"),
  4657. vue.createElementVNode("view", {
  4658. class: "call-pop-item",
  4659. onClick: _cache[8] || (_cache[8] = ($event) => _ctx.doCall("customer"))
  4660. }, "联系客户")
  4661. ])) : vue.createCommentVNode("v-if", true)
  4662. ]),
  4663. vue.createElementVNode("view", { class: "action-right" }, [
  4664. vue.createElementVNode("button", {
  4665. class: "btn normal",
  4666. onClick: vue.withModifiers(($event) => _ctx.reportAbnormal(item), ["stop"])
  4667. }, "异常上报", 8, ["onClick"]),
  4668. vue.createElementVNode("button", {
  4669. class: "btn primary",
  4670. onClick: vue.withModifiers(($event) => _ctx.mainAction(item), ["stop"])
  4671. }, vue.toDisplayString(_ctx.getMainActionText(item)), 9, ["onClick"])
  4672. ])
  4673. ])) : vue.createCommentVNode("v-if", true)
  4674. ], 8, ["onClick"]);
  4675. }),
  4676. 128
  4677. /* KEYED_FRAGMENT */
  4678. )),
  4679. vue.createElementVNode("view", { class: "loading-text" }, "已加载完"),
  4680. vue.createElementVNode("view", { style: { "height": "160rpx" } })
  4681. ]),
  4682. _ctx.activeCallItem ? (vue.openBlock(), vue.createElementBlock("view", {
  4683. key: 0,
  4684. class: "call-mask",
  4685. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.closeCallMenu && _ctx.closeCallMenu(...args))
  4686. })) : vue.createCommentVNode("v-if", true)
  4687. ]),
  4688. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  4689. key: 0,
  4690. class: "pet-modal-mask",
  4691. onClick: _cache[14] || (_cache[14] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  4692. }, [
  4693. vue.createElementVNode("view", {
  4694. class: "pet-modal-content",
  4695. onClick: _cache[13] || (_cache[13] = vue.withModifiers(() => {
  4696. }, ["stop"]))
  4697. }, [
  4698. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  4699. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  4700. vue.createElementVNode("view", { class: "pm-header-actions" }, [
  4701. vue.createElementVNode("view", {
  4702. class: "pm-remark-btn",
  4703. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.openRemarkInput && _ctx.openRemarkInput(...args))
  4704. }, "备注"),
  4705. vue.createElementVNode("view", {
  4706. class: "close-icon-btn",
  4707. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  4708. }, "×")
  4709. ])
  4710. ]),
  4711. vue.createElementVNode("scroll-view", {
  4712. "scroll-y": "",
  4713. class: "pet-modal-scroll"
  4714. }, [
  4715. vue.createElementVNode("view", { class: "pet-base-info" }, [
  4716. vue.createElementVNode("image", {
  4717. class: "pm-avatar",
  4718. src: _ctx.currentPetInfo.petAvatar,
  4719. mode: "aspectFill"
  4720. }, null, 8, ["src"]),
  4721. vue.createElementVNode("view", { class: "pm-info-text" }, [
  4722. vue.createElementVNode("view", { class: "pm-name-row" }, [
  4723. vue.createElementVNode(
  4724. "text",
  4725. { class: "pm-name" },
  4726. vue.toDisplayString(_ctx.currentPetInfo.petName),
  4727. 1
  4728. /* TEXT */
  4729. ),
  4730. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  4731. key: 0,
  4732. class: "pm-gender"
  4733. }, [
  4734. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  4735. vue.createElementVNode("text", null, "公")
  4736. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  4737. key: 1,
  4738. class: "pm-gender female"
  4739. }, [
  4740. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  4741. vue.createElementVNode("text", null, "母")
  4742. ])) : vue.createCommentVNode("v-if", true)
  4743. ]),
  4744. vue.createElementVNode(
  4745. "text",
  4746. { class: "pm-breed" },
  4747. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  4748. 1
  4749. /* TEXT */
  4750. )
  4751. ])
  4752. ]),
  4753. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  4754. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  4755. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  4756. vue.createElementVNode(
  4757. "text",
  4758. { class: "pm-val" },
  4759. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  4760. 1
  4761. /* TEXT */
  4762. )
  4763. ]),
  4764. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  4765. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  4766. vue.createElementVNode(
  4767. "text",
  4768. { class: "pm-val" },
  4769. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  4770. 1
  4771. /* TEXT */
  4772. )
  4773. ]),
  4774. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4775. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  4776. vue.createElementVNode(
  4777. "text",
  4778. { class: "pm-val" },
  4779. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  4780. 1
  4781. /* TEXT */
  4782. )
  4783. ]),
  4784. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4785. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  4786. vue.createElementVNode(
  4787. "text",
  4788. { class: "pm-val" },
  4789. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  4790. 1
  4791. /* TEXT */
  4792. )
  4793. ]),
  4794. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  4795. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  4796. vue.createElementVNode(
  4797. "text",
  4798. { class: "pm-val" },
  4799. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  4800. 1
  4801. /* TEXT */
  4802. )
  4803. ])
  4804. ]),
  4805. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  4806. key: 0,
  4807. class: "pm-tags"
  4808. }, [
  4809. (vue.openBlock(true), vue.createElementBlock(
  4810. vue.Fragment,
  4811. null,
  4812. vue.renderList(_ctx.currentPetInfo.petTags, (tag, index) => {
  4813. return vue.openBlock(), vue.createElementBlock(
  4814. "view",
  4815. {
  4816. class: "pm-tag",
  4817. key: index
  4818. },
  4819. vue.toDisplayString(tag),
  4820. 1
  4821. /* TEXT */
  4822. );
  4823. }),
  4824. 128
  4825. /* KEYED_FRAGMENT */
  4826. ))
  4827. ])) : vue.createCommentVNode("v-if", true),
  4828. vue.createElementVNode("view", { class: "pm-section-title" }, [
  4829. vue.createElementVNode("view", { class: "orange-bar" }),
  4830. vue.createElementVNode("text", null, "备注日志")
  4831. ]),
  4832. vue.createElementVNode("view", { class: "pm-log-list" }, [
  4833. (vue.openBlock(true), vue.createElementBlock(
  4834. vue.Fragment,
  4835. null,
  4836. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  4837. return vue.openBlock(), vue.createElementBlock("view", {
  4838. class: "pm-log-item",
  4839. key: lIndex
  4840. }, [
  4841. vue.createElementVNode(
  4842. "text",
  4843. { class: "pm-log-date" },
  4844. vue.toDisplayString(log.date),
  4845. 1
  4846. /* TEXT */
  4847. ),
  4848. vue.createElementVNode(
  4849. "text",
  4850. { class: "pm-log-text" },
  4851. vue.toDisplayString(log.content),
  4852. 1
  4853. /* TEXT */
  4854. ),
  4855. vue.createElementVNode(
  4856. "text",
  4857. { class: "pm-log-recorder" },
  4858. vue.toDisplayString(log.recorder === "系统记录" ? "" : "记录人: ") + vue.toDisplayString(log.recorder),
  4859. 1
  4860. /* TEXT */
  4861. )
  4862. ]);
  4863. }),
  4864. 128
  4865. /* KEYED_FRAGMENT */
  4866. ))
  4867. ]),
  4868. vue.createElementVNode("view", { style: { "height": "30rpx" } })
  4869. ])
  4870. ])
  4871. ])) : vue.createCommentVNode("v-if", true),
  4872. _ctx.showRemarkInput ? (vue.openBlock(), vue.createElementBlock("view", {
  4873. key: 1,
  4874. class: "remark-mask",
  4875. onClick: _cache[19] || (_cache[19] = (...args) => _ctx.closeRemarkInput && _ctx.closeRemarkInput(...args))
  4876. }, [
  4877. vue.createElementVNode("view", {
  4878. class: "remark-sheet",
  4879. onClick: _cache[18] || (_cache[18] = vue.withModifiers(() => {
  4880. }, ["stop"]))
  4881. }, [
  4882. vue.createElementVNode("view", { class: "remark-sheet-header" }, [
  4883. vue.createElementVNode("text", { class: "remark-sheet-title" }, "添加备注"),
  4884. vue.createElementVNode("view", {
  4885. class: "close-icon-btn",
  4886. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.closeRemarkInput && _ctx.closeRemarkInput(...args))
  4887. }, "×")
  4888. ]),
  4889. vue.withDirectives(vue.createElementVNode(
  4890. "textarea",
  4891. {
  4892. class: "remark-textarea",
  4893. "onUpdate:modelValue": _cache[16] || (_cache[16] = ($event) => _ctx.remarkText = $event),
  4894. placeholder: "请输入备注内容...",
  4895. maxlength: "500",
  4896. "auto-height": ""
  4897. },
  4898. null,
  4899. 512
  4900. /* NEED_PATCH */
  4901. ), [
  4902. [vue.vModelText, _ctx.remarkText]
  4903. ]),
  4904. vue.createElementVNode("view", {
  4905. class: "remark-submit-btn",
  4906. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.submitRemark && _ctx.submitRemark(...args))
  4907. }, "提交备注")
  4908. ])
  4909. ])) : vue.createCommentVNode("v-if", true),
  4910. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  4911. key: 2,
  4912. class: "nav-modal-mask",
  4913. onClick: _cache[25] || (_cache[25] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  4914. }, [
  4915. vue.createElementVNode("view", {
  4916. class: "nav-action-sheet",
  4917. onClick: _cache[24] || (_cache[24] = vue.withModifiers(() => {
  4918. }, ["stop"]))
  4919. }, [
  4920. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  4921. vue.createElementVNode("view", {
  4922. class: "nav-sheet-item",
  4923. onClick: _cache[20] || (_cache[20] = ($event) => _ctx.chooseMap("高德"))
  4924. }, "高德地图"),
  4925. vue.createElementVNode("view", {
  4926. class: "nav-sheet-item",
  4927. onClick: _cache[21] || (_cache[21] = ($event) => _ctx.chooseMap("腾讯"))
  4928. }, "腾讯地图"),
  4929. vue.createElementVNode("view", {
  4930. class: "nav-sheet-item",
  4931. onClick: _cache[22] || (_cache[22] = ($event) => _ctx.chooseMap("百度"))
  4932. }, "百度地图"),
  4933. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  4934. vue.createElementVNode("view", {
  4935. class: "nav-sheet-item cancel",
  4936. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  4937. }, "取消")
  4938. ])
  4939. ])) : vue.createCommentVNode("v-if", true)
  4940. ],
  4941. 64
  4942. /* STABLE_FRAGMENT */
  4943. );
  4944. }
  4945. const PagesOrdersIndex = /* @__PURE__ */ _export_sfc(_sfc_main$r, [["render", _sfc_render$q], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/index.vue"]]);
  4946. const logic$1 = {
  4947. data() {
  4948. return {
  4949. orderId: null,
  4950. orderType: 1,
  4951. orderStatus: 2,
  4952. stepsPickup: ["到达打卡", "确认出发", "送达打卡"],
  4953. stepsWalkWash: ["到达打卡", "开始服务", "服务结束"],
  4954. currentStep: 1,
  4955. orderDetail: {
  4956. type: 1,
  4957. price: "0.00",
  4958. timeLabel: "服务时间",
  4959. time: "",
  4960. petAvatar: "/static/dog.png",
  4961. petName: "",
  4962. petBreed: "",
  4963. serviceTag: "",
  4964. startLocation: "",
  4965. startAddress: "",
  4966. endLocation: "",
  4967. endAddress: "",
  4968. serviceContent: "",
  4969. remark: "",
  4970. orderNo: "",
  4971. createTime: "",
  4972. progressLogs: []
  4973. },
  4974. serviceList: [],
  4975. showPetModal: false,
  4976. currentPetInfo: {},
  4977. showNavModal: false,
  4978. navTargetPointType: "",
  4979. showUploadModal: false,
  4980. modalMediaList: [],
  4981. modalRemark: "",
  4982. showSumModal: false,
  4983. sumContent: "",
  4984. sumDate: "",
  4985. sumSigner: "张*哥",
  4986. showPetRemarkInput: false,
  4987. petRemarkText: ""
  4988. };
  4989. },
  4990. computed: {
  4991. steps() {
  4992. return this.orderType === 1 ? this.stepsPickup : this.stepsWalkWash;
  4993. },
  4994. displayStatusText() {
  4995. if (this.currentStep === 4)
  4996. return "待商家确认";
  4997. if (this.currentStep >= this.steps.length)
  4998. return "已完成";
  4999. let status = this.steps[this.currentStep];
  5000. if (status === "已完成" || status === "完成")
  5001. return "已完成";
  5002. if (status === "已拒绝")
  5003. return "已拒绝";
  5004. if (status === "接单") {
  5005. return this.orderType === 1 ? "待接送" : "待服务";
  5006. }
  5007. return this.orderType === 1 ? "配送中" : "服务中";
  5008. },
  5009. currentStatusText() {
  5010. if (this.currentStep === 4)
  5011. return "待确认";
  5012. return this.currentStep >= this.steps.length ? "已完成" : this.steps[this.currentStep];
  5013. },
  5014. currentTaskTitle() {
  5015. if (this.currentStep === 4)
  5016. return "待商家确认";
  5017. if (this.currentStep >= this.steps.length)
  5018. return "订单已完成";
  5019. let action = this.steps[this.currentStep];
  5020. if (action === "到达打卡")
  5021. return "到达打卡";
  5022. if (action === "开始服务")
  5023. return "开始服务";
  5024. if (action === "确认出发")
  5025. return "确认出发";
  5026. if (action === "送达打卡" || action === "服务结束")
  5027. return "服务完成";
  5028. return action;
  5029. },
  5030. currentTaskDesc() {
  5031. if (this.currentStep === 4)
  5032. return "服务已提交,请等待商家确认完成后即可结束订单";
  5033. if (this.currentStep >= this.steps.length)
  5034. return "感谢您的服务,请注意休息";
  5035. let action = this.steps[this.currentStep];
  5036. if (action === "到达打卡") {
  5037. return "打卡穿着工装消毒站门口的照片或视频";
  5038. }
  5039. if (this.orderType === 1) {
  5040. if (action === "确认出发")
  5041. return "拍摄宠物上车/出发时的状态照片或视频";
  5042. if (action === "送达打卡")
  5043. return "打卡确认送达的照片或视频";
  5044. } else {
  5045. if (action === "开始服务")
  5046. return "开始服务并拍摄照片 or 视频";
  5047. if (action === "服务结束")
  5048. return "服务完成拍摄照片或视频";
  5049. }
  5050. return "请按要求提交照片或视频及备注";
  5051. }
  5052. },
  5053. async onLoad(options) {
  5054. if (options.id) {
  5055. this.orderId = options.id;
  5056. }
  5057. await this.loadServiceList();
  5058. await this.loadOrderDetail();
  5059. },
  5060. methods: {
  5061. async loadServiceList() {
  5062. try {
  5063. const res = await getServiceList();
  5064. this.serviceList = res.data || [];
  5065. } catch (err) {
  5066. formatAppLog("error", "at pages/orders/detail-logic.js:115", "获取服务类型失败:", err);
  5067. }
  5068. },
  5069. async loadOrderDetail() {
  5070. if (!this.orderId) {
  5071. formatAppLog("log", "at pages/orders/detail-logic.js:120", "订单ID缺失");
  5072. uni.showToast({ title: "订单ID缺失", icon: "none" });
  5073. return;
  5074. }
  5075. try {
  5076. formatAppLog("log", "at pages/orders/detail-logic.js:125", "请求订单详情,ID:", this.orderId);
  5077. const res = await getOrderInfo(this.orderId);
  5078. formatAppLog("log", "at pages/orders/detail-logic.js:127", "订单详情响应:", res);
  5079. const order = res.data;
  5080. if (!order) {
  5081. formatAppLog("log", "at pages/orders/detail-logic.js:130", "订单数据为空");
  5082. uni.showToast({ title: "订单不存在", icon: "none" });
  5083. return;
  5084. }
  5085. formatAppLog("log", "at pages/orders/detail-logic.js:134", "订单数据:", order);
  5086. this.transformOrderData(order);
  5087. await this.loadOrderLogs();
  5088. } catch (err) {
  5089. formatAppLog("error", "at pages/orders/detail-logic.js:138", "获取订单详情失败:", err);
  5090. uni.showToast({ title: "加载失败", icon: "none" });
  5091. }
  5092. },
  5093. async loadOrderLogs() {
  5094. try {
  5095. const res = await getOrderLogs(this.orderId);
  5096. const logs = res.data || [];
  5097. formatAppLog("log", "at pages/orders/detail-logic.js:146", "订单日志:", logs);
  5098. if (logs.length > 0) {
  5099. formatAppLog("log", "at pages/orders/detail-logic.js:148", "第一条日志详情:", JSON.stringify(logs[0]));
  5100. }
  5101. const progressLogs = logs.filter((log) => log.logType === 1);
  5102. this.orderDetail.progressLogs = progressLogs.map((log) => ({
  5103. status: log.title || "",
  5104. time: log.createTime || "",
  5105. medias: log.photoUrls || [],
  5106. remark: log.content || ""
  5107. }));
  5108. const validLogs = logs.filter((log) => log.logType === 1 && log.actionType !== void 0).sort((a, b) => new Date(b.createTime).getTime() - new Date(a.createTime).getTime());
  5109. if (validLogs.length > 0) {
  5110. const latestLog = validLogs[0];
  5111. const actionType = latestLog.actionType;
  5112. if (latestLog.actionType >= 7) {
  5113. this.currentStep = 4;
  5114. } else if (actionType === 7) {
  5115. this.currentStep = 3;
  5116. } else if (actionType === 6) {
  5117. this.currentStep = 2;
  5118. } else if (actionType === 4) {
  5119. this.currentStep = 1;
  5120. } else if (actionType === 2 || actionType === 3) {
  5121. this.currentStep = 0;
  5122. } else {
  5123. this.currentStep = 0;
  5124. }
  5125. } else {
  5126. this.currentStep = 0;
  5127. }
  5128. formatAppLog("log", "at pages/orders/detail-logic.js:184", "根据最新日志推算的当前步骤:", this.currentStep);
  5129. } catch (err) {
  5130. formatAppLog("error", "at pages/orders/detail-logic.js:186", "获取订单日志失败:", err);
  5131. }
  5132. },
  5133. transformOrderData(order) {
  5134. const mode = order.mode || 0;
  5135. const isRoundTrip = mode === 1;
  5136. this.orderType = isRoundTrip ? 1 : 2;
  5137. this.orderStatus = order.status || 2;
  5138. this.orderDetail = {
  5139. type: this.orderType,
  5140. price: (order.price / 100).toFixed(2),
  5141. timeLabel: isRoundTrip ? "取货时间" : "服务时间",
  5142. time: order.serviceTime || "",
  5143. petAvatar: "/static/dog.png",
  5144. petName: order.petName || order.contact || "",
  5145. petBreed: order.breed || "",
  5146. serviceTag: order.groupPurchasePackageName || "",
  5147. startLocation: order.fromAddress || "",
  5148. startAddress: order.fromAddress || "",
  5149. endLocation: (order.contact || "") + " " + (order.contactPhoneNumber || ""),
  5150. endAddress: order.toAddress || "",
  5151. serviceContent: "",
  5152. remark: "",
  5153. orderNo: order.code || "T" + order.id,
  5154. createTime: order.serviceTime || "",
  5155. progressLogs: [
  5156. { status: "您已接单", time: order.serviceTime || "" }
  5157. ]
  5158. };
  5159. },
  5160. updateStepByStatus() {
  5161. if (this.orderStatus === 2) {
  5162. this.currentStep = 0;
  5163. } else if (this.orderStatus === 3) {
  5164. this.currentStep = 1;
  5165. } else if (this.orderStatus === 5) {
  5166. this.currentStep = this.steps.length - 1;
  5167. } else {
  5168. this.currentStep = 0;
  5169. }
  5170. },
  5171. showPetProfile() {
  5172. this.currentPetInfo = {
  5173. ...this.orderDetail,
  5174. petGender: "M",
  5175. petAge: "2岁",
  5176. petWeight: "15kg",
  5177. petPersonality: "活泼亲人,精力旺盛",
  5178. petHobby: "喜欢追飞盘,爱吃肉干",
  5179. petRemark: "肠胃较弱,不能乱喂零食;出门易爆冲,请拉紧牵引绳。",
  5180. petTags: ["拉响警报", "不能吃鸡肉", "精力旺盛"],
  5181. petLogs: [
  5182. { date: "2026-02-09 14:00", content: "今天遛弯拉了两次粑粑,精神状态很好。", recorder: "王阿姨" },
  5183. { date: "2026-02-08 10:30", content: "有些挑食,剩了小半碗狗粮。", recorder: "李师傅" },
  5184. { date: "2026-02-05 09:00", content: "建档。", recorder: "系统记录" }
  5185. ]
  5186. };
  5187. this.showPetModal = true;
  5188. },
  5189. closePetProfile() {
  5190. this.showPetModal = false;
  5191. },
  5192. openPetRemarkInput() {
  5193. this.petRemarkText = "";
  5194. this.showPetRemarkInput = true;
  5195. },
  5196. closePetRemarkInput() {
  5197. this.showPetRemarkInput = false;
  5198. },
  5199. submitPetRemark() {
  5200. if (!this.petRemarkText.trim()) {
  5201. uni.showToast({ title: "备注内容不能为空", icon: "none" });
  5202. return;
  5203. }
  5204. const now = /* @__PURE__ */ new Date();
  5205. const date = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, "0")}/${String(now.getDate()).padStart(2, "0")}`;
  5206. if (!this.currentPetInfo.petLogs) {
  5207. this.currentPetInfo.petLogs = [];
  5208. }
  5209. this.currentPetInfo.petLogs.unshift({
  5210. date,
  5211. content: this.petRemarkText,
  5212. recorder: "张*哥"
  5213. });
  5214. this.closePetRemarkInput();
  5215. uni.showToast({ title: "备注已添加", icon: "success" });
  5216. },
  5217. goToAnomaly() {
  5218. uni.navigateTo({
  5219. url: "/pages/orders/anomaly?orderId=" + (this.orderDetail.orderNo || "")
  5220. });
  5221. },
  5222. callPhone() {
  5223. uni.makePhoneCall({ phoneNumber: "18900008451" });
  5224. },
  5225. openNavigation(type) {
  5226. this.navTargetPointType = type;
  5227. this.showNavModal = true;
  5228. },
  5229. closeNavModal() {
  5230. this.showNavModal = false;
  5231. },
  5232. chooseMap(mapType) {
  5233. let pointType = this.navTargetPointType;
  5234. let name = pointType === "start" ? this.orderDetail.startLocation : this.orderDetail.endLocation;
  5235. let address = pointType === "start" ? this.orderDetail.startAddress : this.orderDetail.endAddress;
  5236. this.showNavModal = false;
  5237. uni.openLocation({
  5238. latitude: 30.52,
  5239. // Mock lat
  5240. longitude: 114.31,
  5241. // Mock lng
  5242. name: name || "目的地",
  5243. address: address || "默认地址",
  5244. success: function() {
  5245. formatAppLog("log", "at pages/orders/detail-logic.js:304", "打开导航成功: " + mapType);
  5246. }
  5247. });
  5248. },
  5249. openUploadModal() {
  5250. this.modalMediaList = [];
  5251. this.modalRemark = "";
  5252. this.showUploadModal = true;
  5253. },
  5254. closeUploadModal() {
  5255. this.showUploadModal = false;
  5256. },
  5257. handleConfirmUpload() {
  5258. formatAppLog("log", "at pages/orders/detail-logic.js:317", "handleConfirmUpload被调用");
  5259. this.confirmUploadModal();
  5260. },
  5261. async chooseModalMedia() {
  5262. formatAppLog("log", "at pages/orders/detail-logic.js:321", "chooseModalMedia被调用");
  5263. uni.chooseImage({
  5264. count: 5 - this.modalMediaList.length,
  5265. success: async (res) => {
  5266. formatAppLog("log", "at pages/orders/detail-logic.js:325", "选择图片成功,文件路径:", res.tempFilePaths);
  5267. uni.showLoading({ title: "上传中..." });
  5268. try {
  5269. for (const filePath of res.tempFilePaths) {
  5270. formatAppLog("log", "at pages/orders/detail-logic.js:329", "上传文件:", filePath);
  5271. const uploadRes = await uploadFile(filePath);
  5272. formatAppLog("log", "at pages/orders/detail-logic.js:331", "上传响应:", uploadRes);
  5273. if (uploadRes.code === 200) {
  5274. this.modalMediaList.push({
  5275. url: uploadRes.data.url,
  5276. ossId: uploadRes.data.ossId,
  5277. localPath: filePath
  5278. });
  5279. formatAppLog("log", "at pages/orders/detail-logic.js:338", "上传成功,url:", uploadRes.data.url);
  5280. }
  5281. }
  5282. uni.hideLoading();
  5283. formatAppLog("log", "at pages/orders/detail-logic.js:342", "当前modalMediaList:", this.modalMediaList);
  5284. uni.showToast({ title: "上传成功", icon: "success" });
  5285. } catch (err) {
  5286. uni.hideLoading();
  5287. formatAppLog("error", "at pages/orders/detail-logic.js:346", "上传失败:", err);
  5288. uni.showToast({ title: "上传失败", icon: "none" });
  5289. }
  5290. },
  5291. fail: (err) => {
  5292. formatAppLog("error", "at pages/orders/detail-logic.js:351", "选择图片失败:", err);
  5293. }
  5294. });
  5295. },
  5296. removeModalMedia(index) {
  5297. this.modalMediaList.splice(index, 1);
  5298. },
  5299. getCurrentTime() {
  5300. const now = /* @__PURE__ */ new Date();
  5301. const y = now.getFullYear();
  5302. const m = String(now.getMonth() + 1).padStart(2, "0");
  5303. const d = String(now.getDate()).padStart(2, "0");
  5304. const h = String(now.getHours()).padStart(2, "0");
  5305. const min = String(now.getMinutes()).padStart(2, "0");
  5306. return `${y}/${m}/${d} ${h}:${min}`;
  5307. },
  5308. async confirmUploadModal() {
  5309. formatAppLog("log", "at pages/orders/detail-logic.js:368", "confirmUploadModal被调用,文件数量:", this.modalMediaList.length);
  5310. if (this.modalMediaList.length === 0) {
  5311. uni.showToast({ title: "请上传至少一张图片或视频", icon: "none" });
  5312. return;
  5313. }
  5314. try {
  5315. uni.showLoading({ title: "提交中..." });
  5316. const uploadedMedias = this.modalMediaList.map((item) => item.url);
  5317. const ossIds = this.modalMediaList.map((item) => item.ossId);
  5318. formatAppLog("log", "at pages/orders/detail-logic.js:379", "准备打卡,ossIds:", ossIds);
  5319. const currentAction = this.steps[this.currentStep];
  5320. let clockInType = 4;
  5321. if (currentAction === "到达打卡") {
  5322. clockInType = 4;
  5323. } else if (currentAction === "确认出发" || currentAction === "开始服务") {
  5324. clockInType = 6;
  5325. } else if (currentAction === "送达打卡" || currentAction === "服务结束") {
  5326. clockInType = 7;
  5327. }
  5328. const clockInData = {
  5329. orderId: this.orderId,
  5330. photos: ossIds,
  5331. content: this.modalRemark || "",
  5332. type: clockInType,
  5333. title: this.currentTaskTitle
  5334. };
  5335. formatAppLog("log", "at pages/orders/detail-logic.js:399", "打卡数据:", clockInData);
  5336. await clockIn(clockInData);
  5337. uni.hideLoading();
  5338. this.closeUploadModal();
  5339. uni.showToast({ title: "打卡成功", icon: "success" });
  5340. await this.loadOrderDetail();
  5341. } catch (err) {
  5342. uni.hideLoading();
  5343. formatAppLog("error", "at pages/orders/detail-logic.js:409", "打卡失败:", err);
  5344. uni.showToast({ title: "打卡失败,请重试", icon: "none" });
  5345. }
  5346. },
  5347. copyOrderNo() {
  5348. uni.setClipboardData({
  5349. data: this.orderDetail.orderNo,
  5350. success: () => {
  5351. uni.showToast({ title: "复制成功", icon: "none" });
  5352. }
  5353. });
  5354. },
  5355. openSumModal() {
  5356. const now = /* @__PURE__ */ new Date();
  5357. const y = now.getFullYear();
  5358. const m = String(now.getMonth() + 1).padStart(2, "0");
  5359. const d = String(now.getDate()).padStart(2, "0");
  5360. this.sumDate = `${y}/${m}/${d}`;
  5361. if (!this.sumContent) {
  5362. this.sumContent = "1. 精神/身体状态:\n2. 进食/饮水:\n3. 排泤情况:\n4. 卫生情况:\n5. 互动情况:\n6. 特殊情况/备注:";
  5363. }
  5364. this.showSumModal = true;
  5365. },
  5366. closeSumModal() {
  5367. this.showSumModal = false;
  5368. },
  5369. submitSumModal() {
  5370. if (!this.sumContent.trim()) {
  5371. uni.showToast({ title: "请填写服务内容", icon: "none" });
  5372. return;
  5373. }
  5374. this.closeSumModal();
  5375. uni.showToast({ title: "小结已提交", icon: "success" });
  5376. }
  5377. }
  5378. };
  5379. const _imports_14 = "/static/icons/phone_orange.svg";
  5380. const _imports_1$7 = "/static/icons/clock.svg";
  5381. const _imports_0$2 = "/static/icons/right_arrow_orange.svg";
  5382. const _imports_4$1 = "/static/icons/heart.svg";
  5383. const _imports_5 = "/static/icons/file.svg";
  5384. const _imports_1$6 = "/static/icons/camera_grey.svg";
  5385. const _imports_7 = "/static/icons/order_no.svg";
  5386. const _sfc_main$q = {
  5387. ...logic$1
  5388. };
  5389. function _sfc_render$p(_ctx, _cache, $props, $setup, $data, $options) {
  5390. return vue.openBlock(), vue.createElementBlock("view", { class: "detail-container" }, [
  5391. vue.createElementVNode("view", { class: "detail-header" }, [
  5392. vue.createElementVNode("view", { class: "status-row" }, [
  5393. vue.createElementVNode(
  5394. "text",
  5395. { class: "status-title" },
  5396. vue.toDisplayString(_ctx.displayStatusText),
  5397. 1
  5398. /* TEXT */
  5399. ),
  5400. vue.createElementVNode(
  5401. "text",
  5402. { class: "status-price" },
  5403. "¥" + vue.toDisplayString(_ctx.orderDetail.price),
  5404. 1
  5405. /* TEXT */
  5406. )
  5407. ]),
  5408. vue.createElementVNode("view", { class: "progress-bar" }, [
  5409. (vue.openBlock(true), vue.createElementBlock(
  5410. vue.Fragment,
  5411. null,
  5412. vue.renderList(_ctx.steps, (step, index) => {
  5413. return vue.openBlock(), vue.createElementBlock(
  5414. "view",
  5415. {
  5416. class: vue.normalizeClass(["step-item", { "active": index === _ctx.currentStep }]),
  5417. key: index
  5418. },
  5419. [
  5420. vue.createElementVNode("view", { class: "step-circle-wrapper" }, [
  5421. index !== 0 ? (vue.openBlock(), vue.createElementBlock(
  5422. "view",
  5423. {
  5424. key: 0,
  5425. class: vue.normalizeClass(["step-line", { "active-line": index <= _ctx.currentStep }])
  5426. },
  5427. null,
  5428. 2
  5429. /* CLASS */
  5430. )) : vue.createCommentVNode("v-if", true),
  5431. vue.createElementVNode(
  5432. "view",
  5433. { class: "step-circle" },
  5434. vue.toDisplayString(index + 1),
  5435. 1
  5436. /* TEXT */
  5437. )
  5438. ]),
  5439. vue.createElementVNode(
  5440. "text",
  5441. { class: "step-text" },
  5442. vue.toDisplayString(step),
  5443. 1
  5444. /* TEXT */
  5445. )
  5446. ],
  5447. 2
  5448. /* CLASS */
  5449. );
  5450. }),
  5451. 128
  5452. /* KEYED_FRAGMENT */
  5453. ))
  5454. ])
  5455. ]),
  5456. vue.createElementVNode("scroll-view", {
  5457. "scroll-y": "",
  5458. class: "detail-content"
  5459. }, [
  5460. vue.createElementVNode("view", { class: "white-card pet-bar" }, [
  5461. vue.createElementVNode("image", {
  5462. class: "pb-avatar",
  5463. src: _ctx.orderDetail.petAvatar,
  5464. mode: "aspectFill"
  5465. }, null, 8, ["src"]),
  5466. vue.createElementVNode("view", { class: "pb-info" }, [
  5467. vue.createElementVNode("view", { class: "pb-name-row" }, [
  5468. vue.createElementVNode(
  5469. "text",
  5470. { class: "pb-name" },
  5471. vue.toDisplayString(_ctx.orderDetail.petName),
  5472. 1
  5473. /* TEXT */
  5474. ),
  5475. vue.createElementVNode(
  5476. "text",
  5477. { class: "pb-breed" },
  5478. "品种: " + vue.toDisplayString(_ctx.orderDetail.petBreed),
  5479. 1
  5480. /* TEXT */
  5481. )
  5482. ]),
  5483. vue.createElementVNode("view", { class: "pb-tags" }, [
  5484. vue.createElementVNode(
  5485. "text",
  5486. { class: "pb-tag" },
  5487. vue.toDisplayString(_ctx.orderDetail.serviceTag),
  5488. 1
  5489. /* TEXT */
  5490. )
  5491. ])
  5492. ]),
  5493. vue.createElementVNode("view", { class: "pb-actions" }, [
  5494. vue.createElementVNode("view", {
  5495. class: "pb-btn profile-btn",
  5496. onClick: _cache[0] || (_cache[0] = (...args) => _ctx.showPetProfile && _ctx.showPetProfile(...args))
  5497. }, "宠物档案"),
  5498. vue.createElementVNode("view", {
  5499. class: "pb-btn phone-btn",
  5500. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.callPhone && _ctx.callPhone(...args))
  5501. }, [
  5502. vue.createElementVNode("image", {
  5503. class: "phone-icon",
  5504. src: _imports_14
  5505. })
  5506. ])
  5507. ])
  5508. ]),
  5509. vue.createElementVNode("view", { class: "white-card service-info-card" }, [
  5510. vue.createElementVNode("view", { class: "si-row time-row" }, [
  5511. vue.createElementVNode("image", {
  5512. class: "si-icon outline",
  5513. src: _imports_1$7
  5514. }),
  5515. vue.createElementVNode("view", { class: "si-content" }, [
  5516. vue.createElementVNode("text", { class: "si-label" }, "服务时间"),
  5517. vue.createElementVNode(
  5518. "text",
  5519. { class: "si-val" },
  5520. vue.toDisplayString(_ctx.orderDetail.time),
  5521. 1
  5522. /* TEXT */
  5523. )
  5524. ]),
  5525. vue.createElementVNode("view", { class: "si-action record-btn" }, [
  5526. vue.createElementVNode("text", null, "异常记录"),
  5527. vue.createElementVNode("image", {
  5528. class: "record-arrow",
  5529. src: _imports_0$2
  5530. })
  5531. ])
  5532. ]),
  5533. _ctx.orderDetail.type === 1 ? (vue.openBlock(), vue.createElementBlock(
  5534. vue.Fragment,
  5535. { key: 0 },
  5536. [
  5537. vue.createElementVNode("view", { class: "si-row addr-row start-addr" }, [
  5538. vue.createElementVNode("view", { class: "icon-circle start" }, "起"),
  5539. vue.createElementVNode("view", { class: "route-line-vertical" }),
  5540. vue.createElementVNode("view", { class: "si-content" }, [
  5541. vue.createElementVNode(
  5542. "text",
  5543. { class: "si-addr-title" },
  5544. vue.toDisplayString(_ctx.orderDetail.startLocation),
  5545. 1
  5546. /* TEXT */
  5547. ),
  5548. vue.createElementVNode(
  5549. "text",
  5550. { class: "si-addr-desc" },
  5551. vue.toDisplayString(_ctx.orderDetail.startAddress),
  5552. 1
  5553. /* TEXT */
  5554. )
  5555. ]),
  5556. vue.createElementVNode("view", {
  5557. class: "nav-btn-circle",
  5558. onClick: _cache[2] || (_cache[2] = ($event) => _ctx.openNavigation("start"))
  5559. }, [
  5560. vue.createElementVNode("image", {
  5561. class: "nav-arrow",
  5562. src: _imports_3$2
  5563. })
  5564. ])
  5565. ]),
  5566. vue.createElementVNode("view", { class: "si-row addr-row end-addr" }, [
  5567. vue.createElementVNode("view", { class: "icon-circle end" }, "终"),
  5568. vue.createElementVNode("view", { class: "si-content" }, [
  5569. vue.createElementVNode(
  5570. "text",
  5571. { class: "si-addr-title" },
  5572. vue.toDisplayString(_ctx.orderDetail.endLocation),
  5573. 1
  5574. /* TEXT */
  5575. ),
  5576. vue.createElementVNode(
  5577. "text",
  5578. { class: "si-addr-desc" },
  5579. vue.toDisplayString(_ctx.orderDetail.endAddress),
  5580. 1
  5581. /* TEXT */
  5582. )
  5583. ]),
  5584. vue.createElementVNode("view", {
  5585. class: "nav-btn-circle",
  5586. onClick: _cache[3] || (_cache[3] = ($event) => _ctx.openNavigation("end"))
  5587. }, [
  5588. vue.createElementVNode("image", {
  5589. class: "nav-arrow",
  5590. src: _imports_3$2
  5591. })
  5592. ])
  5593. ])
  5594. ],
  5595. 64
  5596. /* STABLE_FRAGMENT */
  5597. )) : (vue.openBlock(), vue.createElementBlock(
  5598. vue.Fragment,
  5599. { key: 1 },
  5600. [
  5601. vue.createElementVNode("view", { class: "si-row addr-row end-addr" }, [
  5602. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  5603. vue.createElementVNode("view", { class: "si-content" }, [
  5604. vue.createElementVNode(
  5605. "text",
  5606. { class: "si-addr-title" },
  5607. vue.toDisplayString(_ctx.orderDetail.endLocation),
  5608. 1
  5609. /* TEXT */
  5610. ),
  5611. vue.createElementVNode(
  5612. "text",
  5613. { class: "si-addr-desc" },
  5614. vue.toDisplayString(_ctx.orderDetail.endAddress),
  5615. 1
  5616. /* TEXT */
  5617. )
  5618. ]),
  5619. vue.createElementVNode("view", {
  5620. class: "nav-btn-circle",
  5621. onClick: _cache[4] || (_cache[4] = ($event) => _ctx.openNavigation("end"))
  5622. }, [
  5623. vue.createElementVNode("image", {
  5624. class: "nav-arrow",
  5625. src: _imports_3$2
  5626. })
  5627. ])
  5628. ]),
  5629. vue.createElementVNode("view", { class: "si-row" }, [
  5630. vue.createElementVNode("image", {
  5631. class: "si-icon outline",
  5632. src: _imports_4$1
  5633. }),
  5634. vue.createElementVNode("view", { class: "si-content" }, [
  5635. vue.createElementVNode("text", { class: "si-label" }, "服务内容"),
  5636. vue.createElementVNode(
  5637. "text",
  5638. { class: "si-val" },
  5639. vue.toDisplayString(_ctx.orderDetail.serviceContent),
  5640. 1
  5641. /* TEXT */
  5642. )
  5643. ])
  5644. ])
  5645. ],
  5646. 64
  5647. /* STABLE_FRAGMENT */
  5648. )),
  5649. vue.createElementVNode("view", { class: "si-row" }, [
  5650. vue.createElementVNode("image", {
  5651. class: "si-icon outline custom-icon-file",
  5652. src: _imports_5
  5653. }),
  5654. vue.createElementVNode("view", { class: "si-content" }, [
  5655. vue.createElementVNode("text", { class: "si-label" }, "备注"),
  5656. vue.createElementVNode(
  5657. "text",
  5658. { class: "si-val" },
  5659. vue.toDisplayString(_ctx.orderDetail.remark || "无"),
  5660. 1
  5661. /* TEXT */
  5662. )
  5663. ])
  5664. ])
  5665. ]),
  5666. _ctx.currentStep < _ctx.steps.length ? (vue.openBlock(), vue.createElementBlock("view", {
  5667. key: 0,
  5668. class: "white-card task-card"
  5669. }, [
  5670. vue.createElementVNode(
  5671. "text",
  5672. { class: "tc-title" },
  5673. "当前任务:" + vue.toDisplayString(_ctx.currentTaskTitle),
  5674. 1
  5675. /* TEXT */
  5676. ),
  5677. vue.createElementVNode(
  5678. "text",
  5679. { class: "tc-desc" },
  5680. vue.toDisplayString(_ctx.currentTaskDesc),
  5681. 1
  5682. /* TEXT */
  5683. ),
  5684. vue.createElementVNode("view", {
  5685. class: "full-media-add",
  5686. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.openUploadModal && _ctx.openUploadModal(...args))
  5687. }, [
  5688. vue.createElementVNode("image", {
  5689. class: "upload-icon-large",
  5690. src: _imports_1$6
  5691. }),
  5692. vue.createElementVNode("text", { class: "upload-text-large" }, "上传图或视频")
  5693. ])
  5694. ])) : vue.createCommentVNode("v-if", true),
  5695. vue.createElementVNode("view", { class: "white-card base-info-card" }, [
  5696. vue.createElementVNode("view", { class: "bi-row" }, [
  5697. vue.createElementVNode("image", {
  5698. class: "si-icon outline",
  5699. src: _imports_7
  5700. }),
  5701. vue.createElementVNode("view", { class: "bi-content" }, [
  5702. vue.createElementVNode("text", { class: "bi-label" }, "订单编号"),
  5703. vue.createElementVNode("view", { class: "bi-val-row" }, [
  5704. vue.createElementVNode(
  5705. "text",
  5706. { class: "bi-val" },
  5707. vue.toDisplayString(_ctx.orderDetail.orderNo),
  5708. 1
  5709. /* TEXT */
  5710. ),
  5711. vue.createElementVNode("text", {
  5712. class: "bi-copy",
  5713. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.copyOrderNo && _ctx.copyOrderNo(...args))
  5714. }, "复制")
  5715. ])
  5716. ])
  5717. ]),
  5718. vue.createElementVNode("view", { class: "bi-row" }, [
  5719. vue.createElementVNode("image", {
  5720. class: "si-icon outline",
  5721. src: _imports_1$7
  5722. }),
  5723. vue.createElementVNode("view", { class: "bi-content" }, [
  5724. vue.createElementVNode("text", { class: "bi-label" }, "下单时间"),
  5725. vue.createElementVNode(
  5726. "text",
  5727. { class: "bi-val" },
  5728. vue.toDisplayString(_ctx.orderDetail.createTime),
  5729. 1
  5730. /* TEXT */
  5731. )
  5732. ])
  5733. ])
  5734. ]),
  5735. vue.createElementVNode("view", { class: "white-card timeline-card" }, [
  5736. vue.createElementVNode("view", { class: "tl-title-row" }, [
  5737. vue.createElementVNode("view", { class: "orange-bar" }),
  5738. vue.createElementVNode("text", { class: "tl-title" }, "订单进度")
  5739. ]),
  5740. vue.createElementVNode("view", { class: "tl-list" }, [
  5741. (vue.openBlock(true), vue.createElementBlock(
  5742. vue.Fragment,
  5743. null,
  5744. vue.renderList(_ctx.orderDetail.progressLogs, (log, idx) => {
  5745. return vue.openBlock(), vue.createElementBlock("view", {
  5746. class: "tl-item",
  5747. key: idx
  5748. }, [
  5749. vue.createElementVNode("view", { class: "tl-marker active" }, [
  5750. vue.createElementVNode("view", { class: "tl-dot-inner" })
  5751. ]),
  5752. vue.createElementVNode("view", { class: "tl-content-row" }, [
  5753. vue.createElementVNode("view", { class: "tl-header" }, [
  5754. vue.createElementVNode(
  5755. "text",
  5756. { class: "tl-status" },
  5757. vue.toDisplayString(log.status),
  5758. 1
  5759. /* TEXT */
  5760. ),
  5761. vue.createElementVNode(
  5762. "text",
  5763. { class: "tl-time" },
  5764. vue.toDisplayString(log.time),
  5765. 1
  5766. /* TEXT */
  5767. )
  5768. ]),
  5769. log.medias && log.medias.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  5770. key: 0,
  5771. class: "tl-medias"
  5772. }, [
  5773. (vue.openBlock(true), vue.createElementBlock(
  5774. vue.Fragment,
  5775. null,
  5776. vue.renderList(log.medias, (img, midx) => {
  5777. return vue.openBlock(), vue.createElementBlock("image", {
  5778. class: "tl-img",
  5779. key: midx,
  5780. src: img,
  5781. mode: "aspectFill"
  5782. }, null, 8, ["src"]);
  5783. }),
  5784. 128
  5785. /* KEYED_FRAGMENT */
  5786. ))
  5787. ])) : vue.createCommentVNode("v-if", true),
  5788. log.remark ? (vue.openBlock(), vue.createElementBlock("view", {
  5789. key: 1,
  5790. class: "tl-remark"
  5791. }, [
  5792. vue.createElementVNode(
  5793. "text",
  5794. null,
  5795. vue.toDisplayString(log.remark),
  5796. 1
  5797. /* TEXT */
  5798. )
  5799. ])) : vue.createCommentVNode("v-if", true)
  5800. ])
  5801. ]);
  5802. }),
  5803. 128
  5804. /* KEYED_FRAGMENT */
  5805. ))
  5806. ])
  5807. ]),
  5808. vue.createElementVNode("view", { style: { "height": "140rpx" } })
  5809. ]),
  5810. vue.createElementVNode("view", { class: "bottom-action-bar" }, [
  5811. vue.createElementVNode("view", { class: "action-left" }, [
  5812. vue.createElementVNode("button", {
  5813. class: "action-btn outline grey-outline",
  5814. onClick: _cache[7] || (_cache[7] = (...args) => _ctx.goToAnomaly && _ctx.goToAnomaly(...args))
  5815. }, "异常上报"),
  5816. vue.createElementVNode("button", {
  5817. class: "action-btn outline orange-outline",
  5818. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.openSumModal && _ctx.openSumModal(...args))
  5819. }, "宠护小结")
  5820. ]),
  5821. vue.createElementVNode("view", { class: "action-right" }, [
  5822. _ctx.currentStep < _ctx.steps.length ? (vue.openBlock(), vue.createElementBlock(
  5823. "button",
  5824. {
  5825. key: 0,
  5826. class: "action-btn primary",
  5827. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.openUploadModal && _ctx.openUploadModal(...args))
  5828. },
  5829. vue.toDisplayString(_ctx.currentTaskTitle),
  5830. 1
  5831. /* TEXT */
  5832. )) : (vue.openBlock(), vue.createElementBlock("button", {
  5833. key: 1,
  5834. class: "action-btn primary grey-bg"
  5835. }, "已完成"))
  5836. ])
  5837. ]),
  5838. _ctx.showPetModal ? (vue.openBlock(), vue.createElementBlock("view", {
  5839. key: 0,
  5840. class: "pet-modal-mask",
  5841. onClick: _cache[13] || (_cache[13] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  5842. }, [
  5843. vue.createElementVNode("view", {
  5844. class: "pet-modal-content",
  5845. onClick: _cache[12] || (_cache[12] = vue.withModifiers(() => {
  5846. }, ["stop"]))
  5847. }, [
  5848. vue.createElementVNode("view", { class: "pet-modal-header" }, [
  5849. vue.createElementVNode("text", { class: "pet-modal-title" }, "宠物档案"),
  5850. vue.createElementVNode("view", { style: { "flex": "1" } }),
  5851. vue.createElementVNode("view", {
  5852. class: "pm-remark-btn",
  5853. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.openPetRemarkInput && _ctx.openPetRemarkInput(...args))
  5854. }, "备注"),
  5855. vue.createElementVNode("view", {
  5856. class: "close-icon-btn",
  5857. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.closePetProfile && _ctx.closePetProfile(...args))
  5858. }, "×")
  5859. ]),
  5860. vue.createElementVNode("scroll-view", {
  5861. "scroll-y": "",
  5862. class: "pet-modal-scroll"
  5863. }, [
  5864. vue.createElementVNode("view", { class: "pet-base-info" }, [
  5865. vue.createElementVNode("image", {
  5866. class: "pm-avatar",
  5867. src: _ctx.currentPetInfo.petAvatar,
  5868. mode: "aspectFill"
  5869. }, null, 8, ["src"]),
  5870. vue.createElementVNode("view", { class: "pm-info-text" }, [
  5871. vue.createElementVNode("view", { class: "pm-name-row" }, [
  5872. vue.createElementVNode(
  5873. "text",
  5874. { class: "pm-name" },
  5875. vue.toDisplayString(_ctx.currentPetInfo.petName),
  5876. 1
  5877. /* TEXT */
  5878. ),
  5879. _ctx.currentPetInfo.petGender === "M" ? (vue.openBlock(), vue.createElementBlock("view", {
  5880. key: 0,
  5881. class: "pm-gender"
  5882. }, [
  5883. vue.createElementVNode("text", { class: "gender-icon" }, "♂"),
  5884. vue.createElementVNode("text", null, "公")
  5885. ])) : _ctx.currentPetInfo.petGender === "F" ? (vue.openBlock(), vue.createElementBlock("view", {
  5886. key: 1,
  5887. class: "pm-gender female"
  5888. }, [
  5889. vue.createElementVNode("text", { class: "gender-icon" }, "♀"),
  5890. vue.createElementVNode("text", null, "母")
  5891. ])) : vue.createCommentVNode("v-if", true)
  5892. ]),
  5893. vue.createElementVNode(
  5894. "text",
  5895. { class: "pm-breed" },
  5896. "品种:" + vue.toDisplayString(_ctx.currentPetInfo.petBreed),
  5897. 1
  5898. /* TEXT */
  5899. )
  5900. ])
  5901. ]),
  5902. vue.createElementVNode("view", { class: "pm-detail-grid" }, [
  5903. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  5904. vue.createElementVNode("text", { class: "pm-label" }, "年龄"),
  5905. vue.createElementVNode(
  5906. "text",
  5907. { class: "pm-val" },
  5908. vue.toDisplayString(_ctx.currentPetInfo.petAge || "未知"),
  5909. 1
  5910. /* TEXT */
  5911. )
  5912. ]),
  5913. vue.createElementVNode("view", { class: "pm-grid-item half" }, [
  5914. vue.createElementVNode("text", { class: "pm-label" }, "体重"),
  5915. vue.createElementVNode(
  5916. "text",
  5917. { class: "pm-val" },
  5918. vue.toDisplayString(_ctx.currentPetInfo.petWeight || "未知"),
  5919. 1
  5920. /* TEXT */
  5921. )
  5922. ]),
  5923. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5924. vue.createElementVNode("text", { class: "pm-label" }, "性格"),
  5925. vue.createElementVNode(
  5926. "text",
  5927. { class: "pm-val" },
  5928. vue.toDisplayString(_ctx.currentPetInfo.petPersonality || "无"),
  5929. 1
  5930. /* TEXT */
  5931. )
  5932. ]),
  5933. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5934. vue.createElementVNode("text", { class: "pm-label" }, "爱好"),
  5935. vue.createElementVNode(
  5936. "text",
  5937. { class: "pm-val" },
  5938. vue.toDisplayString(_ctx.currentPetInfo.petHobby || "无"),
  5939. 1
  5940. /* TEXT */
  5941. )
  5942. ]),
  5943. vue.createElementVNode("view", { class: "pm-grid-item full" }, [
  5944. vue.createElementVNode("text", { class: "pm-label" }, "备注"),
  5945. vue.createElementVNode(
  5946. "text",
  5947. { class: "pm-val" },
  5948. vue.toDisplayString(_ctx.currentPetInfo.petRemark || "无特殊过敏史"),
  5949. 1
  5950. /* TEXT */
  5951. )
  5952. ])
  5953. ]),
  5954. _ctx.currentPetInfo.petTags && _ctx.currentPetInfo.petTags.length > 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  5955. key: 0,
  5956. class: "pm-tags-row"
  5957. }, [
  5958. (vue.openBlock(true), vue.createElementBlock(
  5959. vue.Fragment,
  5960. null,
  5961. vue.renderList(_ctx.currentPetInfo.petTags, (tag, ti) => {
  5962. return vue.openBlock(), vue.createElementBlock("view", {
  5963. class: "pm-tag-chip",
  5964. key: ti
  5965. }, [
  5966. vue.createElementVNode(
  5967. "text",
  5968. { class: "pm-tag-chip-text" },
  5969. vue.toDisplayString(tag),
  5970. 1
  5971. /* TEXT */
  5972. )
  5973. ]);
  5974. }),
  5975. 128
  5976. /* KEYED_FRAGMENT */
  5977. ))
  5978. ])) : vue.createCommentVNode("v-if", true),
  5979. vue.createElementVNode("view", { class: "pm-log-section" }, [
  5980. vue.createElementVNode("view", { class: "pm-log-header" }, [
  5981. vue.createElementVNode("view", { style: { "width": "6rpx", "height": "28rpx", "background": "#FF9800", "border-radius": "3rpx", "margin-right": "12rpx" } }),
  5982. vue.createElementVNode("text", { class: "pm-log-section-title" }, "备注日志")
  5983. ]),
  5984. (vue.openBlock(true), vue.createElementBlock(
  5985. vue.Fragment,
  5986. null,
  5987. vue.renderList(_ctx.currentPetInfo.petLogs, (log, lIndex) => {
  5988. return vue.openBlock(), vue.createElementBlock("view", {
  5989. class: "pm-log-item",
  5990. key: lIndex
  5991. }, [
  5992. vue.createElementVNode(
  5993. "text",
  5994. { class: "pm-log-date" },
  5995. vue.toDisplayString(log.date),
  5996. 1
  5997. /* TEXT */
  5998. ),
  5999. vue.createElementVNode(
  6000. "text",
  6001. { class: "pm-log-text" },
  6002. vue.toDisplayString(log.content),
  6003. 1
  6004. /* TEXT */
  6005. ),
  6006. log.recorder !== "系统记录" ? (vue.openBlock(), vue.createElementBlock(
  6007. "text",
  6008. {
  6009. key: 0,
  6010. class: "pm-log-recorder"
  6011. },
  6012. "记录人:" + vue.toDisplayString(log.recorder),
  6013. 1
  6014. /* TEXT */
  6015. )) : (vue.openBlock(), vue.createElementBlock("text", {
  6016. key: 1,
  6017. class: "pm-log-recorder system"
  6018. }, "系统记录"))
  6019. ]);
  6020. }),
  6021. 128
  6022. /* KEYED_FRAGMENT */
  6023. ))
  6024. ]),
  6025. vue.createElementVNode("view", { style: { "height": "30rpx" } })
  6026. ])
  6027. ])
  6028. ])) : vue.createCommentVNode("v-if", true),
  6029. _ctx.showPetRemarkInput ? (vue.openBlock(), vue.createElementBlock("view", {
  6030. key: 1,
  6031. class: "upload-modal-mask",
  6032. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.closePetRemarkInput && _ctx.closePetRemarkInput(...args))
  6033. }, [
  6034. vue.createElementVNode("view", {
  6035. class: "upload-modal-content",
  6036. onClick: _cache[16] || (_cache[16] = vue.withModifiers(() => {
  6037. }, ["stop"]))
  6038. }, [
  6039. vue.createElementVNode("view", { class: "um-header" }, [
  6040. vue.createElementVNode("text", { class: "um-title" }, "添加备注")
  6041. ]),
  6042. vue.createElementVNode("view", { class: "um-body" }, [
  6043. vue.withDirectives(vue.createElementVNode(
  6044. "textarea",
  6045. {
  6046. class: "um-textarea",
  6047. "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => _ctx.petRemarkText = $event),
  6048. "auto-height": "",
  6049. placeholder: "请输入宠物备注内容...",
  6050. "placeholder-style": "color:#ccc; font-size:26rpx;"
  6051. },
  6052. null,
  6053. 512
  6054. /* NEED_PATCH */
  6055. ), [
  6056. [vue.vModelText, _ctx.petRemarkText]
  6057. ])
  6058. ]),
  6059. vue.createElementVNode("view", { class: "um-footer" }, [
  6060. vue.createElementVNode("button", {
  6061. class: "um-submit-btn active",
  6062. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.submitPetRemark && _ctx.submitPetRemark(...args))
  6063. }, "确认提交")
  6064. ])
  6065. ])
  6066. ])) : vue.createCommentVNode("v-if", true),
  6067. _ctx.showNavModal ? (vue.openBlock(), vue.createElementBlock("view", {
  6068. key: 2,
  6069. class: "nav-modal-mask",
  6070. onClick: _cache[23] || (_cache[23] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  6071. }, [
  6072. vue.createElementVNode("view", {
  6073. class: "nav-action-sheet",
  6074. onClick: _cache[22] || (_cache[22] = vue.withModifiers(() => {
  6075. }, ["stop"]))
  6076. }, [
  6077. vue.createElementVNode("view", { class: "nav-sheet-title" }, "选择地图进行导航"),
  6078. vue.createElementVNode("view", {
  6079. class: "nav-sheet-item",
  6080. onClick: _cache[18] || (_cache[18] = ($event) => _ctx.chooseMap("高德"))
  6081. }, "高德地图"),
  6082. vue.createElementVNode("view", {
  6083. class: "nav-sheet-item",
  6084. onClick: _cache[19] || (_cache[19] = ($event) => _ctx.chooseMap("腾讯"))
  6085. }, "腾讯地图"),
  6086. vue.createElementVNode("view", {
  6087. class: "nav-sheet-item",
  6088. onClick: _cache[20] || (_cache[20] = ($event) => _ctx.chooseMap("百度"))
  6089. }, "百度地图"),
  6090. vue.createElementVNode("view", { class: "nav-sheet-gap" }),
  6091. vue.createElementVNode("view", {
  6092. class: "nav-sheet-item cancel",
  6093. onClick: _cache[21] || (_cache[21] = (...args) => _ctx.closeNavModal && _ctx.closeNavModal(...args))
  6094. }, "取消")
  6095. ])
  6096. ])) : vue.createCommentVNode("v-if", true),
  6097. _ctx.showUploadModal ? (vue.openBlock(), vue.createElementBlock("view", {
  6098. key: 3,
  6099. class: "upload-modal-mask",
  6100. onClick: _cache[28] || (_cache[28] = (...args) => _ctx.closeUploadModal && _ctx.closeUploadModal(...args))
  6101. }, [
  6102. vue.createElementVNode("view", {
  6103. class: "upload-modal-content",
  6104. onClick: _cache[27] || (_cache[27] = vue.withModifiers(() => {
  6105. }, ["stop"]))
  6106. }, [
  6107. vue.createElementVNode("view", { class: "um-header" }, [
  6108. vue.createElementVNode(
  6109. "text",
  6110. { class: "um-title" },
  6111. "上传图或视频 (" + vue.toDisplayString(_ctx.modalMediaList.length) + "/5)",
  6112. 1
  6113. /* TEXT */
  6114. )
  6115. ]),
  6116. vue.createElementVNode("view", { class: "um-body" }, [
  6117. vue.createElementVNode("view", { class: "um-grid" }, [
  6118. (vue.openBlock(true), vue.createElementBlock(
  6119. vue.Fragment,
  6120. null,
  6121. vue.renderList(_ctx.modalMediaList, (img, idx) => {
  6122. return vue.openBlock(), vue.createElementBlock("view", {
  6123. class: "um-item",
  6124. key: idx
  6125. }, [
  6126. vue.createElementVNode("image", {
  6127. class: "um-preview",
  6128. src: img.url || img.localPath || img,
  6129. mode: "aspectFill"
  6130. }, null, 8, ["src"]),
  6131. vue.createElementVNode("view", {
  6132. class: "um-del",
  6133. onClick: ($event) => _ctx.removeModalMedia(idx)
  6134. }, "×", 8, ["onClick"])
  6135. ]);
  6136. }),
  6137. 128
  6138. /* KEYED_FRAGMENT */
  6139. )),
  6140. _ctx.modalMediaList.length < 5 ? (vue.openBlock(), vue.createElementBlock("view", {
  6141. key: 0,
  6142. class: "um-add",
  6143. onClick: _cache[24] || (_cache[24] = (...args) => _ctx.chooseModalMedia && _ctx.chooseModalMedia(...args))
  6144. }, [
  6145. vue.createElementVNode("image", {
  6146. class: "um-add-icon",
  6147. src: _imports_1$6
  6148. }),
  6149. vue.createElementVNode("text", { class: "um-add-text" }, "拍摄/上传")
  6150. ])) : vue.createCommentVNode("v-if", true)
  6151. ]),
  6152. vue.withDirectives(vue.createElementVNode(
  6153. "textarea",
  6154. {
  6155. class: "um-textarea",
  6156. "onUpdate:modelValue": _cache[25] || (_cache[25] = ($event) => _ctx.modalRemark = $event),
  6157. placeholder: "在此输入备注信息...",
  6158. "placeholder-style": "color:#ccc; font-size:26rpx;"
  6159. },
  6160. null,
  6161. 512
  6162. /* NEED_PATCH */
  6163. ), [
  6164. [vue.vModelText, _ctx.modalRemark]
  6165. ])
  6166. ]),
  6167. vue.createElementVNode("view", { class: "um-footer" }, [
  6168. vue.createElementVNode(
  6169. "view",
  6170. {
  6171. class: vue.normalizeClass(["um-submit-btn", { "active": _ctx.modalMediaList.length > 0 }]),
  6172. onClick: _cache[26] || (_cache[26] = (...args) => _ctx.handleConfirmUpload && _ctx.handleConfirmUpload(...args))
  6173. },
  6174. " 确认提交",
  6175. 2
  6176. /* CLASS */
  6177. )
  6178. ])
  6179. ])
  6180. ])) : vue.createCommentVNode("v-if", true),
  6181. _ctx.showSumModal ? (vue.openBlock(), vue.createElementBlock("view", {
  6182. key: 4,
  6183. class: "sum-modal-mask",
  6184. onClick: _cache[32] || (_cache[32] = (...args) => _ctx.closeSumModal && _ctx.closeSumModal(...args))
  6185. }, [
  6186. vue.createElementVNode("view", {
  6187. class: "sum-modal-card",
  6188. onClick: _cache[31] || (_cache[31] = vue.withModifiers(() => {
  6189. }, ["stop"]))
  6190. }, [
  6191. vue.createElementVNode("scroll-view", {
  6192. "scroll-y": "",
  6193. class: "sum-modal-scroll"
  6194. }, [
  6195. vue.createElementVNode("view", { class: "sum-modal-inner" }, [
  6196. vue.createElementVNode("text", { class: "sum-modal-title" }, "宠物护理工作小结"),
  6197. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6198. vue.createElementVNode("text", { class: "sum-meta-label" }, "日期:"),
  6199. vue.createElementVNode(
  6200. "text",
  6201. { class: "sum-meta-val" },
  6202. vue.toDisplayString(_ctx.sumDate),
  6203. 1
  6204. /* TEXT */
  6205. )
  6206. ]),
  6207. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6208. vue.createElementVNode("text", { class: "sum-meta-label" }, "客户住址:"),
  6209. vue.createElementVNode(
  6210. "text",
  6211. { class: "sum-meta-val" },
  6212. vue.toDisplayString(_ctx.orderDetail.endAddress),
  6213. 1
  6214. /* TEXT */
  6215. )
  6216. ]),
  6217. vue.createElementVNode("view", { class: "sum-meta-row" }, [
  6218. vue.createElementVNode("text", { class: "sum-meta-label" }, "宠主姓名:"),
  6219. vue.createElementVNode(
  6220. "text",
  6221. { class: "sum-meta-val" },
  6222. vue.toDisplayString(_ctx.orderDetail.ownerName || "张**"),
  6223. 1
  6224. /* TEXT */
  6225. )
  6226. ]),
  6227. vue.createElementVNode("view", { class: "sum-section-title" }, "宠物信息"),
  6228. vue.createElementVNode("view", { class: "sum-pet-card" }, [
  6229. vue.createElementVNode("image", {
  6230. class: "sum-pet-avatar",
  6231. src: _ctx.orderDetail.petAvatar,
  6232. mode: "aspectFill"
  6233. }, null, 8, ["src"]),
  6234. vue.createElementVNode("view", { class: "sum-pet-info" }, [
  6235. vue.createElementVNode("view", { class: "sum-pet-name-row" }, [
  6236. vue.createElementVNode(
  6237. "text",
  6238. { class: "sum-pet-name" },
  6239. vue.toDisplayString(_ctx.orderDetail.petName),
  6240. 1
  6241. /* TEXT */
  6242. ),
  6243. vue.createElementVNode(
  6244. "text",
  6245. { class: "sum-pet-breed" },
  6246. "品种: " + vue.toDisplayString(_ctx.orderDetail.petBreed),
  6247. 1
  6248. /* TEXT */
  6249. )
  6250. ]),
  6251. vue.createElementVNode(
  6252. "text",
  6253. { class: "sum-pet-remark" },
  6254. vue.toDisplayString(_ctx.orderDetail.petNotes || "喜欢坐车,有点晗车,请注意通风。"),
  6255. 1
  6256. /* TEXT */
  6257. )
  6258. ])
  6259. ]),
  6260. vue.createElementVNode("view", { class: "sum-section-title" }, "服务内容记录"),
  6261. vue.withDirectives(vue.createElementVNode(
  6262. "textarea",
  6263. {
  6264. class: "sum-textarea",
  6265. "onUpdate:modelValue": _cache[29] || (_cache[29] = ($event) => _ctx.sumContent = $event),
  6266. "auto-height": "",
  6267. placeholder: "请填写服务内容...",
  6268. "placeholder-style": "color:#ccc"
  6269. },
  6270. null,
  6271. 512
  6272. /* NEED_PATCH */
  6273. ), [
  6274. [vue.vModelText, _ctx.sumContent]
  6275. ]),
  6276. vue.createElementVNode("view", { class: "sum-sign-row" }, [
  6277. vue.createElementVNode("text", { class: "sum-sign-label" }, "护宠师签名:"),
  6278. vue.createElementVNode(
  6279. "text",
  6280. { class: "sum-sign-val" },
  6281. vue.toDisplayString(_ctx.sumSigner),
  6282. 1
  6283. /* TEXT */
  6284. )
  6285. ]),
  6286. vue.createElementVNode("view", { style: { "height": "20rpx" } })
  6287. ])
  6288. ]),
  6289. vue.createElementVNode("view", { class: "sum-footer" }, [
  6290. vue.createElementVNode("button", {
  6291. class: "sum-submit-btn",
  6292. onClick: _cache[30] || (_cache[30] = (...args) => _ctx.submitSumModal && _ctx.submitSumModal(...args))
  6293. }, "提交小结")
  6294. ])
  6295. ])
  6296. ])) : vue.createCommentVNode("v-if", true)
  6297. ]);
  6298. }
  6299. const PagesOrdersDetail = /* @__PURE__ */ _export_sfc(_sfc_main$q, [["render", _sfc_render$p], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/detail.vue"]]);
  6300. const _sfc_main$p = {
  6301. data() {
  6302. return {
  6303. // 已选异常类型
  6304. selectedType: "其他异常",
  6305. // 异常描述
  6306. anomalyDesc: "",
  6307. // 照片列表
  6308. photoList: [],
  6309. // 是否显示类型选择器
  6310. showTypeSheet: false,
  6311. // 异常类型列表
  6312. anomalyTypes: [
  6313. "无法联系用户",
  6314. "地址错误",
  6315. "宠物身体异常",
  6316. "设施损坏",
  6317. "用户拒收",
  6318. "其他异常"
  6319. ]
  6320. };
  6321. },
  6322. methods: {
  6323. // 打开类型选择器
  6324. openTypeSheet() {
  6325. this.showTypeSheet = true;
  6326. },
  6327. // 关闭类型选择器
  6328. closeTypeSheet() {
  6329. this.showTypeSheet = false;
  6330. },
  6331. // 选择异常类型
  6332. selectType(type) {
  6333. this.selectedType = type;
  6334. this.closeTypeSheet();
  6335. },
  6336. // 选择照片
  6337. choosePhoto() {
  6338. uni.chooseImage({
  6339. count: 5 - this.photoList.length,
  6340. sizeType: ["compressed"],
  6341. sourceType: ["album", "camera"],
  6342. success: (res) => {
  6343. this.photoList = [...this.photoList, ...res.tempFilePaths].slice(0, 5);
  6344. }
  6345. });
  6346. },
  6347. // 删除照片
  6348. removePhoto(idx) {
  6349. this.photoList.splice(idx, 1);
  6350. },
  6351. // 提交上报
  6352. submitAnomaly() {
  6353. if (!this.selectedType) {
  6354. uni.showToast({ title: "请选择异常类型", icon: "none" });
  6355. return;
  6356. }
  6357. if (this.photoList.length === 0) {
  6358. uni.showToast({ title: "请上传现场照片", icon: "none" });
  6359. return;
  6360. }
  6361. uni.showLoading({ title: "提交中..." });
  6362. setTimeout(() => {
  6363. uni.hideLoading();
  6364. uni.showToast({ title: "上报成功", icon: "success" });
  6365. setTimeout(() => {
  6366. uni.navigateBack();
  6367. }, 1500);
  6368. }, 1e3);
  6369. }
  6370. }
  6371. };
  6372. function _sfc_render$o(_ctx, _cache, $props, $setup, $data, $options) {
  6373. return vue.openBlock(), vue.createElementBlock("view", { class: "anomaly-container" }, [
  6374. vue.createElementVNode("scroll-view", {
  6375. "scroll-y": "",
  6376. class: "anomaly-scroll"
  6377. }, [
  6378. vue.createElementVNode("view", { class: "ano-card" }, [
  6379. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6380. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6381. vue.createElementVNode("text", { class: "ano-title-text" }, "异常类型")
  6382. ]),
  6383. vue.createElementVNode("view", {
  6384. class: "ano-type-row",
  6385. onClick: _cache[0] || (_cache[0] = (...args) => $options.openTypeSheet && $options.openTypeSheet(...args))
  6386. }, [
  6387. vue.createElementVNode(
  6388. "text",
  6389. {
  6390. class: vue.normalizeClass(["ano-type-val", { "placeholder": !$data.selectedType }])
  6391. },
  6392. vue.toDisplayString($data.selectedType || "其他异常"),
  6393. 3
  6394. /* TEXT, CLASS */
  6395. ),
  6396. vue.createElementVNode("image", {
  6397. class: "ano-right-arrow",
  6398. src: _imports_0$2
  6399. })
  6400. ])
  6401. ]),
  6402. vue.createElementVNode("view", { class: "ano-card" }, [
  6403. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6404. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6405. vue.createElementVNode("text", { class: "ano-title-text" }, "异常描述")
  6406. ]),
  6407. vue.withDirectives(vue.createElementVNode(
  6408. "textarea",
  6409. {
  6410. class: "ano-textarea",
  6411. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.anomalyDesc = $event),
  6412. placeholder: "请详细描述现场异常情况...",
  6413. "placeholder-style": "color:#ccc; font-size:28rpx;",
  6414. maxlength: "500"
  6415. },
  6416. null,
  6417. 512
  6418. /* NEED_PATCH */
  6419. ), [
  6420. [vue.vModelText, $data.anomalyDesc]
  6421. ])
  6422. ]),
  6423. vue.createElementVNode("view", { class: "ano-card" }, [
  6424. vue.createElementVNode("view", { class: "ano-section-title" }, [
  6425. vue.createElementVNode("view", { class: "ano-title-bar" }),
  6426. vue.createElementVNode("text", { class: "ano-title-text" }, "现场照片 (必填,最多5张)")
  6427. ]),
  6428. vue.createElementVNode("view", { class: "ano-photo-grid" }, [
  6429. (vue.openBlock(true), vue.createElementBlock(
  6430. vue.Fragment,
  6431. null,
  6432. vue.renderList($data.photoList, (img, idx) => {
  6433. return vue.openBlock(), vue.createElementBlock("view", {
  6434. class: "ano-photo-item",
  6435. key: idx
  6436. }, [
  6437. vue.createElementVNode("image", {
  6438. class: "ano-photo-preview",
  6439. src: img,
  6440. mode: "aspectFill"
  6441. }, null, 8, ["src"]),
  6442. vue.createElementVNode("view", {
  6443. class: "ano-photo-del",
  6444. onClick: ($event) => $options.removePhoto(idx)
  6445. }, "×", 8, ["onClick"])
  6446. ]);
  6447. }),
  6448. 128
  6449. /* KEYED_FRAGMENT */
  6450. )),
  6451. $data.photoList.length < 5 ? (vue.openBlock(), vue.createElementBlock("view", {
  6452. key: 0,
  6453. class: "ano-photo-add",
  6454. onClick: _cache[2] || (_cache[2] = (...args) => $options.choosePhoto && $options.choosePhoto(...args))
  6455. }, [
  6456. vue.createElementVNode("image", {
  6457. class: "ano-add-icon",
  6458. src: _imports_1$6
  6459. }),
  6460. vue.createElementVNode("text", { class: "ano-add-text" }, "上传")
  6461. ])) : vue.createCommentVNode("v-if", true)
  6462. ])
  6463. ]),
  6464. vue.createElementVNode("view", { style: { "height": "160rpx" } })
  6465. ]),
  6466. vue.createElementVNode("view", { class: "ano-footer" }, [
  6467. vue.createElementVNode("button", {
  6468. class: "ano-submit-btn",
  6469. onClick: _cache[3] || (_cache[3] = (...args) => $options.submitAnomaly && $options.submitAnomaly(...args))
  6470. }, "提交上报")
  6471. ]),
  6472. $data.showTypeSheet ? (vue.openBlock(), vue.createElementBlock("view", {
  6473. key: 0,
  6474. class: "ano-sheet-mask",
  6475. onClick: _cache[6] || (_cache[6] = (...args) => $options.closeTypeSheet && $options.closeTypeSheet(...args))
  6476. }, [
  6477. vue.createElementVNode("view", {
  6478. class: "ano-sheet",
  6479. onClick: _cache[5] || (_cache[5] = vue.withModifiers(() => {
  6480. }, ["stop"]))
  6481. }, [
  6482. vue.createElementVNode("text", { class: "ano-sheet-title" }, "选择异常类型"),
  6483. vue.createElementVNode("scroll-view", {
  6484. "scroll-y": "",
  6485. class: "ano-sheet-list"
  6486. }, [
  6487. (vue.openBlock(true), vue.createElementBlock(
  6488. vue.Fragment,
  6489. null,
  6490. vue.renderList($data.anomalyTypes, (type, idx) => {
  6491. return vue.openBlock(), vue.createElementBlock("view", {
  6492. class: "ano-sheet-item",
  6493. key: idx,
  6494. onClick: ($event) => $options.selectType(type)
  6495. }, [
  6496. vue.createElementVNode(
  6497. "text",
  6498. {
  6499. class: vue.normalizeClass(["ano-sheet-item-text", { "selected": $data.selectedType === type }])
  6500. },
  6501. vue.toDisplayString(type),
  6502. 3
  6503. /* TEXT, CLASS */
  6504. ),
  6505. $data.selectedType === type ? (vue.openBlock(), vue.createElementBlock("image", {
  6506. key: 0,
  6507. class: "ano-check-icon",
  6508. src: _imports_0$2
  6509. })) : vue.createCommentVNode("v-if", true)
  6510. ], 8, ["onClick"]);
  6511. }),
  6512. 128
  6513. /* KEYED_FRAGMENT */
  6514. ))
  6515. ]),
  6516. vue.createElementVNode("view", {
  6517. class: "ano-sheet-cancel",
  6518. onClick: _cache[4] || (_cache[4] = (...args) => $options.closeTypeSheet && $options.closeTypeSheet(...args))
  6519. }, "取消")
  6520. ])
  6521. ])) : vue.createCommentVNode("v-if", true)
  6522. ]);
  6523. }
  6524. const PagesOrdersAnomaly = /* @__PURE__ */ _export_sfc(_sfc_main$p, [["render", _sfc_render$o], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/orders/anomaly.vue"]]);
  6525. const _sfc_main$o = {
  6526. data() {
  6527. return {
  6528. tabs: ["全部", "已完成", "已拒绝"],
  6529. activeTab: 0,
  6530. orders: [
  6531. {
  6532. orderType: 1,
  6533. typeName: "接送",
  6534. typeIcon: "/static/icons/car.svg",
  6535. status: "完成",
  6536. finishTime: "2026/02/03 14:30",
  6537. serviceTime: "2026/02/10 10:00",
  6538. petName: "哈士奇宝宝",
  6539. petBreed: "哈士奇",
  6540. petAvatar: "/static/dog.png",
  6541. price: "20.00",
  6542. startName: "武汉大学宠物店",
  6543. startAddr: "武汉市洪山区珞喻路458号",
  6544. endName: "张** 189****8451",
  6545. endAddr: "武汉市武昌区新区大道凤凰广场A座",
  6546. serviceNote: ""
  6547. },
  6548. {
  6549. orderType: 2,
  6550. typeName: "喂遛",
  6551. typeIcon: "/static/icons/walk.svg",
  6552. status: "完成",
  6553. finishTime: "2026/02/03 15:00",
  6554. serviceTime: "2026/02/11 14:00",
  6555. petName: "金毛",
  6556. petBreed: "金毛寻回犬",
  6557. petAvatar: "/static/dog.png",
  6558. price: "35.00",
  6559. startName: "",
  6560. startAddr: "",
  6561. endName: "王女士 138****1234",
  6562. endAddr: "武汉市江汉区泛海国际居住区",
  6563. serviceNote: "需自带牵引绳,遛弯30分钟。"
  6564. },
  6565. {
  6566. orderType: 3,
  6567. typeName: "洗护",
  6568. typeIcon: "/static/icons/wash.svg",
  6569. status: "拒绝",
  6570. finishTime: "2026/02/03 09:30",
  6571. serviceTime: "2026/02/12 09:30",
  6572. petName: "Mimi",
  6573. petBreed: "布偶猫",
  6574. petAvatar: "/static/dog.png",
  6575. price: "50.00",
  6576. startName: "",
  6577. startAddr: "",
  6578. endName: "赵先生 159****9876",
  6579. endAddr: "武汉市汉阳区钟家村",
  6580. serviceNote: "上门洗澡,剪指甲。"
  6581. }
  6582. ]
  6583. };
  6584. },
  6585. computed: {
  6586. filteredOrders() {
  6587. if (this.activeTab === 0)
  6588. return this.orders;
  6589. if (this.activeTab === 1)
  6590. return this.orders.filter((o) => o.status === "完成");
  6591. return this.orders.filter((o) => o.status === "拒绝");
  6592. }
  6593. },
  6594. methods: {
  6595. switchTab(idx) {
  6596. this.activeTab = idx;
  6597. }
  6598. }
  6599. };
  6600. function _sfc_render$n(_ctx, _cache, $props, $setup, $data, $options) {
  6601. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  6602. vue.createElementVNode("view", { class: "stats-banner" }, [
  6603. vue.createElementVNode("view", { class: "banner-item" }, [
  6604. vue.createElementVNode("text", { class: "banner-num" }, "2546"),
  6605. vue.createElementVNode("text", { class: "banner-label" }, "累计接单")
  6606. ]),
  6607. vue.createElementVNode("view", { class: "banner-item" }, [
  6608. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6609. vue.createElementVNode("text", { class: "banner-label" }, "累计拒单")
  6610. ]),
  6611. vue.createElementVNode("view", { class: "banner-item" }, [
  6612. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6613. vue.createElementVNode("text", { class: "banner-label" }, "奖励单量")
  6614. ]),
  6615. vue.createElementVNode("view", { class: "banner-item" }, [
  6616. vue.createElementVNode("text", { class: "banner-num" }, "10"),
  6617. vue.createElementVNode("text", { class: "banner-label" }, "惩罚单量")
  6618. ]),
  6619. vue.createElementVNode("view", { class: "banner-item" }, [
  6620. vue.createElementVNode("text", { class: "banner-num" }, [
  6621. vue.createTextVNode("158"),
  6622. vue.createElementVNode("text", { class: "banner-unit" }, "天")
  6623. ]),
  6624. vue.createElementVNode("text", { class: "banner-label" }, "服务时长")
  6625. ])
  6626. ]),
  6627. vue.createElementVNode("view", { class: "tab-bar" }, [
  6628. (vue.openBlock(true), vue.createElementBlock(
  6629. vue.Fragment,
  6630. null,
  6631. vue.renderList($data.tabs, (tab, idx) => {
  6632. return vue.openBlock(), vue.createElementBlock("view", {
  6633. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  6634. key: idx,
  6635. onClick: ($event) => $options.switchTab(idx)
  6636. }, [
  6637. vue.createElementVNode(
  6638. "text",
  6639. null,
  6640. vue.toDisplayString(tab),
  6641. 1
  6642. /* TEXT */
  6643. ),
  6644. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  6645. key: 0,
  6646. class: "tab-line"
  6647. })) : vue.createCommentVNode("v-if", true)
  6648. ], 10, ["onClick"]);
  6649. }),
  6650. 128
  6651. /* KEYED_FRAGMENT */
  6652. ))
  6653. ]),
  6654. vue.createElementVNode("scroll-view", {
  6655. "scroll-y": "",
  6656. class: "order-scroll"
  6657. }, [
  6658. vue.createElementVNode("view", { style: { "height": "16rpx" } }),
  6659. (vue.openBlock(true), vue.createElementBlock(
  6660. vue.Fragment,
  6661. null,
  6662. vue.renderList($options.filteredOrders, (order, idx) => {
  6663. return vue.openBlock(), vue.createElementBlock("view", {
  6664. class: "order-card",
  6665. key: idx
  6666. }, [
  6667. vue.createElementVNode("view", { class: "card-header" }, [
  6668. vue.createElementVNode("view", { class: "type-badge" }, [
  6669. vue.createElementVNode("image", {
  6670. class: "type-icon",
  6671. src: order.typeIcon
  6672. }, null, 8, ["src"]),
  6673. vue.createElementVNode(
  6674. "text",
  6675. { class: "type-text" },
  6676. vue.toDisplayString(order.typeName),
  6677. 1
  6678. /* TEXT */
  6679. )
  6680. ]),
  6681. vue.createElementVNode(
  6682. "text",
  6683. {
  6684. class: vue.normalizeClass(["status-text", order.status === "完成" ? "green" : "red"])
  6685. },
  6686. vue.toDisplayString(order.status === "完成" ? "完成:" : "拒绝:") + vue.toDisplayString(order.finishTime),
  6687. 3
  6688. /* TEXT, CLASS */
  6689. )
  6690. ]),
  6691. vue.createElementVNode(
  6692. "text",
  6693. { class: "service-time" },
  6694. "服务时间:" + vue.toDisplayString(order.serviceTime),
  6695. 1
  6696. /* TEXT */
  6697. ),
  6698. vue.createElementVNode("view", { class: "pet-card" }, [
  6699. vue.createElementVNode("image", {
  6700. class: "pet-avatar",
  6701. src: order.petAvatar,
  6702. mode: "aspectFill"
  6703. }, null, 8, ["src"]),
  6704. vue.createElementVNode("view", { class: "pet-info" }, [
  6705. vue.createElementVNode(
  6706. "text",
  6707. { class: "pet-name" },
  6708. vue.toDisplayString(order.petName),
  6709. 1
  6710. /* TEXT */
  6711. ),
  6712. vue.createElementVNode(
  6713. "text",
  6714. { class: "pet-breed" },
  6715. "品种: " + vue.toDisplayString(order.petBreed),
  6716. 1
  6717. /* TEXT */
  6718. )
  6719. ]),
  6720. vue.createElementVNode(
  6721. "text",
  6722. { class: "pet-price" },
  6723. "¥" + vue.toDisplayString(order.price),
  6724. 1
  6725. /* TEXT */
  6726. )
  6727. ]),
  6728. vue.createElementVNode("view", { class: "route-info" }, [
  6729. order.orderType === 1 ? (vue.openBlock(), vue.createElementBlock(
  6730. vue.Fragment,
  6731. { key: 0 },
  6732. [
  6733. vue.createElementVNode("view", { class: "route-item" }, [
  6734. vue.createElementVNode("view", { class: "icon-circle pickup" }, "取"),
  6735. vue.createElementVNode("view", { class: "route-connector" }),
  6736. vue.createElementVNode("view", { class: "address-box" }, [
  6737. vue.createElementVNode(
  6738. "text",
  6739. { class: "addr-title" },
  6740. vue.toDisplayString(order.startName),
  6741. 1
  6742. /* TEXT */
  6743. ),
  6744. vue.createElementVNode(
  6745. "text",
  6746. { class: "addr-desc" },
  6747. vue.toDisplayString(order.startAddr),
  6748. 1
  6749. /* TEXT */
  6750. )
  6751. ])
  6752. ]),
  6753. vue.createElementVNode("view", { class: "route-item" }, [
  6754. vue.createElementVNode("view", { class: "icon-circle deliver" }, "送"),
  6755. vue.createElementVNode("view", { class: "address-box" }, [
  6756. vue.createElementVNode(
  6757. "text",
  6758. { class: "addr-title" },
  6759. vue.toDisplayString(order.endName),
  6760. 1
  6761. /* TEXT */
  6762. ),
  6763. vue.createElementVNode(
  6764. "text",
  6765. { class: "addr-desc" },
  6766. vue.toDisplayString(order.endAddr),
  6767. 1
  6768. /* TEXT */
  6769. )
  6770. ])
  6771. ])
  6772. ],
  6773. 64
  6774. /* STABLE_FRAGMENT */
  6775. )) : (vue.openBlock(), vue.createElementBlock(
  6776. vue.Fragment,
  6777. { key: 1 },
  6778. [
  6779. vue.createElementVNode("view", { class: "route-item" }, [
  6780. vue.createElementVNode("view", { class: "icon-circle service" }, "服"),
  6781. vue.createElementVNode("view", { class: "address-box" }, [
  6782. vue.createElementVNode(
  6783. "text",
  6784. { class: "addr-title" },
  6785. vue.toDisplayString(order.endName),
  6786. 1
  6787. /* TEXT */
  6788. ),
  6789. vue.createElementVNode(
  6790. "text",
  6791. { class: "addr-desc" },
  6792. vue.toDisplayString(order.endAddr),
  6793. 1
  6794. /* TEXT */
  6795. )
  6796. ])
  6797. ]),
  6798. order.serviceNote ? (vue.openBlock(), vue.createElementBlock("view", {
  6799. key: 0,
  6800. class: "service-note-row"
  6801. }, [
  6802. vue.createElementVNode(
  6803. "text",
  6804. { class: "service-note-text" },
  6805. "服务内容:" + vue.toDisplayString(order.serviceNote),
  6806. 1
  6807. /* TEXT */
  6808. )
  6809. ])) : vue.createCommentVNode("v-if", true)
  6810. ],
  6811. 64
  6812. /* STABLE_FRAGMENT */
  6813. ))
  6814. ])
  6815. ]);
  6816. }),
  6817. 128
  6818. /* KEYED_FRAGMENT */
  6819. )),
  6820. $options.filteredOrders.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  6821. key: 0,
  6822. class: "empty-state"
  6823. }, [
  6824. vue.createElementVNode("text", { class: "empty-text" }, "暂无相关订单")
  6825. ])) : vue.createCommentVNode("v-if", true),
  6826. vue.createElementVNode("view", { style: { "height": "40rpx" } })
  6827. ])
  6828. ]);
  6829. }
  6830. 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"]]);
  6831. const _sfc_main$n = {
  6832. data() {
  6833. return {
  6834. tabs: ["全部", "奖励", "惩罚"],
  6835. activeTab: 0,
  6836. selectedYear: 2026,
  6837. selectedMonth: 2,
  6838. // 月份选择器状态
  6839. showMonthPicker: false,
  6840. pickerYear: 2026,
  6841. pickerMonth: 2,
  6842. years: [2021, 2022, 2023, 2024, 2025, 2026],
  6843. months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  6844. yearScrollTop: 0,
  6845. monthScrollTop: 0,
  6846. // 奖惩记录列表
  6847. records: [
  6848. { date: "09-01", title: "单量奖励", desc: "超140单", amount: 560, status: "待入账", statusClass: "pending", type: "reward" },
  6849. { date: "08-01", title: "单量奖励", desc: "超470单", amount: 2050, status: "已入账", statusClass: "credited", type: "reward" },
  6850. { date: "09-02", title: "超时扣款", desc: "订单#T982 超时30分钟", amount: -15, status: "已扣款", statusClass: "deducted", type: "penalty" },
  6851. { date: "09-05", title: "高温补贴", desc: "8月份高温天气补贴", amount: 300, status: "已入账", statusClass: "credited", type: "reward" }
  6852. ]
  6853. };
  6854. },
  6855. computed: {
  6856. filteredList() {
  6857. if (this.activeTab === 0)
  6858. return this.records;
  6859. if (this.activeTab === 1)
  6860. return this.records.filter((r) => r.type === "reward");
  6861. return this.records.filter((r) => r.type === "penalty");
  6862. }
  6863. },
  6864. methods: {
  6865. switchTab(idx) {
  6866. this.activeTab = idx;
  6867. },
  6868. openMonthPicker() {
  6869. this.pickerYear = this.selectedYear;
  6870. this.pickerMonth = this.selectedMonth;
  6871. this.showMonthPicker = true;
  6872. },
  6873. closeMonthPicker() {
  6874. this.showMonthPicker = false;
  6875. },
  6876. confirmMonthPicker() {
  6877. this.selectedYear = this.pickerYear;
  6878. this.selectedMonth = this.pickerMonth;
  6879. this.closeMonthPicker();
  6880. },
  6881. goToAll() {
  6882. uni.navigateTo({ url: "/pages/mine/rewards-all" });
  6883. }
  6884. }
  6885. };
  6886. function _sfc_render$m(_ctx, _cache, $props, $setup, $data, $options) {
  6887. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  6888. vue.createElementVNode("view", { class: "top-banner" }, [
  6889. vue.createElementVNode("view", {
  6890. class: "month-btn",
  6891. onClick: _cache[0] || (_cache[0] = (...args) => $options.openMonthPicker && $options.openMonthPicker(...args))
  6892. }, [
  6893. vue.createElementVNode(
  6894. "text",
  6895. { class: "month-text" },
  6896. vue.toDisplayString($data.selectedYear) + "年" + vue.toDisplayString($data.selectedMonth) + "月 ▾",
  6897. 1
  6898. /* TEXT */
  6899. )
  6900. ]),
  6901. vue.createElementVNode("view", { class: "stats-grid" }, [
  6902. vue.createElementVNode("view", { class: "stats-cell" }, [
  6903. vue.createElementVNode("text", { class: "stats-label" }, "奖励订单"),
  6904. vue.createElementVNode("text", { class: "stats-num" }, [
  6905. vue.createTextVNode("3"),
  6906. vue.createElementVNode("text", { class: "stats-unit" }, "单")
  6907. ]),
  6908. vue.createElementVNode("view", { class: "stats-divider" }),
  6909. vue.createElementVNode("text", { class: "stats-sub" }, "累计 1258单")
  6910. ]),
  6911. vue.createElementVNode("view", { class: "stats-cell" }, [
  6912. vue.createElementVNode("text", { class: "stats-label" }, "惩罚订单"),
  6913. vue.createElementVNode("text", { class: "stats-num" }, [
  6914. vue.createTextVNode("1"),
  6915. vue.createElementVNode("text", { class: "stats-unit" }, "单")
  6916. ]),
  6917. vue.createElementVNode("view", { class: "stats-divider" }),
  6918. vue.createElementVNode("text", { class: "stats-sub" }, "累计 12单")
  6919. ]),
  6920. vue.createElementVNode("view", { class: "stats-cell" }, [
  6921. vue.createElementVNode("text", { class: "stats-label" }, "奖励金额"),
  6922. vue.createElementVNode("text", { class: "stats-num reward-num" }, "2910.00"),
  6923. vue.createElementVNode("view", { class: "stats-divider" }),
  6924. vue.createElementVNode("text", { class: "stats-sub" }, "累计 45800.00")
  6925. ]),
  6926. vue.createElementVNode("view", { class: "stats-cell" }, [
  6927. vue.createElementVNode("text", { class: "stats-label" }, "惩罚金额"),
  6928. vue.createElementVNode("text", { class: "stats-num penalty-num" }, "-15.00"),
  6929. vue.createElementVNode("view", { class: "stats-divider" }),
  6930. vue.createElementVNode("text", { class: "stats-sub" }, "累计 350.00")
  6931. ])
  6932. ])
  6933. ]),
  6934. vue.createElementVNode("view", { class: "list-header" }, [
  6935. vue.createElementVNode("view", { class: "tab-bar" }, [
  6936. (vue.openBlock(true), vue.createElementBlock(
  6937. vue.Fragment,
  6938. null,
  6939. vue.renderList($data.tabs, (tab, idx) => {
  6940. return vue.openBlock(), vue.createElementBlock("view", {
  6941. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  6942. key: idx,
  6943. onClick: ($event) => $options.switchTab(idx)
  6944. }, [
  6945. vue.createElementVNode(
  6946. "text",
  6947. null,
  6948. vue.toDisplayString(tab),
  6949. 1
  6950. /* TEXT */
  6951. ),
  6952. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  6953. key: 0,
  6954. class: "tab-line"
  6955. })) : vue.createCommentVNode("v-if", true)
  6956. ], 10, ["onClick"]);
  6957. }),
  6958. 128
  6959. /* KEYED_FRAGMENT */
  6960. ))
  6961. ]),
  6962. vue.createElementVNode("view", {
  6963. class: "view-all-btn",
  6964. onClick: _cache[1] || (_cache[1] = (...args) => $options.goToAll && $options.goToAll(...args))
  6965. }, [
  6966. vue.createElementVNode("text", { class: "view-all-text" }, "查看全部 ›")
  6967. ])
  6968. ]),
  6969. vue.createElementVNode("view", { class: "record-list" }, [
  6970. (vue.openBlock(true), vue.createElementBlock(
  6971. vue.Fragment,
  6972. null,
  6973. vue.renderList($options.filteredList, (item, idx) => {
  6974. return vue.openBlock(), vue.createElementBlock("view", {
  6975. class: "record-item",
  6976. key: idx
  6977. }, [
  6978. vue.createElementVNode(
  6979. "view",
  6980. {
  6981. class: vue.normalizeClass(["ri-icon", item.amount > 0 ? "ri-reward" : "ri-penalty"])
  6982. },
  6983. [
  6984. vue.createElementVNode("text", { class: "ri-icon-text" }, "¥")
  6985. ],
  6986. 2
  6987. /* CLASS */
  6988. ),
  6989. vue.createElementVNode("view", { class: "ri-content" }, [
  6990. vue.createElementVNode("view", { class: "ri-title-row" }, [
  6991. vue.createElementVNode(
  6992. "text",
  6993. { class: "ri-date" },
  6994. vue.toDisplayString(item.date),
  6995. 1
  6996. /* TEXT */
  6997. ),
  6998. vue.createElementVNode(
  6999. "text",
  7000. { class: "ri-title" },
  7001. vue.toDisplayString(item.title),
  7002. 1
  7003. /* TEXT */
  7004. )
  7005. ]),
  7006. vue.createElementVNode(
  7007. "text",
  7008. { class: "ri-desc" },
  7009. vue.toDisplayString(item.desc),
  7010. 1
  7011. /* TEXT */
  7012. )
  7013. ]),
  7014. vue.createElementVNode("view", { class: "ri-right" }, [
  7015. vue.createElementVNode(
  7016. "text",
  7017. {
  7018. class: vue.normalizeClass(["ri-amount", item.amount > 0 ? "positive" : "negative"])
  7019. },
  7020. vue.toDisplayString(item.amount > 0 ? "+" : "") + vue.toDisplayString(item.amount.toFixed(2)),
  7021. 3
  7022. /* TEXT, CLASS */
  7023. ),
  7024. vue.createElementVNode(
  7025. "text",
  7026. {
  7027. class: vue.normalizeClass(["ri-status", item.statusClass])
  7028. },
  7029. vue.toDisplayString(item.status),
  7030. 3
  7031. /* TEXT, CLASS */
  7032. )
  7033. ])
  7034. ]);
  7035. }),
  7036. 128
  7037. /* KEYED_FRAGMENT */
  7038. )),
  7039. vue.createElementVNode("text", { class: "more-hint" }, "更多记录请点击上方的查看全部")
  7040. ]),
  7041. $data.showMonthPicker ? (vue.openBlock(), vue.createElementBlock("view", {
  7042. key: 0,
  7043. class: "picker-mask",
  7044. onClick: _cache[7] || (_cache[7] = (...args) => $options.closeMonthPicker && $options.closeMonthPicker(...args))
  7045. }, [
  7046. vue.createElementVNode("view", {
  7047. class: "picker-sheet",
  7048. onClick: _cache[6] || (_cache[6] = vue.withModifiers(() => {
  7049. }, ["stop"]))
  7050. }, [
  7051. vue.createElementVNode("view", { class: "picker-header" }, [
  7052. vue.createElementVNode("text", {
  7053. class: "picker-cancel",
  7054. onClick: _cache[2] || (_cache[2] = (...args) => $options.closeMonthPicker && $options.closeMonthPicker(...args))
  7055. }, "取消"),
  7056. vue.createElementVNode("text", { class: "picker-title" }, "选择时间"),
  7057. vue.createElementVNode("text", {
  7058. class: "picker-confirm",
  7059. onClick: _cache[3] || (_cache[3] = (...args) => $options.confirmMonthPicker && $options.confirmMonthPicker(...args))
  7060. }, "确定")
  7061. ]),
  7062. vue.createElementVNode("view", { class: "picker-body" }, [
  7063. vue.createElementVNode("scroll-view", {
  7064. "scroll-y": "",
  7065. class: "picker-column",
  7066. "scroll-top": $data.yearScrollTop,
  7067. onScroll: _cache[4] || (_cache[4] = (...args) => _ctx.onYearScroll && _ctx.onYearScroll(...args))
  7068. }, [
  7069. vue.createElementVNode("view", { style: { "height": "80rpx" } }),
  7070. (vue.openBlock(true), vue.createElementBlock(
  7071. vue.Fragment,
  7072. null,
  7073. vue.renderList($data.years, (year) => {
  7074. return vue.openBlock(), vue.createElementBlock("view", {
  7075. class: vue.normalizeClass(["picker-col-item", { "picker-selected": $data.pickerYear === year }]),
  7076. key: year,
  7077. onClick: ($event) => $data.pickerYear = year
  7078. }, vue.toDisplayString(year) + "年", 11, ["onClick"]);
  7079. }),
  7080. 128
  7081. /* KEYED_FRAGMENT */
  7082. )),
  7083. vue.createElementVNode("view", { style: { "height": "80rpx" } })
  7084. ], 40, ["scroll-top"]),
  7085. vue.createElementVNode("view", { class: "picker-highlight" }),
  7086. vue.createElementVNode("scroll-view", {
  7087. "scroll-y": "",
  7088. class: "picker-column",
  7089. "scroll-top": $data.monthScrollTop,
  7090. onScroll: _cache[5] || (_cache[5] = (...args) => _ctx.onMonthScroll && _ctx.onMonthScroll(...args))
  7091. }, [
  7092. vue.createElementVNode("view", { style: { "height": "80rpx" } }),
  7093. (vue.openBlock(true), vue.createElementBlock(
  7094. vue.Fragment,
  7095. null,
  7096. vue.renderList($data.months, (month) => {
  7097. return vue.openBlock(), vue.createElementBlock("view", {
  7098. class: vue.normalizeClass(["picker-col-item", { "picker-selected": $data.pickerMonth === month }]),
  7099. key: month,
  7100. onClick: ($event) => $data.pickerMonth = month
  7101. }, vue.toDisplayString(month) + "月", 11, ["onClick"]);
  7102. }),
  7103. 128
  7104. /* KEYED_FRAGMENT */
  7105. )),
  7106. vue.createElementVNode("view", { style: { "height": "80rpx" } })
  7107. ], 40, ["scroll-top"])
  7108. ])
  7109. ])
  7110. ])) : vue.createCommentVNode("v-if", true)
  7111. ]);
  7112. }
  7113. const PagesMineRewards = /* @__PURE__ */ _export_sfc(_sfc_main$n, [["render", _sfc_render$m], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/rewards.vue"]]);
  7114. const _sfc_main$m = {
  7115. data() {
  7116. return {
  7117. tabs: ["全部", "奖励", "惩罚"],
  7118. activeTab: 0,
  7119. // 所有完整记录(按月分组)
  7120. allGroups: [
  7121. {
  7122. month: 9,
  7123. credited: 30,
  7124. pending: 0,
  7125. items: [
  7126. { date: "09-24", title: "高温补贴", desc: "9月份高温天气补贴", amount: 30, status: "已入账", statusClass: "credited", type: "reward" }
  7127. ]
  7128. },
  7129. {
  7130. month: 8,
  7131. credited: 2610,
  7132. pending: 0,
  7133. items: [
  7134. { date: "08-01", title: "单量奖励", desc: "超140单", amount: 560, status: "已入账", statusClass: "credited", type: "reward" },
  7135. { date: "07-01", title: "单量奖励", desc: "超470单", amount: 2050, status: "已入账", statusClass: "credited", type: "reward" }
  7136. ]
  7137. },
  7138. {
  7139. month: 7,
  7140. credited: 0,
  7141. pending: 0,
  7142. items: [
  7143. { date: "07-15", title: "超时扣款", desc: "订单#T98211 超时30分钟", amount: -15, status: "已扣款", statusClass: "deducted", type: "penalty" },
  7144. { date: "07-20", title: "客诉扣款", desc: "订单#T98222 餐品遗漏", amount: -50, status: "已扣款", statusClass: "deducted", type: "penalty" }
  7145. ]
  7146. }
  7147. ]
  7148. };
  7149. },
  7150. computed: {
  7151. filteredGroups() {
  7152. if (this.activeTab === 0)
  7153. return this.allGroups;
  7154. const typeKey = this.activeTab === 1 ? "reward" : "penalty";
  7155. return this.allGroups.map((g) => ({
  7156. ...g,
  7157. items: g.items.filter((i) => i.type === typeKey)
  7158. })).filter((g) => g.items.length > 0);
  7159. }
  7160. },
  7161. methods: {
  7162. switchTab(idx) {
  7163. this.activeTab = idx;
  7164. }
  7165. }
  7166. };
  7167. function _sfc_render$l(_ctx, _cache, $props, $setup, $data, $options) {
  7168. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7169. vue.createElementVNode("view", { class: "tab-bar" }, [
  7170. (vue.openBlock(true), vue.createElementBlock(
  7171. vue.Fragment,
  7172. null,
  7173. vue.renderList($data.tabs, (tab, idx) => {
  7174. return vue.openBlock(), vue.createElementBlock("view", {
  7175. class: vue.normalizeClass(["tab-item", { active: $data.activeTab === idx }]),
  7176. key: idx,
  7177. onClick: ($event) => $options.switchTab(idx)
  7178. }, [
  7179. vue.createElementVNode(
  7180. "text",
  7181. null,
  7182. vue.toDisplayString(tab),
  7183. 1
  7184. /* TEXT */
  7185. ),
  7186. $data.activeTab === idx ? (vue.openBlock(), vue.createElementBlock("view", {
  7187. key: 0,
  7188. class: "tab-line"
  7189. })) : vue.createCommentVNode("v-if", true)
  7190. ], 10, ["onClick"]);
  7191. }),
  7192. 128
  7193. /* KEYED_FRAGMENT */
  7194. ))
  7195. ]),
  7196. vue.createElementVNode("scroll-view", {
  7197. "scroll-y": "",
  7198. class: "main-scroll"
  7199. }, [
  7200. (vue.openBlock(true), vue.createElementBlock(
  7201. vue.Fragment,
  7202. null,
  7203. vue.renderList($options.filteredGroups, (group, gIdx) => {
  7204. return vue.openBlock(), vue.createElementBlock("view", {
  7205. key: gIdx,
  7206. class: "month-group"
  7207. }, [
  7208. vue.createElementVNode("view", { class: "month-header" }, [
  7209. vue.createElementVNode(
  7210. "text",
  7211. { class: "month-title" },
  7212. vue.toDisplayString(group.month) + "月",
  7213. 1
  7214. /* TEXT */
  7215. ),
  7216. vue.createElementVNode("view", { class: "month-summary" }, [
  7217. vue.createElementVNode(
  7218. "text",
  7219. { class: "month-sum-text" },
  7220. "已入账¥" + vue.toDisplayString(group.credited.toFixed(2)),
  7221. 1
  7222. /* TEXT */
  7223. ),
  7224. vue.createElementVNode(
  7225. "text",
  7226. { class: "month-sum-text" },
  7227. " 待入账¥" + vue.toDisplayString(group.pending.toFixed(2)),
  7228. 1
  7229. /* TEXT */
  7230. )
  7231. ])
  7232. ]),
  7233. (vue.openBlock(true), vue.createElementBlock(
  7234. vue.Fragment,
  7235. null,
  7236. vue.renderList(group.items, (item, rIdx) => {
  7237. return vue.openBlock(), vue.createElementBlock("view", {
  7238. class: "record-item",
  7239. key: rIdx
  7240. }, [
  7241. vue.createElementVNode(
  7242. "view",
  7243. {
  7244. class: vue.normalizeClass(["ri-icon", item.amount > 0 ? "ri-reward" : "ri-penalty"])
  7245. },
  7246. [
  7247. vue.createElementVNode("text", { class: "ri-icon-text" }, "¥")
  7248. ],
  7249. 2
  7250. /* CLASS */
  7251. ),
  7252. vue.createElementVNode("view", { class: "ri-content" }, [
  7253. vue.createElementVNode("view", { class: "ri-title-row" }, [
  7254. vue.createElementVNode(
  7255. "text",
  7256. { class: "ri-date" },
  7257. vue.toDisplayString(item.date),
  7258. 1
  7259. /* TEXT */
  7260. ),
  7261. vue.createElementVNode(
  7262. "text",
  7263. { class: "ri-title" },
  7264. vue.toDisplayString(item.title),
  7265. 1
  7266. /* TEXT */
  7267. )
  7268. ]),
  7269. vue.createElementVNode(
  7270. "text",
  7271. { class: "ri-desc" },
  7272. vue.toDisplayString(item.desc),
  7273. 1
  7274. /* TEXT */
  7275. )
  7276. ]),
  7277. vue.createElementVNode("view", { class: "ri-right" }, [
  7278. vue.createElementVNode(
  7279. "text",
  7280. {
  7281. class: vue.normalizeClass(["ri-amount", item.amount > 0 ? "positive" : "negative"])
  7282. },
  7283. vue.toDisplayString(item.amount > 0 ? "+" : "") + vue.toDisplayString(item.amount.toFixed(2)),
  7284. 3
  7285. /* TEXT, CLASS */
  7286. ),
  7287. vue.createElementVNode(
  7288. "text",
  7289. {
  7290. class: vue.normalizeClass(["ri-status", item.statusClass])
  7291. },
  7292. vue.toDisplayString(item.status),
  7293. 3
  7294. /* TEXT, CLASS */
  7295. )
  7296. ])
  7297. ]);
  7298. }),
  7299. 128
  7300. /* KEYED_FRAGMENT */
  7301. ))
  7302. ]);
  7303. }),
  7304. 128
  7305. /* KEYED_FRAGMENT */
  7306. )),
  7307. vue.createElementVNode("view", { style: { "height": "40rpx" } })
  7308. ])
  7309. ]);
  7310. }
  7311. 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"]]);
  7312. const logic = {
  7313. data() {
  7314. return {
  7315. showServicePopup: false,
  7316. showLogoutPopup: false,
  7317. profile: null,
  7318. profileLoading: false
  7319. };
  7320. },
  7321. onShow() {
  7322. if (isLoggedIn()) {
  7323. this.loadProfile();
  7324. }
  7325. },
  7326. methods: {
  7327. async loadProfile() {
  7328. if (this.profileLoading)
  7329. return;
  7330. this.profileLoading = true;
  7331. try {
  7332. const res = await getMyProfile();
  7333. this.profile = res.data || null;
  7334. } catch (err) {
  7335. formatAppLog("error", "at pages/mine/logic.js:27", "获取个人信息失败:", err);
  7336. } finally {
  7337. this.profileLoading = false;
  7338. }
  7339. },
  7340. navToSettings() {
  7341. uni.navigateTo({
  7342. url: "/pages/mine/settings/index"
  7343. });
  7344. },
  7345. navToProfile() {
  7346. uni.navigateTo({
  7347. url: "/pages/mine/settings/profile/index"
  7348. });
  7349. },
  7350. navToLevel() {
  7351. uni.navigateTo({
  7352. url: "/pages/mine/level/index"
  7353. });
  7354. },
  7355. navToNotification() {
  7356. uni.navigateTo({
  7357. url: "/pages/mine/message/index"
  7358. });
  7359. },
  7360. navToWallet() {
  7361. uni.navigateTo({
  7362. url: "/pages/mine/wallet/index"
  7363. });
  7364. },
  7365. navToPoints() {
  7366. uni.navigateTo({
  7367. url: "/pages/mine/points/index"
  7368. });
  7369. },
  7370. navToOrderStats() {
  7371. uni.navigateTo({
  7372. url: "/pages/mine/order-stats"
  7373. });
  7374. },
  7375. navToRewards() {
  7376. uni.navigateTo({
  7377. url: "/pages/mine/rewards"
  7378. });
  7379. },
  7380. openServicePopup() {
  7381. this.showServicePopup = true;
  7382. },
  7383. closeServicePopup() {
  7384. this.showServicePopup = false;
  7385. },
  7386. previewQRCode() {
  7387. uni.previewImage({
  7388. urls: ["/static/logo.png"]
  7389. });
  7390. },
  7391. openOnlineService() {
  7392. uni.showToast({
  7393. title: "正在跳转企业微信客服...",
  7394. icon: "none"
  7395. });
  7396. },
  7397. callServicePhone() {
  7398. uni.makePhoneCall({
  7399. phoneNumber: "400-123-4567"
  7400. });
  7401. },
  7402. logout() {
  7403. this.showLogoutPopup = true;
  7404. },
  7405. cancelLogout() {
  7406. this.showLogoutPopup = false;
  7407. },
  7408. async confirmLogout() {
  7409. this.showLogoutPopup = false;
  7410. try {
  7411. await logout();
  7412. } catch (e) {
  7413. }
  7414. clearAuth();
  7415. uni.reLaunch({
  7416. url: "/pages/login/login"
  7417. });
  7418. }
  7419. }
  7420. };
  7421. const _imports_0$1 = "/static/icons/motorbike.svg";
  7422. const _imports_1$5 = "/static/icons/location.svg";
  7423. const _imports_0 = "/static/icons/chevron_right_dark.svg";
  7424. const _imports_3$1 = "/static/icons/calendar.svg";
  7425. const _imports_4 = "/static/icons/settings.svg";
  7426. const _imports_1$4 = "/static/icons/crown.svg";
  7427. const _imports_6 = "/static/icons/chevron_right_gold.svg";
  7428. const _imports_3 = "/static/icons/chevron_right.svg";
  7429. const _imports_8 = "/static/icons/bell_linear.svg";
  7430. const _imports_9 = "/static/icons/money_linear.svg";
  7431. const _imports_10 = "/static/icons/headset_linear.svg";
  7432. const _imports_11 = "/static/icons/close_gray.svg";
  7433. const _imports_13 = "/static/icons/headset_green.svg";
  7434. const _imports_15 = "/static/icons/phone_green.svg";
  7435. const _sfc_main$l = {
  7436. ...logic
  7437. };
  7438. function _sfc_render$k(_ctx, _cache, $props, $setup, $data, $options) {
  7439. var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
  7440. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7441. vue.createElementVNode("view", { class: "nav-bg" }, [
  7442. vue.createElementVNode("view", { class: "bg-circle-1" }),
  7443. vue.createElementVNode("view", { class: "bg-circle-2" })
  7444. ]),
  7445. vue.createElementVNode("view", { class: "header-section" }, [
  7446. vue.createElementVNode("view", { class: "title-bar" }, "个人中心"),
  7447. vue.createElementVNode("view", {
  7448. class: "user-card",
  7449. onClick: _cache[1] || (_cache[1] = (...args) => _ctx.navToProfile && _ctx.navToProfile(...args))
  7450. }, [
  7451. vue.createElementVNode("image", {
  7452. class: "avatar",
  7453. src: ((_a = _ctx.profile) == null ? void 0 : _a.avatarUrl) || "/static/touxiang.png",
  7454. mode: "aspectFill"
  7455. }, null, 8, ["src"]),
  7456. vue.createElementVNode("view", { class: "info-content" }, [
  7457. vue.createElementVNode("view", { class: "name-row" }, [
  7458. vue.createElementVNode(
  7459. "text",
  7460. { class: "name" },
  7461. vue.toDisplayString(((_b = _ctx.profile) == null ? void 0 : _b.name) || "未登录"),
  7462. 1
  7463. /* TEXT */
  7464. ),
  7465. vue.createElementVNode("view", { class: "tags" }, [
  7466. ((_c = _ctx.profile) == null ? void 0 : _c.status) === "0" ? (vue.openBlock(), vue.createElementBlock("view", {
  7467. key: 0,
  7468. class: "tag green"
  7469. }, "接单中")) : ((_d = _ctx.profile) == null ? void 0 : _d.status) === "1" ? (vue.openBlock(), vue.createElementBlock("view", {
  7470. key: 1,
  7471. class: "tag green"
  7472. }, "休息中")) : ((_e = _ctx.profile) == null ? void 0 : _e.status) === "2" ? (vue.openBlock(), vue.createElementBlock("view", {
  7473. key: 2,
  7474. class: "tag",
  7475. style: { "background": "#eee", "color": "#999" }
  7476. }, "已禁用")) : vue.createCommentVNode("v-if", true),
  7477. ((_f = _ctx.profile) == null ? void 0 : _f.workType) === "full_time" ? (vue.openBlock(), vue.createElementBlock("view", {
  7478. key: 3,
  7479. class: "tag blue"
  7480. }, "全职")) : vue.createCommentVNode("v-if", true),
  7481. vue.createElementVNode("image", {
  7482. class: "bike-icon",
  7483. src: _imports_0$1
  7484. })
  7485. ])
  7486. ]),
  7487. vue.createElementVNode("view", { class: "detail-row" }, [
  7488. vue.createElementVNode("image", {
  7489. class: "small-icon",
  7490. src: _imports_1$5
  7491. }),
  7492. vue.createElementVNode(
  7493. "text",
  7494. null,
  7495. vue.toDisplayString(((_g = _ctx.profile) == null ? void 0 : _g.stationName) || ((_h = _ctx.profile) == null ? void 0 : _h.cityName) || "暂无站点"),
  7496. 1
  7497. /* TEXT */
  7498. ),
  7499. vue.createElementVNode("image", {
  7500. class: "arrow-icon-small",
  7501. src: _imports_0
  7502. })
  7503. ]),
  7504. vue.createElementVNode("view", { class: "detail-row" }, [
  7505. vue.createElementVNode("image", {
  7506. class: "small-icon",
  7507. src: _imports_3$1
  7508. }),
  7509. vue.createElementVNode(
  7510. "text",
  7511. null,
  7512. "已注册" + vue.toDisplayString(((_i = _ctx.profile) == null ? void 0 : _i.registerDays) || 0) + "天",
  7513. 1
  7514. /* TEXT */
  7515. )
  7516. ])
  7517. ]),
  7518. vue.createElementVNode("image", {
  7519. class: "settings-icon",
  7520. src: _imports_4,
  7521. onClick: _cache[0] || (_cache[0] = vue.withModifiers((...args) => _ctx.navToSettings && _ctx.navToSettings(...args), ["stop"]))
  7522. })
  7523. ]),
  7524. vue.createElementVNode("view", { class: "vip-card" }, [
  7525. vue.createElementVNode("view", { class: "vip-left" }, [
  7526. vue.createElementVNode("image", {
  7527. class: "vip-icon",
  7528. src: _imports_1$4
  7529. }),
  7530. vue.createElementVNode("view", { class: "vip-text" }, [
  7531. vue.createElementVNode(
  7532. "text",
  7533. { class: "vip-title" },
  7534. vue.toDisplayString(((_j = _ctx.profile) == null ? void 0 : _j.levelName) || "普通履约者"),
  7535. 1
  7536. /* TEXT */
  7537. ),
  7538. vue.createElementVNode(
  7539. "text",
  7540. { class: "vip-desc" },
  7541. vue.toDisplayString(((_k = _ctx.profile) == null ? void 0 : _k.levelDesc) || "完成更多订单即可升级"),
  7542. 1
  7543. /* TEXT */
  7544. )
  7545. ])
  7546. ]),
  7547. vue.createElementVNode("view", {
  7548. class: "vip-btn",
  7549. onClick: _cache[2] || (_cache[2] = (...args) => _ctx.navToLevel && _ctx.navToLevel(...args))
  7550. }, [
  7551. vue.createElementVNode("text", null, "查看权益"),
  7552. vue.createElementVNode("image", {
  7553. class: "arrow-icon-small",
  7554. src: _imports_6
  7555. })
  7556. ])
  7557. ])
  7558. ]),
  7559. vue.createElementVNode("view", { class: "stats-panel" }, [
  7560. vue.createElementVNode("view", {
  7561. class: "stat-item",
  7562. onClick: _cache[3] || (_cache[3] = (...args) => _ctx.navToWallet && _ctx.navToWallet(...args))
  7563. }, [
  7564. vue.createElementVNode("view", { class: "stat-header" }, [
  7565. vue.createElementVNode("view", { class: "red-bar" }),
  7566. vue.createElementVNode("text", { class: "label" }, "我的钱包"),
  7567. vue.createElementVNode("image", {
  7568. class: "arrow-icon",
  7569. src: _imports_3
  7570. })
  7571. ]),
  7572. vue.createElementVNode("view", { class: "stat-value" }, [
  7573. vue.createElementVNode(
  7574. "text",
  7575. { class: "num" },
  7576. vue.toDisplayString(((_l = _ctx.profile) == null ? void 0 : _l.balance) || 0),
  7577. 1
  7578. /* TEXT */
  7579. ),
  7580. vue.createElementVNode("text", { class: "unit" }, "元")
  7581. ]),
  7582. vue.createElementVNode("text", { class: "sub-text" }, "账户余额")
  7583. ]),
  7584. vue.createElementVNode("view", { class: "divider" }),
  7585. vue.createElementVNode("view", {
  7586. class: "stat-item",
  7587. onClick: _cache[4] || (_cache[4] = (...args) => _ctx.navToOrderStats && _ctx.navToOrderStats(...args))
  7588. }, [
  7589. vue.createElementVNode("view", { class: "stat-header" }, [
  7590. vue.createElementVNode("view", { class: "green-bar" }),
  7591. vue.createElementVNode("text", { class: "label" }, "订单统计"),
  7592. vue.createElementVNode("image", {
  7593. class: "arrow-icon",
  7594. src: _imports_3
  7595. })
  7596. ]),
  7597. vue.createElementVNode("view", { class: "stat-value" }, [
  7598. vue.createElementVNode(
  7599. "text",
  7600. { class: "num" },
  7601. vue.toDisplayString(((_m = _ctx.profile) == null ? void 0 : _m.orderCount) || 0),
  7602. 1
  7603. /* TEXT */
  7604. ),
  7605. vue.createElementVNode("text", { class: "unit" }, "单")
  7606. ]),
  7607. vue.createElementVNode("text", { class: "sub-text" }, "累计服务单量")
  7608. ]),
  7609. vue.createElementVNode("view", { class: "divider" }),
  7610. vue.createElementVNode("view", {
  7611. class: "stat-item",
  7612. onClick: _cache[5] || (_cache[5] = (...args) => _ctx.navToPoints && _ctx.navToPoints(...args))
  7613. }, [
  7614. vue.createElementVNode("view", { class: "stat-header" }, [
  7615. vue.createElementVNode("view", { class: "orange-bar" }),
  7616. vue.createElementVNode("text", { class: "label" }, "我的积分"),
  7617. vue.createElementVNode("image", {
  7618. class: "arrow-icon",
  7619. src: _imports_3
  7620. })
  7621. ]),
  7622. vue.createElementVNode("view", { class: "stat-value" }, [
  7623. vue.createElementVNode(
  7624. "text",
  7625. { class: "num" },
  7626. vue.toDisplayString(((_n = _ctx.profile) == null ? void 0 : _n.points) || 0),
  7627. 1
  7628. /* TEXT */
  7629. ),
  7630. vue.createElementVNode("text", { class: "unit" }, "分")
  7631. ]),
  7632. vue.createElementVNode("text", { class: "sub-text" }, "可兑换权益")
  7633. ])
  7634. ]),
  7635. vue.createElementVNode("view", { class: "menu-list" }, [
  7636. vue.createElementVNode("view", {
  7637. class: "menu-item",
  7638. onClick: _cache[6] || (_cache[6] = (...args) => _ctx.navToNotification && _ctx.navToNotification(...args))
  7639. }, [
  7640. vue.createElementVNode("image", {
  7641. class: "menu-icon",
  7642. src: _imports_8
  7643. }),
  7644. vue.createElementVNode("text", { class: "menu-text" }, "消息中心"),
  7645. vue.createElementVNode("view", { class: "menu-right" }, [
  7646. vue.createElementVNode("view", { class: "red-dot" }),
  7647. vue.createElementVNode("image", {
  7648. class: "arrow-icon",
  7649. src: _imports_3
  7650. })
  7651. ])
  7652. ]),
  7653. vue.createElementVNode("view", {
  7654. class: "menu-item",
  7655. onClick: _cache[7] || (_cache[7] = (...args) => _ctx.navToRewards && _ctx.navToRewards(...args))
  7656. }, [
  7657. vue.createElementVNode("image", {
  7658. class: "menu-icon",
  7659. src: _imports_9
  7660. }),
  7661. vue.createElementVNode("text", { class: "menu-text" }, "我的奖惩"),
  7662. vue.createElementVNode("image", {
  7663. class: "arrow-icon",
  7664. src: _imports_3
  7665. })
  7666. ]),
  7667. vue.createElementVNode("view", {
  7668. class: "menu-item",
  7669. onClick: _cache[8] || (_cache[8] = (...args) => _ctx.openServicePopup && _ctx.openServicePopup(...args))
  7670. }, [
  7671. vue.createElementVNode("image", {
  7672. class: "menu-icon",
  7673. src: _imports_10
  7674. }),
  7675. vue.createElementVNode("text", { class: "menu-text" }, "联系客服"),
  7676. vue.createElementVNode("image", {
  7677. class: "arrow-icon",
  7678. src: _imports_3
  7679. })
  7680. ])
  7681. ]),
  7682. vue.createElementVNode("view", {
  7683. class: "logout-btn",
  7684. onClick: _cache[9] || (_cache[9] = (...args) => _ctx.logout && _ctx.logout(...args))
  7685. }, "退出登录"),
  7686. _ctx.showServicePopup ? (vue.openBlock(), vue.createElementBlock("view", {
  7687. key: 0,
  7688. class: "service-popup-mask",
  7689. onClick: _cache[15] || (_cache[15] = (...args) => _ctx.closeServicePopup && _ctx.closeServicePopup(...args))
  7690. }, [
  7691. vue.createElementVNode("view", {
  7692. class: "service-popup",
  7693. onClick: _cache[14] || (_cache[14] = vue.withModifiers(() => {
  7694. }, ["stop"]))
  7695. }, [
  7696. vue.createElementVNode("view", { class: "service-header" }, [
  7697. vue.createElementVNode("text", { class: "service-title" }, "联系客服"),
  7698. vue.createElementVNode("image", {
  7699. class: "close-icon",
  7700. src: _imports_11,
  7701. onClick: _cache[10] || (_cache[10] = (...args) => _ctx.closeServicePopup && _ctx.closeServicePopup(...args))
  7702. })
  7703. ]),
  7704. vue.createElementVNode("view", { class: "qr-section" }, [
  7705. vue.createElementVNode("text", { class: "qr-title" }, "客服二维码"),
  7706. vue.createElementVNode("image", {
  7707. class: "qr-img",
  7708. src: _imports_1$8,
  7709. onClick: _cache[11] || (_cache[11] = (...args) => _ctx.previewQRCode && _ctx.previewQRCode(...args))
  7710. }),
  7711. vue.createElementVNode("text", { class: "qr-desc" }, "点击查看大图")
  7712. ]),
  7713. vue.createElementVNode("view", { class: "service-list" }, [
  7714. vue.createElementVNode("view", {
  7715. class: "service-row",
  7716. onClick: _cache[12] || (_cache[12] = (...args) => _ctx.openOnlineService && _ctx.openOnlineService(...args))
  7717. }, [
  7718. vue.createElementVNode("image", {
  7719. class: "service-row-icon",
  7720. src: _imports_13
  7721. }),
  7722. vue.createElementVNode("view", { class: "service-info" }, [
  7723. vue.createElementVNode("text", { class: "service-name" }, "在线客服"),
  7724. vue.createElementVNode("text", { class: "service-desc" }, "企业微信专属客服在线解答")
  7725. ]),
  7726. vue.createElementVNode("image", {
  7727. class: "arrow-icon-small",
  7728. src: _imports_3
  7729. })
  7730. ]),
  7731. vue.createElementVNode("view", { class: "service-row" }, [
  7732. vue.createElementVNode("image", {
  7733. class: "service-row-icon",
  7734. src: _imports_14
  7735. }),
  7736. vue.createElementVNode("view", { class: "service-info" }, [
  7737. vue.createElementVNode("text", { class: "service-name" }, "客服电话"),
  7738. vue.createElementVNode("text", { class: "service-desc" }, "400-123-4567")
  7739. ]),
  7740. vue.createElementVNode("view", {
  7741. class: "call-btn",
  7742. onClick: _cache[13] || (_cache[13] = (...args) => _ctx.callServicePhone && _ctx.callServicePhone(...args))
  7743. }, [
  7744. vue.createElementVNode("image", {
  7745. class: "phone-icon-small",
  7746. src: _imports_15
  7747. }),
  7748. vue.createElementVNode("text", null, "拨打")
  7749. ])
  7750. ])
  7751. ])
  7752. ])
  7753. ])) : vue.createCommentVNode("v-if", true),
  7754. vue.createElementVNode(
  7755. "view",
  7756. {
  7757. class: vue.normalizeClass(["logout-popup-mask", { "show": _ctx.showLogoutPopup }]),
  7758. onClick: _cache[19] || (_cache[19] = (...args) => _ctx.cancelLogout && _ctx.cancelLogout(...args)),
  7759. onTouchmove: _cache[20] || (_cache[20] = vue.withModifiers(() => {
  7760. }, ["stop", "prevent"]))
  7761. },
  7762. [
  7763. vue.createElementVNode("view", {
  7764. class: "popup-modal",
  7765. onClick: _cache[18] || (_cache[18] = vue.withModifiers(() => {
  7766. }, ["stop"]))
  7767. }, [
  7768. vue.createElementVNode("text", { class: "popup-title" }, "退出登录"),
  7769. vue.createElementVNode("text", { class: "popup-desc" }, "确定要退出当前账号吗?\\n退出后需要重新登录才能使用完整功能。"),
  7770. vue.createElementVNode("view", { class: "popup-actions" }, [
  7771. vue.createElementVNode("view", {
  7772. class: "popup-btn cancel",
  7773. onClick: _cache[16] || (_cache[16] = (...args) => _ctx.cancelLogout && _ctx.cancelLogout(...args))
  7774. }, "取消"),
  7775. vue.createElementVNode("view", {
  7776. class: "popup-btn confirm",
  7777. onClick: _cache[17] || (_cache[17] = (...args) => _ctx.confirmLogout && _ctx.confirmLogout(...args))
  7778. }, "确定")
  7779. ])
  7780. ])
  7781. ],
  7782. 34
  7783. /* CLASS, NEED_HYDRATION */
  7784. )
  7785. ]);
  7786. }
  7787. const PagesMineIndex = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["render", _sfc_render$k], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/index.vue"]]);
  7788. const _sfc_main$k = {
  7789. data() {
  7790. return {};
  7791. },
  7792. methods: {
  7793. navBack() {
  7794. uni.navigateBack({
  7795. delta: 1
  7796. });
  7797. },
  7798. navTo(type) {
  7799. let url = "";
  7800. switch (type) {
  7801. case "profile":
  7802. url = "/pages/mine/settings/profile/index";
  7803. break;
  7804. case "auth":
  7805. url = "/pages/mine/settings/auth/index";
  7806. break;
  7807. case "bank":
  7808. url = "/pages/mine/settings/bank/index";
  7809. break;
  7810. case "security":
  7811. url = "/pages/mine/settings/security/index";
  7812. break;
  7813. case "push":
  7814. url = "/pages/mine/settings/notification/index";
  7815. break;
  7816. case "about":
  7817. url = "/pages/mine/settings/about/index";
  7818. break;
  7819. default:
  7820. formatAppLog("log", "at pages/mine/settings/index.vue:104", "Navigate to:", type);
  7821. return;
  7822. }
  7823. uni.navigateTo({ url });
  7824. },
  7825. clearCache() {
  7826. uni.showToast({ title: "缓存已清理", icon: "none" });
  7827. }
  7828. }
  7829. };
  7830. function _sfc_render$j(_ctx, _cache, $props, $setup, $data, $options) {
  7831. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  7832. vue.createElementVNode("view", { class: "custom-header" }, [
  7833. vue.createElementVNode("view", {
  7834. class: "header-left",
  7835. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  7836. }, [
  7837. vue.createElementVNode("image", {
  7838. class: "back-icon",
  7839. src: _imports_0,
  7840. style: { "transform": "rotate(180deg)" }
  7841. })
  7842. ]),
  7843. vue.createElementVNode("text", { class: "header-title" }, "设置"),
  7844. vue.createElementVNode("view", { class: "header-right" })
  7845. ]),
  7846. vue.createElementVNode("view", { class: "header-placeholder" }),
  7847. vue.createElementVNode("view", { class: "group-card" }, [
  7848. vue.createElementVNode("view", {
  7849. class: "list-item",
  7850. onClick: _cache[1] || (_cache[1] = ($event) => $options.navTo("profile"))
  7851. }, [
  7852. vue.createElementVNode("text", { class: "item-title" }, "个人资料"),
  7853. vue.createElementVNode("image", {
  7854. class: "arrow-icon",
  7855. src: _imports_3
  7856. })
  7857. ]),
  7858. vue.createElementVNode("view", {
  7859. class: "list-item",
  7860. onClick: _cache[2] || (_cache[2] = ($event) => $options.navTo("auth"))
  7861. }, [
  7862. vue.createElementVNode("text", { class: "item-title" }, "认证信息"),
  7863. vue.createElementVNode("image", {
  7864. class: "arrow-icon",
  7865. src: _imports_3
  7866. })
  7867. ]),
  7868. vue.createElementVNode("view", {
  7869. class: "list-item",
  7870. onClick: _cache[3] || (_cache[3] = ($event) => $options.navTo("bank"))
  7871. }, [
  7872. vue.createElementVNode("text", { class: "item-title" }, "银行卡信息"),
  7873. vue.createElementVNode("view", { class: "item-right" }, [
  7874. vue.createElementVNode("view", { class: "tag-status" }, "已完善"),
  7875. vue.createElementVNode("image", {
  7876. class: "arrow-icon",
  7877. src: _imports_3
  7878. })
  7879. ])
  7880. ]),
  7881. vue.createElementVNode("view", {
  7882. class: "list-item no-border",
  7883. onClick: _cache[4] || (_cache[4] = ($event) => $options.navTo("security"))
  7884. }, [
  7885. vue.createElementVNode("text", { class: "item-title" }, "账号与安全"),
  7886. vue.createElementVNode("image", {
  7887. class: "arrow-icon",
  7888. src: _imports_3
  7889. })
  7890. ])
  7891. ]),
  7892. vue.createElementVNode("view", { class: "group-card" }, [
  7893. vue.createElementVNode("view", {
  7894. class: "list-item",
  7895. onClick: _cache[5] || (_cache[5] = ($event) => $options.navTo("push"))
  7896. }, [
  7897. vue.createElementVNode("text", { class: "item-title" }, "推送通知"),
  7898. vue.createElementVNode("view", { class: "item-right" }, [
  7899. vue.createElementVNode("text", { class: "item-value" }, "部分开启"),
  7900. vue.createElementVNode("image", {
  7901. class: "arrow-icon",
  7902. src: _imports_3
  7903. })
  7904. ])
  7905. ]),
  7906. vue.createElementVNode("view", { class: "list-item" }, [
  7907. vue.createElementVNode("view", { class: "item-row-left" }, [
  7908. vue.createElementVNode("text", { class: "item-title" }, "位置上报"),
  7909. vue.createElementVNode("text", { class: "item-subtitle" }, "每隔20分钟自动上报位置")
  7910. ]),
  7911. vue.createElementVNode("switch", {
  7912. checked: "",
  7913. color: "#FF5722",
  7914. style: { "transform": "scale(0.8)" }
  7915. })
  7916. ]),
  7917. vue.createElementVNode("view", {
  7918. class: "list-item",
  7919. onClick: _cache[6] || (_cache[6] = (...args) => $options.clearCache && $options.clearCache(...args))
  7920. }, [
  7921. vue.createElementVNode("text", { class: "item-title" }, "清理缓存"),
  7922. vue.createElementVNode("view", { class: "item-right" }, [
  7923. vue.createElementVNode("text", { class: "item-value" }, "105.14MB"),
  7924. vue.createElementVNode("image", {
  7925. class: "arrow-icon",
  7926. src: _imports_3
  7927. })
  7928. ])
  7929. ]),
  7930. vue.createElementVNode("view", {
  7931. class: "list-item no-border",
  7932. onClick: _cache[7] || (_cache[7] = ($event) => $options.navTo("about"))
  7933. }, [
  7934. vue.createElementVNode("text", { class: "item-title" }, "关于我们"),
  7935. vue.createElementVNode("view", { class: "item-right" }, [
  7936. vue.createElementVNode("text", { class: "item-value" }, "v2.0.6"),
  7937. vue.createElementVNode("image", {
  7938. class: "arrow-icon",
  7939. src: _imports_3
  7940. })
  7941. ])
  7942. ])
  7943. ])
  7944. ]);
  7945. }
  7946. 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"]]);
  7947. const _sfc_main$j = {
  7948. data() {
  7949. return {
  7950. userInfo: {
  7951. name: "",
  7952. workType: "",
  7953. workStatus: "",
  7954. city: "",
  7955. avatar: "/static/touxiang.png",
  7956. stationName: ""
  7957. },
  7958. isStatusPickerShow: false,
  7959. isCityPickerShow: false,
  7960. // 城市级联选择器(与我要加入页面一致)
  7961. selectStep: 0,
  7962. selectedPathway: [],
  7963. currentCityList: [],
  7964. selectedCityId: null
  7965. };
  7966. },
  7967. onLoad() {
  7968. this.loadUserInfo();
  7969. uni.$on("updateName", (newName) => {
  7970. this.userInfo.name = newName;
  7971. });
  7972. },
  7973. onUnload() {
  7974. uni.$off("updateName");
  7975. },
  7976. methods: {
  7977. // 加载用户信息 @author steelwei
  7978. async loadUserInfo() {
  7979. uni.showLoading({ title: "加载中..." });
  7980. try {
  7981. const res = await getMyProfile();
  7982. if (res.code === 200) {
  7983. const data = res.data;
  7984. this.userInfo = {
  7985. name: data.realName || data.name,
  7986. workType: data.workType === "full_time" ? "全职" : "兼职",
  7987. workStatus: this.formatStatus(data.status),
  7988. city: data.cityName || "",
  7989. avatar: data.avatarUrl || "/static/touxiang.png",
  7990. stationName: data.stationName || "未分配站点"
  7991. };
  7992. } else {
  7993. uni.showToast({ title: res.msg || "加载失败", icon: "none" });
  7994. }
  7995. } catch (error) {
  7996. formatAppLog("error", "at pages/mine/settings/profile/index.vue:173", "加载用户信息失败:", error);
  7997. uni.showToast({ title: "网络错误", icon: "none" });
  7998. } finally {
  7999. uni.hideLoading();
  8000. }
  8001. },
  8002. // 格式化状态 @author steelwei
  8003. formatStatus(status) {
  8004. const statusMap = {
  8005. "busy": "接单中",
  8006. "resting": "休息中",
  8007. "disabled": "已禁用"
  8008. };
  8009. return statusMap[status] || status;
  8010. },
  8011. navBack() {
  8012. uni.navigateBack({ delta: 1 });
  8013. },
  8014. // 修改头像 @author steelwei
  8015. changeAvatar() {
  8016. uni.chooseImage({
  8017. count: 1,
  8018. success: async (res) => {
  8019. const tempFilePath = res.tempFilePaths[0];
  8020. uni.showLoading({ title: "上传中..." });
  8021. try {
  8022. const uploadRes = await uploadFile(tempFilePath);
  8023. if (uploadRes.code === 200) {
  8024. const avatarUrl = uploadRes.data.url;
  8025. const result = await updateAvatar(avatarUrl);
  8026. if (result.code === 200) {
  8027. this.userInfo.avatar = avatarUrl;
  8028. uni.showToast({ title: "修改成功", icon: "success" });
  8029. } else {
  8030. uni.showToast({ title: result.msg || "修改失败", icon: "none" });
  8031. }
  8032. }
  8033. } catch (error) {
  8034. formatAppLog("error", "at pages/mine/settings/profile/index.vue:218", "修改头像失败:", error);
  8035. uni.showToast({ title: "上传失败", icon: "none" });
  8036. } finally {
  8037. uni.hideLoading();
  8038. }
  8039. }
  8040. });
  8041. },
  8042. editName() {
  8043. uni.navigateTo({
  8044. url: `/pages/mine/settings/profile/edit-name?name=${this.userInfo.name}`
  8045. });
  8046. },
  8047. showStatusPicker() {
  8048. this.isStatusPickerShow = true;
  8049. },
  8050. closeStatusPicker() {
  8051. this.isStatusPickerShow = false;
  8052. },
  8053. // 选择状态 @author steelwei
  8054. async selectStatus(statusText) {
  8055. const statusMap = {
  8056. "接单中": "busy",
  8057. "休息中": "resting"
  8058. };
  8059. const status = statusMap[statusText];
  8060. try {
  8061. const res = await updateStatus(status);
  8062. if (res.code === 200) {
  8063. this.userInfo.workStatus = statusText;
  8064. uni.showToast({ title: "状态已更新", icon: "success" });
  8065. } else {
  8066. uni.showToast({ title: res.msg || "修改失败", icon: "none" });
  8067. }
  8068. } catch (error) {
  8069. formatAppLog("error", "at pages/mine/settings/profile/index.vue:258", "修改状态失败:", error);
  8070. uni.showToast({ title: "网络错误", icon: "none" });
  8071. } finally {
  8072. this.closeStatusPicker();
  8073. }
  8074. },
  8075. // 城市级联选择器(与我要加入页面一致) @author steelwei
  8076. async showCityPicker() {
  8077. this.isCityPickerShow = true;
  8078. if (this.selectedPathway.length === 0) {
  8079. await this.resetCityPicker();
  8080. }
  8081. },
  8082. async resetCityPicker() {
  8083. this.selectStep = 0;
  8084. this.selectedPathway = [];
  8085. await this.loadAreaChildren(0);
  8086. },
  8087. closeCityPicker() {
  8088. this.isCityPickerShow = false;
  8089. },
  8090. async loadAreaChildren(parentId) {
  8091. try {
  8092. const res = await getAreaChildren(parentId);
  8093. this.currentCityList = (res.data || []).filter((item) => item.type !== 2).map((item) => ({
  8094. id: item.id,
  8095. name: item.name,
  8096. type: item.type,
  8097. parentId: item.parentId
  8098. }));
  8099. } catch (err) {
  8100. formatAppLog("error", "at pages/mine/settings/profile/index.vue:293", "加载区域数据失败:", err);
  8101. this.currentCityList = [];
  8102. }
  8103. },
  8104. async selectCityItem(item) {
  8105. this.selectedPathway[this.selectStep] = item;
  8106. if (item.type === 0) {
  8107. this.selectStep++;
  8108. this.selectedPathway = this.selectedPathway.slice(0, this.selectStep);
  8109. await this.loadAreaChildren(item.id);
  8110. if (this.currentCityList.length === 0) {
  8111. this.selectedCityId = item.id;
  8112. this.confirmCity();
  8113. }
  8114. } else {
  8115. this.selectedCityId = item.id;
  8116. this.confirmCity();
  8117. }
  8118. },
  8119. async jumpToStep(step) {
  8120. this.selectStep = step;
  8121. if (step === 0) {
  8122. await this.loadAreaChildren(0);
  8123. } else {
  8124. const parent = this.selectedPathway[step - 1];
  8125. if (parent) {
  8126. await this.loadAreaChildren(parent.id);
  8127. }
  8128. }
  8129. },
  8130. // 确认城市选择 @author steelwei
  8131. async confirmCity() {
  8132. if (this.selectedPathway.length === 0) {
  8133. uni.showToast({ title: "请选择城市", icon: "none" });
  8134. return;
  8135. }
  8136. const cityName = this.selectedPathway.map((i) => i.name).join(" ");
  8137. const cityCode = String(this.selectedCityId);
  8138. try {
  8139. const res = await updateCity(cityCode, cityName);
  8140. if (res.code === 200) {
  8141. this.userInfo.city = cityName;
  8142. uni.showToast({ title: "修改成功", icon: "success" });
  8143. this.closeCityPicker();
  8144. this.selectedPathway = [];
  8145. } else {
  8146. uni.showToast({ title: res.msg || "修改失败", icon: "none" });
  8147. }
  8148. } catch (error) {
  8149. formatAppLog("error", "at pages/mine/settings/profile/index.vue:346", "修改城市失败:", error);
  8150. uni.showToast({ title: "网络错误", icon: "none" });
  8151. }
  8152. }
  8153. }
  8154. };
  8155. function _sfc_render$i(_ctx, _cache, $props, $setup, $data, $options) {
  8156. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  8157. vue.createElementVNode("view", { class: "custom-header" }, [
  8158. vue.createElementVNode("view", {
  8159. class: "header-left",
  8160. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8161. }, [
  8162. vue.createElementVNode("image", {
  8163. class: "back-icon",
  8164. src: _imports_0,
  8165. style: { "transform": "rotate(180deg)" }
  8166. })
  8167. ]),
  8168. vue.createElementVNode("text", { class: "header-title" }, "个人资料"),
  8169. vue.createElementVNode("view", { class: "header-right" })
  8170. ]),
  8171. vue.createElementVNode("view", { class: "header-placeholder" }),
  8172. vue.createElementVNode("view", { class: "group-card" }, [
  8173. vue.createElementVNode("view", {
  8174. class: "list-item",
  8175. onClick: _cache[1] || (_cache[1] = (...args) => $options.changeAvatar && $options.changeAvatar(...args))
  8176. }, [
  8177. vue.createElementVNode("text", { class: "item-title" }, "头像"),
  8178. vue.createElementVNode("view", { class: "item-right" }, [
  8179. vue.createElementVNode("image", {
  8180. class: "user-avatar",
  8181. src: $data.userInfo.avatar,
  8182. mode: "aspectFill"
  8183. }, null, 8, ["src"]),
  8184. vue.createElementVNode("image", {
  8185. class: "arrow-icon",
  8186. src: _imports_3
  8187. })
  8188. ])
  8189. ]),
  8190. vue.createElementVNode("view", {
  8191. class: "list-item",
  8192. onClick: _cache[2] || (_cache[2] = (...args) => $options.editName && $options.editName(...args))
  8193. }, [
  8194. vue.createElementVNode("text", { class: "item-title" }, "真实姓名"),
  8195. vue.createElementVNode("view", { class: "item-right" }, [
  8196. vue.createElementVNode(
  8197. "text",
  8198. { class: "item-value" },
  8199. vue.toDisplayString($data.userInfo.name),
  8200. 1
  8201. /* TEXT */
  8202. ),
  8203. vue.createElementVNode("image", {
  8204. class: "arrow-icon",
  8205. src: _imports_3
  8206. })
  8207. ])
  8208. ])
  8209. ]),
  8210. vue.createElementVNode("view", { class: "group-card" }, [
  8211. vue.createElementVNode("view", { class: "list-item" }, [
  8212. vue.createElementVNode("text", { class: "item-title" }, "工作类型"),
  8213. vue.createElementVNode(
  8214. "view",
  8215. { class: "tag-blue-outline" },
  8216. vue.toDisplayString($data.userInfo.workType),
  8217. 1
  8218. /* TEXT */
  8219. )
  8220. ]),
  8221. vue.createElementVNode("view", {
  8222. class: "list-item",
  8223. onClick: _cache[3] || (_cache[3] = (...args) => $options.showStatusPicker && $options.showStatusPicker(...args))
  8224. }, [
  8225. vue.createElementVNode("text", { class: "item-title" }, "工作状态"),
  8226. vue.createElementVNode("view", { class: "item-right" }, [
  8227. vue.createElementVNode(
  8228. "text",
  8229. { class: "item-value-black" },
  8230. vue.toDisplayString($data.userInfo.workStatus),
  8231. 1
  8232. /* TEXT */
  8233. ),
  8234. vue.createElementVNode("image", {
  8235. class: "arrow-icon",
  8236. src: _imports_3
  8237. })
  8238. ])
  8239. ])
  8240. ]),
  8241. vue.createElementVNode("view", { class: "group-card" }, [
  8242. vue.createElementVNode("view", {
  8243. class: "list-item",
  8244. onClick: _cache[4] || (_cache[4] = (...args) => $options.showCityPicker && $options.showCityPicker(...args))
  8245. }, [
  8246. vue.createElementVNode("text", { class: "item-title" }, "工作城市"),
  8247. vue.createElementVNode("view", { class: "item-right" }, [
  8248. vue.createElementVNode(
  8249. "text",
  8250. { class: "item-value" },
  8251. vue.toDisplayString($data.userInfo.city),
  8252. 1
  8253. /* TEXT */
  8254. ),
  8255. vue.createElementVNode("image", {
  8256. class: "arrow-icon",
  8257. src: _imports_3
  8258. })
  8259. ])
  8260. ]),
  8261. vue.createElementVNode("view", { class: "list-item no-border" }, [
  8262. vue.createElementVNode("text", { class: "item-title" }, "所属站点"),
  8263. vue.createElementVNode("view", { class: "item-right" }, [
  8264. vue.createElementVNode(
  8265. "text",
  8266. { class: "item-value" },
  8267. vue.toDisplayString($data.userInfo.stationName || "未分配站点"),
  8268. 1
  8269. /* TEXT */
  8270. )
  8271. ])
  8272. ])
  8273. ]),
  8274. $data.isStatusPickerShow ? (vue.openBlock(), vue.createElementBlock("view", {
  8275. key: 0,
  8276. class: "popup-mask",
  8277. onClick: _cache[9] || (_cache[9] = (...args) => $options.closeStatusPicker && $options.closeStatusPicker(...args))
  8278. }, [
  8279. vue.createElementVNode("view", {
  8280. class: "popup-content",
  8281. onClick: _cache[8] || (_cache[8] = vue.withModifiers(() => {
  8282. }, ["stop"]))
  8283. }, [
  8284. vue.createElementVNode("view", { class: "popup-title" }, "选择工作状态"),
  8285. vue.createElementVNode("view", {
  8286. class: "popup-item",
  8287. onClick: _cache[5] || (_cache[5] = ($event) => $options.selectStatus("接单中"))
  8288. }, "接单中"),
  8289. vue.createElementVNode("view", {
  8290. class: "popup-item",
  8291. onClick: _cache[6] || (_cache[6] = ($event) => $options.selectStatus("休息中"))
  8292. }, "休息中"),
  8293. vue.createElementVNode("view", {
  8294. class: "popup-cancel",
  8295. onClick: _cache[7] || (_cache[7] = (...args) => $options.closeStatusPicker && $options.closeStatusPicker(...args))
  8296. }, "取消")
  8297. ])
  8298. ])) : vue.createCommentVNode("v-if", true),
  8299. $data.isCityPickerShow ? (vue.openBlock(), vue.createElementBlock("view", {
  8300. key: 1,
  8301. class: "popup-mask",
  8302. onClick: _cache[13] || (_cache[13] = (...args) => $options.closeCityPicker && $options.closeCityPicker(...args))
  8303. }, [
  8304. vue.createElementVNode("view", {
  8305. class: "popup-content",
  8306. onClick: _cache[12] || (_cache[12] = vue.withModifiers(() => {
  8307. }, ["stop"]))
  8308. }, [
  8309. vue.createElementVNode("view", { class: "popup-header-row" }, [
  8310. vue.createElementVNode("text", {
  8311. class: "popup-btn-cancel",
  8312. onClick: _cache[10] || (_cache[10] = (...args) => $options.closeCityPicker && $options.closeCityPicker(...args))
  8313. }, "取消"),
  8314. vue.createElementVNode("text", { class: "popup-title-text" }, "请选择工作城市"),
  8315. vue.createElementVNode("text", {
  8316. class: "popup-btn-confirm",
  8317. onClick: _cache[11] || (_cache[11] = (...args) => $options.confirmCity && $options.confirmCity(...args))
  8318. }, "确定")
  8319. ]),
  8320. vue.createElementVNode("view", { class: "picker-body" }, [
  8321. vue.createElementVNode("view", { class: "timeline-area" }, [
  8322. (vue.openBlock(true), vue.createElementBlock(
  8323. vue.Fragment,
  8324. null,
  8325. vue.renderList($data.selectedPathway, (item, index) => {
  8326. return vue.openBlock(), vue.createElementBlock("view", {
  8327. class: "timeline-item",
  8328. key: index,
  8329. onClick: ($event) => $options.jumpToStep(index)
  8330. }, [
  8331. vue.createElementVNode("view", { class: "timeline-dot" }),
  8332. vue.createElementVNode(
  8333. "text",
  8334. null,
  8335. vue.toDisplayString(item.name),
  8336. 1
  8337. /* TEXT */
  8338. )
  8339. ], 8, ["onClick"]);
  8340. }),
  8341. 128
  8342. /* KEYED_FRAGMENT */
  8343. )),
  8344. $data.selectStep === $data.selectedPathway.length ? (vue.openBlock(), vue.createElementBlock("view", {
  8345. key: 0,
  8346. class: "timeline-item active"
  8347. }, [
  8348. vue.createElementVNode("view", { class: "timeline-dot" }),
  8349. vue.createElementVNode("text", null, "请选择")
  8350. ])) : vue.createCommentVNode("v-if", true)
  8351. ]),
  8352. vue.createElementVNode("scroll-view", {
  8353. "scroll-y": "",
  8354. class: "list-area"
  8355. }, [
  8356. (vue.openBlock(true), vue.createElementBlock(
  8357. vue.Fragment,
  8358. null,
  8359. vue.renderList($data.currentCityList, (item) => {
  8360. return vue.openBlock(), vue.createElementBlock("view", {
  8361. class: "list-item",
  8362. key: item.id,
  8363. onClick: ($event) => $options.selectCityItem(item)
  8364. }, vue.toDisplayString(item.name), 9, ["onClick"]);
  8365. }),
  8366. 128
  8367. /* KEYED_FRAGMENT */
  8368. )),
  8369. $data.currentCityList.length === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  8370. key: 0,
  8371. style: { "padding": "20rpx", "color": "#999" }
  8372. }, " 无数据 ")) : vue.createCommentVNode("v-if", true)
  8373. ])
  8374. ])
  8375. ])
  8376. ])) : vue.createCommentVNode("v-if", true)
  8377. ]);
  8378. }
  8379. 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"]]);
  8380. const _sfc_main$i = {
  8381. data() {
  8382. return {
  8383. authInfo: {
  8384. realName: "",
  8385. idCard: "",
  8386. idCardFront: "",
  8387. idCardBack: "",
  8388. serviceTypes: [],
  8389. authId: false,
  8390. authQual: false,
  8391. pendingAudit: false,
  8392. qualImages: []
  8393. }
  8394. };
  8395. },
  8396. onLoad() {
  8397. this.loadAuthInfo();
  8398. },
  8399. methods: {
  8400. navBack() {
  8401. uni.navigateBack({
  8402. delta: 1
  8403. });
  8404. },
  8405. async loadAuthInfo() {
  8406. try {
  8407. const res = await getAuthInfo();
  8408. if (res.code === 200 && res.data) {
  8409. this.authInfo = {
  8410. realName: res.data.realName || "",
  8411. idCard: res.data.idCard || "",
  8412. idCardFront: res.data.idCardFrontUrl || "",
  8413. idCardBack: res.data.idCardBackUrl || "",
  8414. serviceTypes: res.data.serviceTypeList || [],
  8415. authId: res.data.authId || false,
  8416. authQual: res.data.authQual || false,
  8417. pendingAudit: res.data.pendingAudit || false,
  8418. qualImages: res.data.qualImageUrls || []
  8419. };
  8420. }
  8421. } catch (e) {
  8422. formatAppLog("error", "at pages/mine/settings/auth/index.vue:133", "加载认证信息失败", e);
  8423. uni.showToast({ title: "加载失败", icon: "none" });
  8424. }
  8425. },
  8426. maskIdCard(idCard) {
  8427. if (!idCard || idCard.length < 8)
  8428. return idCard;
  8429. return idCard.substring(0, 4) + "**********" + idCard.substring(idCard.length - 4);
  8430. },
  8431. editAuth() {
  8432. uni.showModal({
  8433. title: "提示",
  8434. content: "修改认证信息需要重新审核,审核期间无法接单,确定要继续吗?",
  8435. success: (res) => {
  8436. if (res.confirm) {
  8437. uni.navigateTo({
  8438. url: "/pages/mine/settings/auth/edit"
  8439. });
  8440. }
  8441. }
  8442. });
  8443. }
  8444. }
  8445. };
  8446. function _sfc_render$h(_ctx, _cache, $props, $setup, $data, $options) {
  8447. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  8448. vue.createElementVNode("view", { class: "custom-header" }, [
  8449. vue.createElementVNode("view", {
  8450. class: "header-left",
  8451. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8452. }, [
  8453. vue.createElementVNode("image", {
  8454. class: "back-icon",
  8455. src: _imports_0,
  8456. style: { "transform": "rotate(180deg)" }
  8457. })
  8458. ]),
  8459. vue.createElementVNode("text", { class: "header-title" }, "认证信息"),
  8460. vue.createElementVNode("view", { class: "header-right" })
  8461. ]),
  8462. vue.createElementVNode("view", { class: "header-placeholder" }),
  8463. vue.createElementVNode("view", { class: "card" }, [
  8464. vue.createElementVNode("view", { class: "section-header" }, [
  8465. vue.createElementVNode("view", { class: "orange-bar" }),
  8466. vue.createElementVNode("text", { class: "section-title" }, "身份认证"),
  8467. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("view", {
  8468. key: 0,
  8469. class: "tag-orange"
  8470. }, "认证中")) : $data.authInfo.authId ? (vue.openBlock(), vue.createElementBlock("view", {
  8471. key: 1,
  8472. class: "tag-green"
  8473. }, "已认证")) : (vue.openBlock(), vue.createElementBlock("view", {
  8474. key: 2,
  8475. class: "tag-gray"
  8476. }, "未认证"))
  8477. ]),
  8478. vue.createElementVNode("view", { class: "info-row" }, [
  8479. vue.createElementVNode("text", { class: "label" }, "真实姓名"),
  8480. vue.createElementVNode(
  8481. "text",
  8482. { class: "value" },
  8483. vue.toDisplayString($data.authInfo.realName || "未设置"),
  8484. 1
  8485. /* TEXT */
  8486. )
  8487. ]),
  8488. vue.createElementVNode("view", { class: "info-row" }, [
  8489. vue.createElementVNode("text", { class: "label" }, "证件号码"),
  8490. vue.createElementVNode(
  8491. "text",
  8492. { class: "value" },
  8493. vue.toDisplayString($options.maskIdCard($data.authInfo.idCard) || "未设置"),
  8494. 1
  8495. /* TEXT */
  8496. )
  8497. ]),
  8498. vue.createElementVNode("view", { class: "id-card-row" }, [
  8499. $data.authInfo.idCardFront ? (vue.openBlock(), vue.createElementBlock("view", {
  8500. key: 0,
  8501. class: "id-card-box green-bg"
  8502. }, [
  8503. vue.createElementVNode("image", {
  8504. class: "id-card-img",
  8505. src: $data.authInfo.idCardFront,
  8506. mode: "aspectFill"
  8507. }, null, 8, ["src"]),
  8508. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8509. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  8510. key: 1,
  8511. class: "id-card-box green-bg"
  8512. }, [
  8513. vue.createElementVNode("text", { class: "id-text" }, "ID Front"),
  8514. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8515. ])),
  8516. $data.authInfo.idCardBack ? (vue.openBlock(), vue.createElementBlock("view", {
  8517. key: 2,
  8518. class: "id-card-box green-bg"
  8519. }, [
  8520. vue.createElementVNode("image", {
  8521. class: "id-card-img",
  8522. src: $data.authInfo.idCardBack,
  8523. mode: "aspectFill"
  8524. }, null, 8, ["src"]),
  8525. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8526. ])) : (vue.openBlock(), vue.createElementBlock("view", {
  8527. key: 3,
  8528. class: "id-card-box green-bg"
  8529. }, [
  8530. vue.createElementVNode("text", { class: "id-text" }, "ID Back"),
  8531. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8532. ]))
  8533. ])
  8534. ]),
  8535. vue.createElementVNode("view", { class: "card" }, [
  8536. vue.createElementVNode("view", { class: "section-header" }, [
  8537. vue.createElementVNode("view", { class: "orange-bar" }),
  8538. vue.createElementVNode("text", { class: "section-title" }, "服务类型")
  8539. ]),
  8540. vue.createElementVNode("view", { class: "tags-row" }, [
  8541. (vue.openBlock(true), vue.createElementBlock(
  8542. vue.Fragment,
  8543. null,
  8544. vue.renderList($data.authInfo.serviceTypes, (type, index) => {
  8545. return vue.openBlock(), vue.createElementBlock(
  8546. "view",
  8547. {
  8548. class: "service-tag",
  8549. key: index
  8550. },
  8551. vue.toDisplayString(type),
  8552. 1
  8553. /* TEXT */
  8554. );
  8555. }),
  8556. 128
  8557. /* KEYED_FRAGMENT */
  8558. )),
  8559. $data.authInfo.serviceTypes.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8560. key: 0,
  8561. class: "empty-text"
  8562. }, "暂无服务类型")) : vue.createCommentVNode("v-if", true)
  8563. ])
  8564. ]),
  8565. vue.createElementVNode("view", { class: "card" }, [
  8566. vue.createElementVNode("view", { class: "section-header" }, [
  8567. vue.createElementVNode("view", { class: "orange-bar" }),
  8568. vue.createElementVNode("text", { class: "section-title" }, "资质证书")
  8569. ]),
  8570. vue.createElementVNode(
  8571. "text",
  8572. { class: "sub-title" },
  8573. vue.toDisplayString($data.authInfo.authQual ? "已认证" : "未认证"),
  8574. 1
  8575. /* TEXT */
  8576. ),
  8577. vue.createElementVNode("view", { class: "cert-row" }, [
  8578. (vue.openBlock(true), vue.createElementBlock(
  8579. vue.Fragment,
  8580. null,
  8581. vue.renderList($data.authInfo.qualImages, (img, index) => {
  8582. return vue.openBlock(), vue.createElementBlock("view", {
  8583. class: "cert-box yellow-bg",
  8584. key: index
  8585. }, [
  8586. vue.createElementVNode("image", {
  8587. class: "cert-img",
  8588. src: img,
  8589. mode: "aspectFill"
  8590. }, null, 8, ["src"])
  8591. ]);
  8592. }),
  8593. 128
  8594. /* KEYED_FRAGMENT */
  8595. )),
  8596. $data.authInfo.qualImages.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8597. key: 0,
  8598. class: "empty-text"
  8599. }, "暂无资质证书")) : vue.createCommentVNode("v-if", true)
  8600. ])
  8601. ]),
  8602. vue.createElementVNode("view", { class: "bottom-btn-area" }, [
  8603. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("button", {
  8604. key: 0,
  8605. class: "action-btn disabled",
  8606. disabled: ""
  8607. }, "认证审核中...")) : (vue.openBlock(), vue.createElementBlock("button", {
  8608. key: 1,
  8609. class: "action-btn",
  8610. onClick: _cache[1] || (_cache[1] = (...args) => $options.editAuth && $options.editAuth(...args))
  8611. }, "修改认证信息")),
  8612. $data.authInfo.pendingAudit ? (vue.openBlock(), vue.createElementBlock("text", {
  8613. key: 2,
  8614. class: "tips"
  8615. }, "认证信息正在审核中,请耐心等待")) : (vue.openBlock(), vue.createElementBlock("text", {
  8616. key: 3,
  8617. class: "tips"
  8618. }, "修改认证信息需要重新审核,审核期间无法接单"))
  8619. ])
  8620. ]);
  8621. }
  8622. 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"]]);
  8623. const _sfc_main$h = {
  8624. data() {
  8625. return {
  8626. idCardFront: "",
  8627. idCardBack: "",
  8628. idCardFrontOssId: "",
  8629. idCardBackOssId: "",
  8630. serviceOptions: ["宠物接送", "上门喂遛", "上门洗护"],
  8631. selectedServices: [],
  8632. qualifications: {},
  8633. qualOssIds: {}
  8634. };
  8635. },
  8636. onLoad() {
  8637. this.loadAuthInfo();
  8638. },
  8639. methods: {
  8640. async loadAuthInfo() {
  8641. try {
  8642. uni.showLoading({ title: "加载中..." });
  8643. const res = await getAuthInfo();
  8644. if (res.code === 200 && res.data) {
  8645. this.idCardFront = res.data.idCardFrontUrl || "";
  8646. this.idCardBack = res.data.idCardBackUrl || "";
  8647. this.idCardFrontOssId = res.data.idCardFront || "";
  8648. this.idCardBackOssId = res.data.idCardBack || "";
  8649. this.selectedServices = res.data.serviceTypeList || [];
  8650. this.selectedServices.forEach((service) => {
  8651. this.qualifications[service] = [];
  8652. this.qualOssIds[service] = [];
  8653. });
  8654. if (res.data.qualImageUrls && res.data.qualImageUrls.length > 0) {
  8655. const firstService = this.selectedServices[0];
  8656. if (firstService) {
  8657. this.qualifications[firstService] = res.data.qualImageUrls;
  8658. }
  8659. }
  8660. }
  8661. uni.hideLoading();
  8662. } catch (e) {
  8663. uni.hideLoading();
  8664. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:151", "加载认证信息失败", e);
  8665. uni.showToast({ title: "加载失败", icon: "none" });
  8666. }
  8667. },
  8668. navBack() {
  8669. uni.navigateBack({ delta: 1 });
  8670. },
  8671. chooseImage(side) {
  8672. uni.chooseImage({
  8673. count: 1,
  8674. sizeType: ["compressed"],
  8675. sourceType: ["album", "camera"],
  8676. success: async (res) => {
  8677. const tempPath = res.tempFilePaths[0];
  8678. if (side === "front") {
  8679. this.idCardFront = tempPath;
  8680. } else {
  8681. this.idCardBack = tempPath;
  8682. }
  8683. try {
  8684. uni.showLoading({ title: "上传中..." });
  8685. const uploadRes = await uploadFile(tempPath);
  8686. if (side === "front") {
  8687. this.idCardFrontOssId = uploadRes.data.ossId;
  8688. } else {
  8689. this.idCardBackOssId = uploadRes.data.ossId;
  8690. }
  8691. uni.hideLoading();
  8692. uni.showToast({ title: "上传成功", icon: "success" });
  8693. } catch (err) {
  8694. uni.hideLoading();
  8695. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:183", "上传身份证图片失败:", err);
  8696. uni.showToast({ title: "上传失败", icon: "none" });
  8697. }
  8698. }
  8699. });
  8700. },
  8701. deleteImage(side) {
  8702. if (side === "front") {
  8703. this.idCardFront = "";
  8704. this.idCardFrontOssId = "";
  8705. } else {
  8706. this.idCardBack = "";
  8707. this.idCardBackOssId = "";
  8708. }
  8709. },
  8710. toggleService(service) {
  8711. const index = this.selectedServices.indexOf(service);
  8712. if (index > -1) {
  8713. this.selectedServices.splice(index, 1);
  8714. delete this.qualifications[service];
  8715. delete this.qualOssIds[service];
  8716. } else {
  8717. this.selectedServices.push(service);
  8718. this.qualifications[service] = [];
  8719. this.qualOssIds[service] = [];
  8720. }
  8721. this.$forceUpdate();
  8722. },
  8723. chooseQualImage(service) {
  8724. uni.chooseImage({
  8725. count: 9,
  8726. sizeType: ["compressed"],
  8727. sourceType: ["album", "camera"],
  8728. success: async (res) => {
  8729. if (!this.qualifications[service]) {
  8730. this.qualifications[service] = [];
  8731. this.qualOssIds[service] = [];
  8732. }
  8733. for (const tempPath of res.tempFilePaths) {
  8734. this.qualifications[service].push(tempPath);
  8735. this.$forceUpdate();
  8736. try {
  8737. uni.showLoading({ title: "上传中..." });
  8738. const uploadRes = await uploadFile(tempPath);
  8739. this.qualOssIds[service].push(uploadRes.data.ossId);
  8740. uni.hideLoading();
  8741. } catch (err) {
  8742. uni.hideLoading();
  8743. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:233", "上传资质图片失败:", err);
  8744. }
  8745. }
  8746. }
  8747. });
  8748. },
  8749. deleteQualImage(service, index) {
  8750. this.qualifications[service].splice(index, 1);
  8751. if (this.qualOssIds[service]) {
  8752. this.qualOssIds[service].splice(index, 1);
  8753. }
  8754. this.$forceUpdate();
  8755. },
  8756. previewImage(service, index) {
  8757. uni.previewImage({
  8758. urls: this.qualifications[service],
  8759. current: index
  8760. });
  8761. },
  8762. async submitAuth() {
  8763. if (!this.idCardFront || !this.idCardBack) {
  8764. uni.showToast({ title: "请上传身份证正反面", icon: "none" });
  8765. return;
  8766. }
  8767. if (this.selectedServices.length === 0) {
  8768. uni.showToast({ title: "请选择服务类型", icon: "none" });
  8769. return;
  8770. }
  8771. for (const service of this.selectedServices) {
  8772. if (!this.qualifications[service] || this.qualifications[service].length === 0) {
  8773. uni.showToast({ title: `请上传${service}资质`, icon: "none" });
  8774. return;
  8775. }
  8776. }
  8777. uni.showModal({
  8778. title: "提示",
  8779. content: "修改认证信息需要重新审核,审核期间无法接单,确定要继续吗?",
  8780. success: (res) => {
  8781. if (res.confirm) {
  8782. this.doSubmit();
  8783. }
  8784. }
  8785. });
  8786. },
  8787. async doSubmit() {
  8788. const allQualOssIds = [];
  8789. Object.values(this.qualOssIds).forEach((ids) => {
  8790. allQualOssIds.push(...ids);
  8791. });
  8792. const submitData = {
  8793. idCardFront: this.idCardFrontOssId,
  8794. idCardBack: this.idCardBackOssId,
  8795. serviceTypes: JSON.stringify(this.selectedServices),
  8796. qualifications: JSON.stringify(allQualOssIds)
  8797. };
  8798. try {
  8799. uni.showLoading({ title: "提交中..." });
  8800. await updateAuthInfo(submitData);
  8801. uni.hideLoading();
  8802. uni.showToast({ title: "提交成功,等待审核", icon: "success", duration: 1500 });
  8803. setTimeout(() => {
  8804. uni.navigateBack({ delta: 1 });
  8805. }, 1500);
  8806. } catch (err) {
  8807. uni.hideLoading();
  8808. formatAppLog("error", "at pages/mine/settings/auth/edit.vue:303", "提交失败:", err);
  8809. uni.showToast({ title: "提交失败", icon: "none" });
  8810. }
  8811. }
  8812. }
  8813. };
  8814. function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
  8815. return vue.openBlock(), vue.createElementBlock("view", { class: "edit-auth-container" }, [
  8816. vue.createElementVNode("view", { class: "custom-header" }, [
  8817. vue.createElementVNode("view", {
  8818. class: "header-left",
  8819. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  8820. }, [
  8821. vue.createElementVNode("image", {
  8822. class: "back-icon",
  8823. src: _imports_0,
  8824. style: { "transform": "rotate(180deg)" }
  8825. })
  8826. ]),
  8827. vue.createElementVNode("text", { class: "header-title" }, "修改认证信息"),
  8828. vue.createElementVNode("view", { class: "header-right" })
  8829. ]),
  8830. vue.createElementVNode("view", { class: "header-placeholder" }),
  8831. vue.createElementVNode("view", { class: "warning-tip" }, [
  8832. vue.createElementVNode("text", { class: "warning-icon" }, "⚠"),
  8833. vue.createElementVNode("text", { class: "warning-text" }, "若修改认证信息,将在审核通过后生效")
  8834. ]),
  8835. vue.createElementVNode("view", { class: "section-card" }, [
  8836. vue.createElementVNode("view", { class: "section-title" }, "身份认证"),
  8837. vue.createElementVNode("text", { class: "section-subtitle" }, "点击图片修改"),
  8838. vue.createElementVNode("view", { class: "id-card-row" }, [
  8839. vue.createElementVNode("view", {
  8840. class: "id-card-upload",
  8841. onClick: _cache[2] || (_cache[2] = ($event) => $options.chooseImage("front"))
  8842. }, [
  8843. $data.idCardFront ? (vue.openBlock(), vue.createElementBlock("image", {
  8844. key: 0,
  8845. src: $data.idCardFront,
  8846. class: "id-card-img",
  8847. mode: "aspectFill"
  8848. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock("view", {
  8849. key: 1,
  8850. class: "id-card-placeholder"
  8851. }, [
  8852. vue.createElementVNode("text", { class: "placeholder-text" }, "ID Front")
  8853. ])),
  8854. $data.idCardFront ? (vue.openBlock(), vue.createElementBlock("view", {
  8855. key: 2,
  8856. class: "delete-btn",
  8857. onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => $options.deleteImage("front"), ["stop"]))
  8858. }, "×")) : vue.createCommentVNode("v-if", true),
  8859. vue.createElementVNode("view", { class: "corner-tag" }, "人像面")
  8860. ]),
  8861. vue.createElementVNode("view", {
  8862. class: "id-card-upload",
  8863. onClick: _cache[4] || (_cache[4] = ($event) => $options.chooseImage("back"))
  8864. }, [
  8865. $data.idCardBack ? (vue.openBlock(), vue.createElementBlock("image", {
  8866. key: 0,
  8867. src: $data.idCardBack,
  8868. class: "id-card-img",
  8869. mode: "aspectFill"
  8870. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock("view", {
  8871. key: 1,
  8872. class: "id-card-placeholder"
  8873. }, [
  8874. vue.createElementVNode("text", { class: "placeholder-text" }, "ID Back")
  8875. ])),
  8876. $data.idCardBack ? (vue.openBlock(), vue.createElementBlock("view", {
  8877. key: 2,
  8878. class: "delete-btn",
  8879. onClick: _cache[3] || (_cache[3] = vue.withModifiers(($event) => $options.deleteImage("back"), ["stop"]))
  8880. }, "×")) : vue.createCommentVNode("v-if", true),
  8881. vue.createElementVNode("view", { class: "corner-tag" }, "国徽面")
  8882. ])
  8883. ])
  8884. ]),
  8885. vue.createElementVNode("view", { class: "section-card" }, [
  8886. vue.createElementVNode("view", { class: "section-title" }, "服务类型"),
  8887. vue.createElementVNode("text", { class: "section-subtitle" }, "可多选"),
  8888. vue.createElementVNode("view", { class: "service-list" }, [
  8889. (vue.openBlock(true), vue.createElementBlock(
  8890. vue.Fragment,
  8891. null,
  8892. vue.renderList($data.serviceOptions, (service, index) => {
  8893. return vue.openBlock(), vue.createElementBlock("view", {
  8894. class: "service-item",
  8895. key: index,
  8896. onClick: ($event) => $options.toggleService(service)
  8897. }, [
  8898. vue.createElementVNode(
  8899. "text",
  8900. { class: "service-name" },
  8901. vue.toDisplayString(service),
  8902. 1
  8903. /* TEXT */
  8904. ),
  8905. vue.createElementVNode(
  8906. "view",
  8907. {
  8908. class: vue.normalizeClass(["check-icon", { active: $data.selectedServices.includes(service) }])
  8909. },
  8910. [
  8911. $data.selectedServices.includes(service) ? (vue.openBlock(), vue.createElementBlock("text", { key: 0 }, "✓")) : vue.createCommentVNode("v-if", true)
  8912. ],
  8913. 2
  8914. /* CLASS */
  8915. )
  8916. ], 8, ["onClick"]);
  8917. }),
  8918. 128
  8919. /* KEYED_FRAGMENT */
  8920. ))
  8921. ])
  8922. ]),
  8923. vue.createElementVNode("view", { class: "section-card" }, [
  8924. vue.createElementVNode("view", { class: "section-title" }, "资质证书"),
  8925. vue.createElementVNode("text", { class: "section-subtitle" }, "请上传对应服务的资质"),
  8926. (vue.openBlock(true), vue.createElementBlock(
  8927. vue.Fragment,
  8928. null,
  8929. vue.renderList($data.selectedServices, (service, index) => {
  8930. return vue.openBlock(), vue.createElementBlock("view", {
  8931. key: index,
  8932. class: "qual-section"
  8933. }, [
  8934. vue.createElementVNode(
  8935. "text",
  8936. { class: "qual-title" },
  8937. vue.toDisplayString(service) + "资质",
  8938. 1
  8939. /* TEXT */
  8940. ),
  8941. vue.createElementVNode("view", { class: "qual-upload-row" }, [
  8942. (vue.openBlock(true), vue.createElementBlock(
  8943. vue.Fragment,
  8944. null,
  8945. vue.renderList($data.qualifications[service], (img, imgIndex) => {
  8946. return vue.openBlock(), vue.createElementBlock("view", {
  8947. class: "qual-item",
  8948. key: imgIndex,
  8949. onClick: ($event) => $options.previewImage(service, imgIndex)
  8950. }, [
  8951. vue.createElementVNode("image", {
  8952. src: img,
  8953. class: "qual-img",
  8954. mode: "aspectFill"
  8955. }, null, 8, ["src"]),
  8956. vue.createElementVNode("view", {
  8957. class: "delete-btn",
  8958. onClick: vue.withModifiers(($event) => $options.deleteQualImage(service, imgIndex), ["stop"])
  8959. }, "×", 8, ["onClick"])
  8960. ], 8, ["onClick"]);
  8961. }),
  8962. 128
  8963. /* KEYED_FRAGMENT */
  8964. )),
  8965. vue.createElementVNode("view", {
  8966. class: "qual-upload-btn",
  8967. onClick: ($event) => $options.chooseQualImage(service)
  8968. }, [
  8969. vue.createElementVNode("text", { class: "plus-icon" }, "+")
  8970. ], 8, ["onClick"])
  8971. ])
  8972. ]);
  8973. }),
  8974. 128
  8975. /* KEYED_FRAGMENT */
  8976. )),
  8977. $data.selectedServices.length === 0 ? (vue.openBlock(), vue.createElementBlock("text", {
  8978. key: 0,
  8979. class: "empty-hint"
  8980. }, "请先选择服务类型")) : vue.createCommentVNode("v-if", true)
  8981. ]),
  8982. vue.createElementVNode("view", { class: "bottom-btn-area" }, [
  8983. vue.createElementVNode("button", {
  8984. class: "submit-btn",
  8985. onClick: _cache[5] || (_cache[5] = (...args) => $options.submitAuth && $options.submitAuth(...args))
  8986. }, "提交审核")
  8987. ])
  8988. ]);
  8989. }
  8990. 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"]]);
  8991. const _imports_1$3 = "/static/icons/shield.svg";
  8992. const _sfc_main$g = {
  8993. data() {
  8994. return {
  8995. hasShieldIcon: false
  8996. // 如果没有盾牌图标资源,暂时隐藏或用文字代替
  8997. };
  8998. },
  8999. methods: {
  9000. navBack() {
  9001. uni.navigateBack({
  9002. delta: 1
  9003. });
  9004. },
  9005. editBank() {
  9006. uni.showToast({ title: "跳转修改银行卡页", icon: "none" });
  9007. }
  9008. }
  9009. };
  9010. function _sfc_render$f(_ctx, _cache, $props, $setup, $data, $options) {
  9011. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9012. vue.createElementVNode("view", { class: "custom-header" }, [
  9013. vue.createElementVNode("view", {
  9014. class: "header-left",
  9015. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9016. }, [
  9017. vue.createElementVNode("image", {
  9018. class: "back-icon",
  9019. src: _imports_0,
  9020. style: { "transform": "rotate(180deg)" }
  9021. })
  9022. ]),
  9023. vue.createElementVNode("text", { class: "header-title" }, "银行卡信息"),
  9024. vue.createElementVNode("view", { class: "header-right" })
  9025. ]),
  9026. vue.createElementVNode("view", { class: "header-placeholder" }),
  9027. vue.createElementVNode("view", { class: "bank-card" }, [
  9028. vue.createElementVNode("view", { class: "card-top" }, [
  9029. vue.createElementVNode("view", { class: "bank-info" }, [
  9030. vue.createElementVNode("view", { class: "bank-icon-circle" }, [
  9031. vue.createElementVNode("text", { class: "bank-icon-text" }, "招")
  9032. ]),
  9033. vue.createElementVNode("text", { class: "bank-name" }, "招商银行")
  9034. ]),
  9035. vue.createElementVNode("view", { class: "card-type" }, "储蓄卡")
  9036. ]),
  9037. vue.createElementVNode("view", { class: "card-number" }, "622588******1234"),
  9038. vue.createElementVNode("view", { class: "card-bg-circle" })
  9039. ]),
  9040. vue.createElementVNode("button", {
  9041. class: "action-btn",
  9042. onClick: _cache[1] || (_cache[1] = (...args) => $options.editBank && $options.editBank(...args))
  9043. }, "修改银行卡信息"),
  9044. vue.createElementVNode("view", { class: "security-tip" }, [
  9045. $data.hasShieldIcon ? (vue.openBlock(), vue.createElementBlock("image", {
  9046. key: 0,
  9047. class: "shield-icon",
  9048. src: _imports_1$3
  9049. })) : vue.createCommentVNode("v-if", true),
  9050. vue.createElementVNode("text", null, "信息已加密,仅用于收入发放")
  9051. ])
  9052. ]);
  9053. }
  9054. 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"]]);
  9055. const _sfc_main$f = {
  9056. data() {
  9057. return {
  9058. phone: "",
  9059. hasPassword: false
  9060. };
  9061. },
  9062. onLoad() {
  9063. this.loadProfile();
  9064. },
  9065. methods: {
  9066. navBack() {
  9067. uni.navigateBack({
  9068. delta: 1
  9069. });
  9070. },
  9071. async loadProfile() {
  9072. try {
  9073. const res = await getMyProfile();
  9074. if (res.code === 200 && res.data) {
  9075. this.phone = res.data.phone || "";
  9076. this.hasPassword = !!res.data.hasPassword;
  9077. }
  9078. } catch (e) {
  9079. formatAppLog("error", "at pages/mine/settings/security/index.vue:68", "加载个人信息失败", e);
  9080. }
  9081. },
  9082. maskPhone(phone) {
  9083. if (!phone || phone.length < 11)
  9084. return phone;
  9085. return phone.substring(0, 3) + "****" + phone.substring(7);
  9086. },
  9087. changeMobile() {
  9088. uni.navigateTo({
  9089. url: "/pages/mine/settings/security/change-phone"
  9090. });
  9091. },
  9092. changePassword() {
  9093. uni.navigateTo({
  9094. url: "/pages/mine/settings/security/change-password"
  9095. });
  9096. },
  9097. async deleteAccount() {
  9098. uni.showModal({
  9099. title: "警示",
  9100. content: "注销账号后将无法恢复,确定要继续吗?",
  9101. success: async (res) => {
  9102. if (res.confirm) {
  9103. try {
  9104. const result = await deleteAccount();
  9105. if (result.code === 200) {
  9106. uni.showToast({ title: "账号已注销", icon: "success" });
  9107. setTimeout(() => {
  9108. uni.reLaunch({ url: "/pages/login/login" });
  9109. }, 1500);
  9110. } else {
  9111. uni.showToast({ title: result.msg || "注销失败", icon: "none" });
  9112. }
  9113. } catch (e) {
  9114. formatAppLog("error", "at pages/mine/settings/security/index.vue:102", "注销账号失败", e);
  9115. uni.showToast({ title: "注销失败", icon: "none" });
  9116. }
  9117. }
  9118. }
  9119. });
  9120. }
  9121. }
  9122. };
  9123. function _sfc_render$e(_ctx, _cache, $props, $setup, $data, $options) {
  9124. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9125. vue.createElementVNode("view", { class: "custom-header" }, [
  9126. vue.createElementVNode("view", {
  9127. class: "header-left",
  9128. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9129. }, [
  9130. vue.createElementVNode("image", {
  9131. class: "back-icon",
  9132. src: _imports_0,
  9133. style: { "transform": "rotate(180deg)" }
  9134. })
  9135. ]),
  9136. vue.createElementVNode("text", { class: "header-title" }, "账号与安全"),
  9137. vue.createElementVNode("view", { class: "header-right" })
  9138. ]),
  9139. vue.createElementVNode("view", { class: "header-placeholder" }),
  9140. vue.createElementVNode("view", { class: "section-title-security" }, "安全设置"),
  9141. vue.createElementVNode("view", { class: "group-card" }, [
  9142. vue.createElementVNode("view", {
  9143. class: "list-item",
  9144. onClick: _cache[1] || (_cache[1] = (...args) => $options.changeMobile && $options.changeMobile(...args))
  9145. }, [
  9146. vue.createElementVNode("text", { class: "item-title" }, "手机号"),
  9147. vue.createElementVNode("view", { class: "item-right" }, [
  9148. vue.createElementVNode(
  9149. "text",
  9150. { class: "item-value" },
  9151. vue.toDisplayString($options.maskPhone($data.phone) || "未设置"),
  9152. 1
  9153. /* TEXT */
  9154. ),
  9155. vue.createElementVNode("image", {
  9156. class: "arrow-icon",
  9157. src: _imports_3
  9158. })
  9159. ])
  9160. ]),
  9161. vue.createElementVNode("view", {
  9162. class: "list-item",
  9163. onClick: _cache[2] || (_cache[2] = (...args) => $options.changePassword && $options.changePassword(...args))
  9164. }, [
  9165. vue.createElementVNode("text", { class: "item-title" }, "登录密码"),
  9166. vue.createElementVNode("view", { class: "item-right" }, [
  9167. vue.createElementVNode(
  9168. "text",
  9169. { class: "item-value" },
  9170. vue.toDisplayString($data.hasPassword ? "已设置" : "未设置"),
  9171. 1
  9172. /* TEXT */
  9173. ),
  9174. vue.createElementVNode("image", {
  9175. class: "arrow-icon",
  9176. src: _imports_3
  9177. })
  9178. ])
  9179. ])
  9180. ]),
  9181. vue.createElementVNode("view", { class: "section-title-security" }, "高级设置"),
  9182. vue.createElementVNode("view", { class: "group-card" }, [
  9183. vue.createElementVNode("view", {
  9184. class: "list-item no-border",
  9185. onClick: _cache[3] || (_cache[3] = (...args) => $options.deleteAccount && $options.deleteAccount(...args))
  9186. }, [
  9187. vue.createElementVNode("text", { class: "item-title" }, "注销账号"),
  9188. vue.createElementVNode("image", {
  9189. class: "arrow-icon",
  9190. src: _imports_3
  9191. })
  9192. ])
  9193. ])
  9194. ]);
  9195. }
  9196. 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"]]);
  9197. const _sfc_main$e = {
  9198. data() {
  9199. return {
  9200. name: ""
  9201. };
  9202. },
  9203. onLoad(options) {
  9204. if (options.name) {
  9205. this.name = decodeURIComponent(options.name);
  9206. }
  9207. },
  9208. methods: {
  9209. navBack() {
  9210. uni.navigateBack({ delta: 1 });
  9211. },
  9212. // 提交修改 @author steelwei
  9213. async submitChange() {
  9214. if (!this.name || !this.name.trim()) {
  9215. uni.showToast({ title: "请输入姓名", icon: "none" });
  9216. return;
  9217. }
  9218. if (this.name.trim().length < 2) {
  9219. uni.showToast({ title: "姓名至少2个字符", icon: "none" });
  9220. return;
  9221. }
  9222. uni.showLoading({ title: "提交中..." });
  9223. try {
  9224. const res = await updateName(this.name.trim());
  9225. if (res.code === 200) {
  9226. uni.showToast({
  9227. title: "修改成功",
  9228. icon: "success",
  9229. duration: 2e3
  9230. });
  9231. uni.$emit("updateName", this.name.trim());
  9232. setTimeout(() => {
  9233. uni.navigateBack({ delta: 1 });
  9234. }, 2e3);
  9235. } else {
  9236. uni.showToast({
  9237. title: res.msg || "修改失败",
  9238. icon: "none"
  9239. });
  9240. }
  9241. } catch (error) {
  9242. formatAppLog("error", "at pages/mine/settings/profile/edit-name.vue:94", "修改姓名失败:", error);
  9243. uni.showToast({ title: "网络错误", icon: "none" });
  9244. } finally {
  9245. uni.hideLoading();
  9246. }
  9247. }
  9248. }
  9249. };
  9250. function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
  9251. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9252. vue.createElementVNode("view", { class: "custom-header" }, [
  9253. vue.createElementVNode("view", {
  9254. class: "header-left",
  9255. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9256. }, [
  9257. vue.createElementVNode("image", {
  9258. class: "back-icon",
  9259. src: _imports_0,
  9260. style: { "transform": "rotate(180deg)" }
  9261. })
  9262. ]),
  9263. vue.createElementVNode("text", { class: "header-title" }, "修改姓名"),
  9264. vue.createElementVNode("view", { class: "header-right" })
  9265. ]),
  9266. vue.createElementVNode("view", { class: "header-placeholder" }),
  9267. vue.createElementVNode("view", { class: "form-card" }, [
  9268. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9269. vue.createElementVNode("text", { class: "form-label" }, "真实姓名"),
  9270. vue.withDirectives(vue.createElementVNode(
  9271. "input",
  9272. {
  9273. class: "form-input",
  9274. type: "text",
  9275. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.name = $event),
  9276. placeholder: "请输入真实姓名",
  9277. "placeholder-class": "placeholder",
  9278. maxlength: "20"
  9279. },
  9280. null,
  9281. 512
  9282. /* NEED_PATCH */
  9283. ), [
  9284. [vue.vModelText, $data.name]
  9285. ])
  9286. ])
  9287. ]),
  9288. vue.createElementVNode("view", { class: "btn-area" }, [
  9289. vue.createElementVNode("button", {
  9290. class: "submit-btn",
  9291. onClick: _cache[2] || (_cache[2] = (...args) => $options.submitChange && $options.submitChange(...args))
  9292. }, "确认修改")
  9293. ]),
  9294. vue.createElementVNode("view", { class: "tips" }, [
  9295. vue.createElementVNode("text", { class: "tips-text" }, "• 请输入您的真实姓名"),
  9296. vue.createElementVNode("text", { class: "tips-text" }, "• 姓名将用于实名认证和订单服务")
  9297. ])
  9298. ]);
  9299. }
  9300. 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"]]);
  9301. const _sfc_main$d = {
  9302. data() {
  9303. return {
  9304. oldPassword: "",
  9305. newPassword: "",
  9306. confirmPassword: ""
  9307. };
  9308. },
  9309. methods: {
  9310. navBack() {
  9311. uni.navigateBack({ delta: 1 });
  9312. },
  9313. // 提交修改 @author steelwei
  9314. async submitChange() {
  9315. if (!this.oldPassword) {
  9316. uni.showToast({ title: "请输入旧密码", icon: "none" });
  9317. return;
  9318. }
  9319. if (!this.newPassword) {
  9320. uni.showToast({ title: "请输入新密码", icon: "none" });
  9321. return;
  9322. }
  9323. if (this.newPassword.length < 6 || this.newPassword.length > 20) {
  9324. uni.showToast({ title: "密码长度为6-20位", icon: "none" });
  9325. return;
  9326. }
  9327. if (this.newPassword !== this.confirmPassword) {
  9328. uni.showToast({ title: "两次密码输入不一致", icon: "none" });
  9329. return;
  9330. }
  9331. uni.showLoading({ title: "提交中..." });
  9332. try {
  9333. const res = await updatePassword(this.oldPassword, this.newPassword);
  9334. if (res.code === 200) {
  9335. uni.showToast({
  9336. title: "修改成功",
  9337. icon: "success",
  9338. duration: 2e3
  9339. });
  9340. setTimeout(() => {
  9341. uni.navigateBack({ delta: 1 });
  9342. }, 2e3);
  9343. } else {
  9344. uni.showToast({
  9345. title: res.msg || "修改失败",
  9346. icon: "none"
  9347. });
  9348. }
  9349. } catch (error) {
  9350. formatAppLog("error", "at pages/mine/settings/security/change-password.vue:109", "修改密码失败:", error);
  9351. uni.showToast({ title: "网络错误", icon: "none" });
  9352. } finally {
  9353. uni.hideLoading();
  9354. }
  9355. }
  9356. }
  9357. };
  9358. function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
  9359. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9360. vue.createElementVNode("view", { class: "custom-header" }, [
  9361. vue.createElementVNode("view", {
  9362. class: "header-left",
  9363. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9364. }, [
  9365. vue.createElementVNode("image", {
  9366. class: "back-icon",
  9367. src: _imports_0,
  9368. style: { "transform": "rotate(180deg)" }
  9369. })
  9370. ]),
  9371. vue.createElementVNode("text", { class: "header-title" }, "修改密码"),
  9372. vue.createElementVNode("view", { class: "header-right" })
  9373. ]),
  9374. vue.createElementVNode("view", { class: "header-placeholder" }),
  9375. vue.createElementVNode("view", { class: "form-card" }, [
  9376. vue.createElementVNode("view", { class: "form-item" }, [
  9377. vue.createElementVNode("text", { class: "form-label" }, "旧密码"),
  9378. vue.withDirectives(vue.createElementVNode(
  9379. "input",
  9380. {
  9381. class: "form-input",
  9382. type: "password",
  9383. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.oldPassword = $event),
  9384. placeholder: "请输入旧密码",
  9385. "placeholder-class": "placeholder"
  9386. },
  9387. null,
  9388. 512
  9389. /* NEED_PATCH */
  9390. ), [
  9391. [vue.vModelText, $data.oldPassword]
  9392. ])
  9393. ]),
  9394. vue.createElementVNode("view", { class: "form-item" }, [
  9395. vue.createElementVNode("text", { class: "form-label" }, "新密码"),
  9396. vue.withDirectives(vue.createElementVNode(
  9397. "input",
  9398. {
  9399. class: "form-input",
  9400. type: "password",
  9401. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.newPassword = $event),
  9402. placeholder: "请输入新密码(6-20位)",
  9403. "placeholder-class": "placeholder"
  9404. },
  9405. null,
  9406. 512
  9407. /* NEED_PATCH */
  9408. ), [
  9409. [vue.vModelText, $data.newPassword]
  9410. ])
  9411. ]),
  9412. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9413. vue.createElementVNode("text", { class: "form-label" }, "确认密码"),
  9414. vue.withDirectives(vue.createElementVNode(
  9415. "input",
  9416. {
  9417. class: "form-input",
  9418. type: "password",
  9419. "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $data.confirmPassword = $event),
  9420. placeholder: "请再次输入新密码",
  9421. "placeholder-class": "placeholder"
  9422. },
  9423. null,
  9424. 512
  9425. /* NEED_PATCH */
  9426. ), [
  9427. [vue.vModelText, $data.confirmPassword]
  9428. ])
  9429. ])
  9430. ]),
  9431. vue.createElementVNode("view", { class: "btn-area" }, [
  9432. vue.createElementVNode("button", {
  9433. class: "submit-btn",
  9434. onClick: _cache[4] || (_cache[4] = (...args) => $options.submitChange && $options.submitChange(...args))
  9435. }, "确认修改")
  9436. ])
  9437. ]);
  9438. }
  9439. 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"]]);
  9440. const _sfc_main$c = {
  9441. data() {
  9442. return {
  9443. phone: "",
  9444. code: "",
  9445. countdown: 0,
  9446. timer: null
  9447. };
  9448. },
  9449. onUnload() {
  9450. if (this.timer) {
  9451. clearInterval(this.timer);
  9452. }
  9453. },
  9454. methods: {
  9455. navBack() {
  9456. uni.navigateBack({ delta: 1 });
  9457. },
  9458. // 发送验证码 @author steelwei
  9459. sendCode() {
  9460. if (!this.phone) {
  9461. uni.showToast({ title: "请输入手机号", icon: "none" });
  9462. return;
  9463. }
  9464. if (!/^1[3-9]\d{9}$/.test(this.phone)) {
  9465. uni.showToast({ title: "手机号格式不正确", icon: "none" });
  9466. return;
  9467. }
  9468. uni.showToast({ title: "验证码已发送", icon: "success" });
  9469. this.countdown = 60;
  9470. this.timer = setInterval(() => {
  9471. this.countdown--;
  9472. if (this.countdown <= 0) {
  9473. clearInterval(this.timer);
  9474. }
  9475. }, 1e3);
  9476. },
  9477. // 提交修改 @author steelwei
  9478. async submitChange() {
  9479. if (!this.phone) {
  9480. uni.showToast({ title: "请输入手机号", icon: "none" });
  9481. return;
  9482. }
  9483. if (!/^1[3-9]\d{9}$/.test(this.phone)) {
  9484. uni.showToast({ title: "手机号格式不正确", icon: "none" });
  9485. return;
  9486. }
  9487. if (!this.code) {
  9488. uni.showToast({ title: "请输入验证码", icon: "none" });
  9489. return;
  9490. }
  9491. uni.showLoading({ title: "提交中..." });
  9492. try {
  9493. const res = await updatePhone(this.phone, this.code);
  9494. if (res.code === 200) {
  9495. uni.showToast({
  9496. title: "修改成功",
  9497. icon: "success",
  9498. duration: 2e3
  9499. });
  9500. setTimeout(() => {
  9501. uni.navigateBack({ delta: 1 });
  9502. }, 2e3);
  9503. } else {
  9504. uni.showToast({
  9505. title: res.msg || "修改失败",
  9506. icon: "none"
  9507. });
  9508. }
  9509. } catch (error) {
  9510. formatAppLog("error", "at pages/mine/settings/security/change-phone.vue:139", "修改手机号失败:", error);
  9511. uni.showToast({ title: "网络错误", icon: "none" });
  9512. } finally {
  9513. uni.hideLoading();
  9514. }
  9515. }
  9516. }
  9517. };
  9518. function _sfc_render$b(_ctx, _cache, $props, $setup, $data, $options) {
  9519. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9520. vue.createElementVNode("view", { class: "custom-header" }, [
  9521. vue.createElementVNode("view", {
  9522. class: "header-left",
  9523. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9524. }, [
  9525. vue.createElementVNode("image", {
  9526. class: "back-icon",
  9527. src: _imports_0,
  9528. style: { "transform": "rotate(180deg)" }
  9529. })
  9530. ]),
  9531. vue.createElementVNode("text", { class: "header-title" }, "修改手机号"),
  9532. vue.createElementVNode("view", { class: "header-right" })
  9533. ]),
  9534. vue.createElementVNode("view", { class: "header-placeholder" }),
  9535. vue.createElementVNode("view", { class: "form-card" }, [
  9536. vue.createElementVNode("view", { class: "form-item" }, [
  9537. vue.createElementVNode("text", { class: "form-label" }, "新手机号"),
  9538. vue.withDirectives(vue.createElementVNode(
  9539. "input",
  9540. {
  9541. class: "form-input",
  9542. type: "number",
  9543. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.phone = $event),
  9544. placeholder: "请输入新手机号",
  9545. "placeholder-class": "placeholder",
  9546. maxlength: "11"
  9547. },
  9548. null,
  9549. 512
  9550. /* NEED_PATCH */
  9551. ), [
  9552. [vue.vModelText, $data.phone]
  9553. ])
  9554. ]),
  9555. vue.createElementVNode("view", { class: "form-item no-border" }, [
  9556. vue.createElementVNode("text", { class: "form-label" }, "验证码"),
  9557. vue.withDirectives(vue.createElementVNode(
  9558. "input",
  9559. {
  9560. class: "form-input",
  9561. type: "number",
  9562. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.code = $event),
  9563. placeholder: "请输入验证码",
  9564. "placeholder-class": "placeholder",
  9565. maxlength: "6"
  9566. },
  9567. null,
  9568. 512
  9569. /* NEED_PATCH */
  9570. ), [
  9571. [vue.vModelText, $data.code]
  9572. ]),
  9573. vue.createElementVNode("button", {
  9574. class: "code-btn",
  9575. disabled: $data.countdown > 0,
  9576. onClick: _cache[3] || (_cache[3] = (...args) => $options.sendCode && $options.sendCode(...args))
  9577. }, vue.toDisplayString($data.countdown > 0 ? `${$data.countdown}s` : "获取验证码"), 9, ["disabled"])
  9578. ])
  9579. ]),
  9580. vue.createElementVNode("view", { class: "btn-area" }, [
  9581. vue.createElementVNode("button", {
  9582. class: "submit-btn",
  9583. onClick: _cache[4] || (_cache[4] = (...args) => $options.submitChange && $options.submitChange(...args))
  9584. }, "确认修改")
  9585. ]),
  9586. vue.createElementVNode("view", { class: "tips" }, [
  9587. vue.createElementVNode("text", { class: "tips-text" }, "• 修改手机号后,新手机号将作为登录账号"),
  9588. vue.createElementVNode("text", { class: "tips-text" }, "• 请确保新手机号可以正常接收短信")
  9589. ])
  9590. ]);
  9591. }
  9592. 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"]]);
  9593. const _sfc_main$b = {
  9594. data() {
  9595. return {};
  9596. },
  9597. methods: {
  9598. navBack() {
  9599. uni.navigateBack({
  9600. delta: 1
  9601. });
  9602. },
  9603. switchChange(type, e) {
  9604. formatAppLog("log", "at pages/mine/settings/notification/index.vue:41", "switch change", type, e.detail.value);
  9605. }
  9606. }
  9607. };
  9608. function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
  9609. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9610. vue.createElementVNode("view", { class: "custom-header" }, [
  9611. vue.createElementVNode("view", {
  9612. class: "header-left",
  9613. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9614. }, [
  9615. vue.createElementVNode("image", {
  9616. class: "back-icon",
  9617. src: _imports_0,
  9618. style: { "transform": "rotate(180deg)" }
  9619. })
  9620. ]),
  9621. vue.createElementVNode("text", { class: "header-title" }, "推送通知设置"),
  9622. vue.createElementVNode("view", { class: "header-right" })
  9623. ]),
  9624. vue.createElementVNode("view", { class: "header-placeholder" }),
  9625. vue.createElementVNode("view", { class: "group-card" }, [
  9626. vue.createElementVNode("view", { class: "list-item" }, [
  9627. vue.createElementVNode("text", { class: "item-title" }, "系统消息通知"),
  9628. vue.createElementVNode(
  9629. "switch",
  9630. {
  9631. checked: "",
  9632. color: "#FF5722",
  9633. style: { "transform": "scale(0.8)" },
  9634. onChange: _cache[1] || (_cache[1] = ($event) => $options.switchChange("system", $event))
  9635. },
  9636. null,
  9637. 32
  9638. /* NEED_HYDRATION */
  9639. )
  9640. ]),
  9641. vue.createElementVNode("view", { class: "list-item no-border" }, [
  9642. vue.createElementVNode("text", { class: "item-title" }, "订单消息通知"),
  9643. vue.createElementVNode(
  9644. "switch",
  9645. {
  9646. checked: "",
  9647. color: "#FF5722",
  9648. style: { "transform": "scale(0.8)" },
  9649. onChange: _cache[2] || (_cache[2] = ($event) => $options.switchChange("order", $event))
  9650. },
  9651. null,
  9652. 32
  9653. /* NEED_HYDRATION */
  9654. )
  9655. ])
  9656. ]),
  9657. vue.createElementVNode("text", { class: "tips-text" }, "关闭通知后将收不到消息通知推送")
  9658. ]);
  9659. }
  9660. 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"]]);
  9661. const _sfc_main$a = {
  9662. data() {
  9663. return {};
  9664. },
  9665. methods: {
  9666. navBack() {
  9667. uni.navigateBack({
  9668. delta: 1
  9669. });
  9670. }
  9671. }
  9672. };
  9673. function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) {
  9674. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9675. vue.createElementVNode("view", { class: "custom-header" }, [
  9676. vue.createElementVNode("view", {
  9677. class: "header-left",
  9678. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9679. }, [
  9680. vue.createElementVNode("image", {
  9681. class: "back-icon",
  9682. src: _imports_0,
  9683. style: { "transform": "rotate(180deg)" }
  9684. })
  9685. ]),
  9686. vue.createElementVNode("text", { class: "header-title" }, "关于我们"),
  9687. vue.createElementVNode("view", { class: "header-right" })
  9688. ]),
  9689. vue.createElementVNode("view", { class: "header-placeholder" }),
  9690. vue.createElementVNode("view", { class: "logo-area" }, [
  9691. vue.createElementVNode("image", {
  9692. class: "app-logo",
  9693. src: _imports_1$8,
  9694. mode: "aspectFit"
  9695. }),
  9696. vue.createElementVNode("text", { class: "app-name" }, "履约者APP"),
  9697. vue.createElementVNode("text", { class: "app-version" }, "Version 2.0.6")
  9698. ]),
  9699. vue.createElementVNode("view", { class: "group-card" }, [
  9700. vue.createElementVNode("view", { class: "list-item" }, [
  9701. vue.createElementVNode("text", { class: "item-title" }, "服务协议"),
  9702. vue.createElementVNode("image", {
  9703. class: "arrow-icon",
  9704. src: _imports_3
  9705. })
  9706. ]),
  9707. vue.createElementVNode("view", { class: "list-item" }, [
  9708. vue.createElementVNode("text", { class: "item-title" }, "隐私政策"),
  9709. vue.createElementVNode("image", {
  9710. class: "arrow-icon",
  9711. src: _imports_3
  9712. })
  9713. ]),
  9714. vue.createElementVNode("view", { class: "list-item no-border" }, [
  9715. vue.createElementVNode("text", { class: "item-title" }, "版本更新"),
  9716. vue.createElementVNode("view", { class: "item-right" }, [
  9717. vue.createElementVNode("view", { class: "badge-yellow" }, "1"),
  9718. vue.createElementVNode("image", {
  9719. class: "arrow-icon",
  9720. src: _imports_3
  9721. })
  9722. ])
  9723. ])
  9724. ])
  9725. ]);
  9726. }
  9727. 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"]]);
  9728. const _imports_1$2 = "/static/icons/wallet_white.svg";
  9729. const _imports_2$2 = "/static/icons/arrow_right_gray.svg";
  9730. const _sfc_main$9 = {
  9731. data() {
  9732. return {
  9733. currentTab: 0,
  9734. list: [
  9735. {
  9736. title: "订单服务费用",
  9737. desc: "订单 T1002839 完成结算",
  9738. time: "2026-02-03 14:30",
  9739. amount: "20.00",
  9740. type: "income",
  9741. tag: "订单"
  9742. },
  9743. {
  9744. title: "奖励费用",
  9745. desc: "早高峰冲单奖励",
  9746. time: "2026-02-03 10:00",
  9747. amount: "15.00",
  9748. type: "income",
  9749. tag: "奖励"
  9750. },
  9751. {
  9752. title: "惩罚金额",
  9753. desc: "超时送达扣款",
  9754. time: "2026-02-02 18:20",
  9755. amount: "-10.00",
  9756. type: "expense",
  9757. tag: "惩罚"
  9758. },
  9759. {
  9760. title: "后台转账",
  9761. desc: "2026年1月工资发放",
  9762. time: "2026-02-01 09:00",
  9763. amount: "3500.00",
  9764. type: "income",
  9765. tag: "工资"
  9766. }
  9767. ]
  9768. };
  9769. },
  9770. computed: {
  9771. displayList() {
  9772. if (this.currentTab === 0)
  9773. return this.list;
  9774. if (this.currentTab === 1)
  9775. return this.list.filter((item) => item.type === "income");
  9776. if (this.currentTab === 2)
  9777. return this.list.filter((item) => item.type === "expense");
  9778. return [];
  9779. }
  9780. },
  9781. methods: {
  9782. navBack() {
  9783. uni.navigateBack();
  9784. },
  9785. navToBill() {
  9786. uni.navigateTo({
  9787. url: "/pages/mine/wallet/bill"
  9788. });
  9789. },
  9790. switchTab(index) {
  9791. this.currentTab = index;
  9792. }
  9793. }
  9794. };
  9795. function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
  9796. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  9797. vue.createElementVNode("view", { class: "nav-bar" }, [
  9798. vue.createElementVNode("view", {
  9799. class: "nav-left",
  9800. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  9801. }, [
  9802. vue.createElementVNode("image", {
  9803. class: "back-icon",
  9804. src: _imports_0
  9805. })
  9806. ]),
  9807. vue.createElementVNode("text", { class: "nav-title" }, "我的钱包"),
  9808. vue.createElementVNode("view", { class: "nav-right" })
  9809. ]),
  9810. vue.createElementVNode("view", { class: "wallet-card" }, [
  9811. vue.createElementVNode("view", { class: "bg-circle big" }),
  9812. vue.createElementVNode("view", { class: "bg-circle small" }),
  9813. vue.createElementVNode("view", { class: "card-content" }, [
  9814. vue.createElementVNode("view", { class: "card-top" }, [
  9815. vue.createElementVNode("view", { class: "app-info" }, [
  9816. vue.createElementVNode("image", {
  9817. class: "app-logo",
  9818. src: _imports_1$2,
  9819. mode: "aspectFit"
  9820. }),
  9821. vue.createElementVNode("text", { class: "app-name" }, "履约者APP")
  9822. ]),
  9823. vue.createElementVNode("view", {
  9824. class: "bill-btn",
  9825. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToBill && $options.navToBill(...args))
  9826. }, [
  9827. vue.createElementVNode("text", null, "账单")
  9828. ])
  9829. ]),
  9830. vue.createElementVNode("view", { class: "balance-container" }, [
  9831. vue.createElementVNode("view", { class: "balance-main" }, [
  9832. vue.createElementVNode("text", { class: "balance-label" }, "账户余额 (元)"),
  9833. vue.createElementVNode("text", { class: "balance-num" }, "2575.00")
  9834. ]),
  9835. vue.createElementVNode("view", { class: "balance-pending" }, [
  9836. vue.createElementVNode("text", { class: "pending-label" }, "待入账 (元)"),
  9837. vue.createElementVNode("text", { class: "pending-num" }, "580.00")
  9838. ])
  9839. ])
  9840. ])
  9841. ]),
  9842. vue.createElementVNode("view", { class: "record-container" }, [
  9843. vue.createElementVNode("view", { class: "record-header" }, [
  9844. vue.createElementVNode("text", { class: "header-title" }, "最近账户余额变动记录"),
  9845. vue.createElementVNode("view", {
  9846. class: "header-more",
  9847. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToBill && $options.navToBill(...args))
  9848. }, [
  9849. vue.createElementVNode("text", null, "查看全部"),
  9850. vue.createElementVNode("image", {
  9851. class: "more-icon",
  9852. src: _imports_2$2
  9853. })
  9854. ])
  9855. ]),
  9856. vue.createElementVNode("view", { class: "tabs-row" }, [
  9857. vue.createElementVNode(
  9858. "view",
  9859. {
  9860. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  9861. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(0))
  9862. },
  9863. [
  9864. vue.createElementVNode("text", null, "全部"),
  9865. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  9866. key: 0,
  9867. class: "tab-line"
  9868. })) : vue.createCommentVNode("v-if", true)
  9869. ],
  9870. 2
  9871. /* CLASS */
  9872. ),
  9873. vue.createElementVNode(
  9874. "view",
  9875. {
  9876. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  9877. onClick: _cache[4] || (_cache[4] = ($event) => $options.switchTab(1))
  9878. },
  9879. [
  9880. vue.createElementVNode("text", null, "收入"),
  9881. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  9882. key: 0,
  9883. class: "tab-line"
  9884. })) : vue.createCommentVNode("v-if", true)
  9885. ],
  9886. 2
  9887. /* CLASS */
  9888. ),
  9889. vue.createElementVNode(
  9890. "view",
  9891. {
  9892. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  9893. onClick: _cache[5] || (_cache[5] = ($event) => $options.switchTab(2))
  9894. },
  9895. [
  9896. vue.createElementVNode("text", null, "支出"),
  9897. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  9898. key: 0,
  9899. class: "tab-line"
  9900. })) : vue.createCommentVNode("v-if", true)
  9901. ],
  9902. 2
  9903. /* CLASS */
  9904. )
  9905. ]),
  9906. vue.createElementVNode("view", { class: "record-list" }, [
  9907. (vue.openBlock(true), vue.createElementBlock(
  9908. vue.Fragment,
  9909. null,
  9910. vue.renderList($options.displayList, (item, index) => {
  9911. return vue.openBlock(), vue.createElementBlock("view", {
  9912. class: "list-item",
  9913. key: index
  9914. }, [
  9915. vue.createElementVNode("view", { class: "item-left" }, [
  9916. vue.createElementVNode(
  9917. "text",
  9918. { class: "item-title" },
  9919. vue.toDisplayString(item.title),
  9920. 1
  9921. /* TEXT */
  9922. ),
  9923. vue.createElementVNode(
  9924. "text",
  9925. { class: "item-desc" },
  9926. vue.toDisplayString(item.desc),
  9927. 1
  9928. /* TEXT */
  9929. ),
  9930. vue.createElementVNode(
  9931. "text",
  9932. { class: "item-time" },
  9933. vue.toDisplayString(item.time),
  9934. 1
  9935. /* TEXT */
  9936. )
  9937. ]),
  9938. vue.createElementVNode("view", { class: "item-right" }, [
  9939. vue.createElementVNode(
  9940. "text",
  9941. {
  9942. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  9943. },
  9944. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  9945. 3
  9946. /* TEXT, CLASS */
  9947. ),
  9948. vue.createElementVNode("view", { class: "item-tag" }, [
  9949. vue.createElementVNode(
  9950. "text",
  9951. null,
  9952. vue.toDisplayString(item.tag),
  9953. 1
  9954. /* TEXT */
  9955. )
  9956. ])
  9957. ])
  9958. ]);
  9959. }),
  9960. 128
  9961. /* KEYED_FRAGMENT */
  9962. ))
  9963. ])
  9964. ])
  9965. ]);
  9966. }
  9967. 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"]]);
  9968. const _sfc_main$8 = {
  9969. data() {
  9970. return {
  9971. currentTab: 0,
  9972. // 模拟数据结构
  9973. groups: [
  9974. {
  9975. month: "2月 2026",
  9976. income: "35.00",
  9977. expense: "10.00",
  9978. items: [
  9979. {
  9980. title: "订单服务费用",
  9981. desc: "订单完成",
  9982. time: "02-03 14:30",
  9983. amount: "20.00",
  9984. type: "income",
  9985. tag: "订单"
  9986. },
  9987. {
  9988. title: "奖励费用",
  9989. desc: "早高峰奖励",
  9990. // shortened to match ui better
  9991. time: "02-03 10:00",
  9992. amount: "15.00",
  9993. type: "income",
  9994. tag: "奖励"
  9995. },
  9996. {
  9997. title: "惩罚金额",
  9998. desc: "超时送达",
  9999. time: "02-02 18:20",
  10000. amount: "-10.00",
  10001. type: "expense",
  10002. tag: "惩罚"
  10003. }
  10004. ]
  10005. },
  10006. {
  10007. month: "1月 2026",
  10008. income: "3500.00",
  10009. expense: "100.00",
  10010. items: [
  10011. {
  10012. title: "后台转账",
  10013. desc: "1月工资发放",
  10014. time: "01-31 09:00",
  10015. amount: "3500.00",
  10016. type: "income",
  10017. tag: "工资"
  10018. },
  10019. {
  10020. title: "装备扣款",
  10021. desc: "装备费用",
  10022. time: "01-15 10:00",
  10023. amount: "-100.00",
  10024. type: "expense",
  10025. tag: "扣款"
  10026. }
  10027. ]
  10028. }
  10029. ]
  10030. };
  10031. },
  10032. computed: {
  10033. displayGroups() {
  10034. if (this.currentTab === 0)
  10035. return this.groups;
  10036. return this.groups.map((group) => {
  10037. const filteredItems = group.items.filter((item) => {
  10038. const type = this.currentTab === 1 ? "income" : "expense";
  10039. return item.type === type;
  10040. });
  10041. return {
  10042. ...group,
  10043. items: filteredItems
  10044. };
  10045. }).filter((group) => group.items.length > 0);
  10046. }
  10047. },
  10048. methods: {
  10049. navBack() {
  10050. uni.navigateBack();
  10051. },
  10052. switchTab(index) {
  10053. this.currentTab = index;
  10054. }
  10055. }
  10056. };
  10057. function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
  10058. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10059. vue.createElementVNode("view", { class: "nav-bar" }, [
  10060. vue.createElementVNode("view", {
  10061. class: "nav-left",
  10062. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10063. }, [
  10064. vue.createElementVNode("image", {
  10065. class: "back-icon",
  10066. src: _imports_0
  10067. })
  10068. ]),
  10069. vue.createElementVNode("text", { class: "nav-title" }, "账单明细"),
  10070. vue.createElementVNode("view", { class: "nav-right" })
  10071. ]),
  10072. vue.createElementVNode("view", { class: "content-area" }, [
  10073. vue.createElementVNode("view", { class: "tabs-row" }, [
  10074. vue.createElementVNode(
  10075. "view",
  10076. {
  10077. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  10078. onClick: _cache[1] || (_cache[1] = ($event) => $options.switchTab(0))
  10079. },
  10080. [
  10081. vue.createElementVNode("text", null, "全部"),
  10082. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  10083. key: 0,
  10084. class: "tab-line"
  10085. })) : vue.createCommentVNode("v-if", true)
  10086. ],
  10087. 2
  10088. /* CLASS */
  10089. ),
  10090. vue.createElementVNode(
  10091. "view",
  10092. {
  10093. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  10094. onClick: _cache[2] || (_cache[2] = ($event) => $options.switchTab(1))
  10095. },
  10096. [
  10097. vue.createElementVNode("text", null, "收入"),
  10098. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  10099. key: 0,
  10100. class: "tab-line"
  10101. })) : vue.createCommentVNode("v-if", true)
  10102. ],
  10103. 2
  10104. /* CLASS */
  10105. ),
  10106. vue.createElementVNode(
  10107. "view",
  10108. {
  10109. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  10110. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(2))
  10111. },
  10112. [
  10113. vue.createElementVNode("text", null, "支出"),
  10114. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  10115. key: 0,
  10116. class: "tab-line"
  10117. })) : vue.createCommentVNode("v-if", true)
  10118. ],
  10119. 2
  10120. /* CLASS */
  10121. )
  10122. ]),
  10123. vue.createElementVNode("scroll-view", {
  10124. "scroll-y": "",
  10125. class: "bill-list"
  10126. }, [
  10127. (vue.openBlock(true), vue.createElementBlock(
  10128. vue.Fragment,
  10129. null,
  10130. vue.renderList($options.displayGroups, (group, gIndex) => {
  10131. return vue.openBlock(), vue.createElementBlock("view", {
  10132. key: gIndex,
  10133. class: "month-group"
  10134. }, [
  10135. vue.createElementVNode("view", { class: "group-header" }, [
  10136. vue.createElementVNode(
  10137. "text",
  10138. { class: "month-title" },
  10139. vue.toDisplayString(group.month),
  10140. 1
  10141. /* TEXT */
  10142. ),
  10143. vue.createElementVNode(
  10144. "text",
  10145. { class: "month-summary" },
  10146. "收入 ¥" + vue.toDisplayString(group.income) + " 支出 ¥" + vue.toDisplayString(group.expense),
  10147. 1
  10148. /* TEXT */
  10149. )
  10150. ]),
  10151. (vue.openBlock(true), vue.createElementBlock(
  10152. vue.Fragment,
  10153. null,
  10154. vue.renderList(group.items, (item, index) => {
  10155. return vue.openBlock(), vue.createElementBlock("view", {
  10156. class: "list-item",
  10157. key: index
  10158. }, [
  10159. vue.createElementVNode(
  10160. "view",
  10161. {
  10162. class: vue.normalizeClass(["item-icon-box", item.type])
  10163. },
  10164. [
  10165. vue.createElementVNode(
  10166. "text",
  10167. { class: "item-icon-symbol" },
  10168. vue.toDisplayString(item.type === "income" ? "+" : "-"),
  10169. 1
  10170. /* TEXT */
  10171. )
  10172. ],
  10173. 2
  10174. /* CLASS */
  10175. ),
  10176. vue.createElementVNode("view", { class: "item-center" }, [
  10177. vue.createElementVNode(
  10178. "text",
  10179. { class: "item-title" },
  10180. vue.toDisplayString(item.title),
  10181. 1
  10182. /* TEXT */
  10183. ),
  10184. vue.createElementVNode(
  10185. "text",
  10186. { class: "item-desc" },
  10187. vue.toDisplayString(item.time) + " " + vue.toDisplayString(item.desc),
  10188. 1
  10189. /* TEXT */
  10190. )
  10191. ]),
  10192. vue.createElementVNode("view", { class: "item-right" }, [
  10193. vue.createElementVNode(
  10194. "text",
  10195. {
  10196. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  10197. },
  10198. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  10199. 3
  10200. /* TEXT, CLASS */
  10201. ),
  10202. vue.createElementVNode("view", { class: "item-tag" }, [
  10203. vue.createElementVNode(
  10204. "text",
  10205. null,
  10206. vue.toDisplayString(item.tag),
  10207. 1
  10208. /* TEXT */
  10209. )
  10210. ])
  10211. ])
  10212. ]);
  10213. }),
  10214. 128
  10215. /* KEYED_FRAGMENT */
  10216. ))
  10217. ]);
  10218. }),
  10219. 128
  10220. /* KEYED_FRAGMENT */
  10221. )),
  10222. vue.createElementVNode("view", { class: "list-padding-bottom" })
  10223. ])
  10224. ])
  10225. ]);
  10226. }
  10227. 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"]]);
  10228. const _sfc_main$7 = {
  10229. data() {
  10230. return {
  10231. currentIndex: 2,
  10232. // 默认选中 L3
  10233. levels: [
  10234. {
  10235. id: "L1",
  10236. name: "青铜履约者",
  10237. score: "需成长值 0",
  10238. isCurrent: false,
  10239. benefits: [
  10240. { name: "新手任务", desc: "完成新手任务可获得额外奖励", icon: "/static/icons/reward.svg" }
  10241. ]
  10242. },
  10243. {
  10244. id: "L2",
  10245. name: "白银履约者",
  10246. score: "需成长值 200",
  10247. isCurrent: false,
  10248. benefits: [
  10249. { name: "新手任务", desc: "完成新手任务可获得额外奖励", icon: "/static/icons/reward.svg" },
  10250. { name: "优先派单", desc: "系统将优先为您派送附近的优质订单", icon: "" }
  10251. ]
  10252. },
  10253. {
  10254. id: "L3",
  10255. name: "黄金履约者",
  10256. score: "需成长值 500",
  10257. isCurrent: true,
  10258. benefits: [
  10259. { name: "极速提现", desc: "提现申请 2 小时内极速到账,无需等待。", icon: "" },
  10260. { name: "晋升奖励", desc: "晋升等级可获得现金红包奖励。", icon: "/static/icons/reward.svg" },
  10261. { name: "优先派单", desc: "系统将优先为您派送附近的优质订单。", icon: "" }
  10262. ]
  10263. },
  10264. {
  10265. id: "L4",
  10266. name: "钻石履约者",
  10267. score: "需成长值 2000",
  10268. isCurrent: false,
  10269. benefits: [
  10270. { name: "专属客服", desc: "享受 7x24 小时专属客服通道。", icon: "/static/icons/service.svg" },
  10271. { name: "生日礼包", desc: "生日当天获赠专属礼包。", icon: "/static/icons/reward.svg" },
  10272. { name: "装备免费换", desc: "每年可免费更换一套履约装备。", icon: "" },
  10273. { name: "医疗互助", desc: "享受平台提供的医疗互助保障。", icon: "" }
  10274. ]
  10275. }
  10276. ],
  10277. isPopupShow: false,
  10278. currentBenefit: null
  10279. };
  10280. },
  10281. computed: {
  10282. currentLevel() {
  10283. return this.levels[this.currentIndex];
  10284. }
  10285. },
  10286. methods: {
  10287. navBack() {
  10288. uni.navigateBack({
  10289. delta: 1
  10290. });
  10291. },
  10292. swiperChange(e) {
  10293. this.currentIndex = e.detail.current;
  10294. },
  10295. changeLevel(index) {
  10296. this.currentIndex = index;
  10297. },
  10298. showBenefitDetail(benefit) {
  10299. this.currentBenefit = benefit;
  10300. this.isPopupShow = true;
  10301. },
  10302. closePopup() {
  10303. this.isPopupShow = false;
  10304. }
  10305. }
  10306. };
  10307. function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {
  10308. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10309. vue.createElementVNode("view", { class: "custom-header" }, [
  10310. vue.createElementVNode("view", {
  10311. class: "header-left",
  10312. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10313. }, [
  10314. vue.createElementVNode("image", {
  10315. class: "back-icon",
  10316. src: _imports_0,
  10317. style: { "transform": "rotate(180deg)" }
  10318. })
  10319. ]),
  10320. vue.createElementVNode("text", { class: "header-title" }, "履约者等级权益"),
  10321. vue.createElementVNode("view", { class: "header-right" })
  10322. ]),
  10323. vue.createElementVNode("view", { class: "header-placeholder" }),
  10324. vue.createElementVNode("view", { class: "swiper-container" }, [
  10325. vue.createElementVNode("swiper", {
  10326. class: "level-swiper",
  10327. "previous-margin": "80rpx",
  10328. "next-margin": "80rpx",
  10329. current: $data.currentIndex,
  10330. onChange: _cache[1] || (_cache[1] = (...args) => $options.swiperChange && $options.swiperChange(...args))
  10331. }, [
  10332. (vue.openBlock(true), vue.createElementBlock(
  10333. vue.Fragment,
  10334. null,
  10335. vue.renderList($data.levels, (level, index) => {
  10336. return vue.openBlock(), vue.createElementBlock("swiper-item", {
  10337. key: index,
  10338. onClick: ($event) => $options.changeLevel(index)
  10339. }, [
  10340. vue.createElementVNode(
  10341. "view",
  10342. {
  10343. class: vue.normalizeClass(["level-card", "level-card-" + (index + 1)]),
  10344. style: vue.normalizeStyle({ transform: $data.currentIndex === index ? "scale(1)" : "scale(0.9)" })
  10345. },
  10346. [
  10347. vue.createElementVNode("view", { class: "card-content" }, [
  10348. vue.createElementVNode("view", { class: "card-header" }, [
  10349. vue.createElementVNode(
  10350. "view",
  10351. { class: "level-badge" },
  10352. vue.toDisplayString(level.id),
  10353. 1
  10354. /* TEXT */
  10355. ),
  10356. level.isCurrent ? (vue.openBlock(), vue.createElementBlock("view", {
  10357. key: 0,
  10358. class: "current-badge"
  10359. }, "当前等级")) : vue.createCommentVNode("v-if", true)
  10360. ]),
  10361. vue.createElementVNode(
  10362. "text",
  10363. { class: "level-name" },
  10364. vue.toDisplayString(level.name),
  10365. 1
  10366. /* TEXT */
  10367. ),
  10368. vue.createElementVNode(
  10369. "text",
  10370. { class: "level-score" },
  10371. vue.toDisplayString(level.score),
  10372. 1
  10373. /* TEXT */
  10374. ),
  10375. vue.createElementVNode("image", {
  10376. class: "crown-overlay",
  10377. src: _imports_1$4,
  10378. mode: "aspectFit"
  10379. })
  10380. ])
  10381. ],
  10382. 6
  10383. /* CLASS, STYLE */
  10384. )
  10385. ], 8, ["onClick"]);
  10386. }),
  10387. 128
  10388. /* KEYED_FRAGMENT */
  10389. ))
  10390. ], 40, ["current"]),
  10391. vue.createElementVNode("view", { class: "swiper-dots" }, [
  10392. (vue.openBlock(true), vue.createElementBlock(
  10393. vue.Fragment,
  10394. null,
  10395. vue.renderList($data.levels, (item, index) => {
  10396. return vue.openBlock(), vue.createElementBlock(
  10397. "view",
  10398. {
  10399. class: vue.normalizeClass(["dot", { active: $data.currentIndex === index }]),
  10400. key: index
  10401. },
  10402. null,
  10403. 2
  10404. /* CLASS */
  10405. );
  10406. }),
  10407. 128
  10408. /* KEYED_FRAGMENT */
  10409. ))
  10410. ])
  10411. ]),
  10412. vue.createElementVNode("view", { class: "benefits-title-row" }, [
  10413. vue.createElementVNode(
  10414. "text",
  10415. { class: "benefits-title" },
  10416. vue.toDisplayString($options.currentLevel.id) + " 专属权益",
  10417. 1
  10418. /* TEXT */
  10419. ),
  10420. vue.createElementVNode(
  10421. "text",
  10422. { class: "benefits-count" },
  10423. "(" + vue.toDisplayString($options.currentLevel.benefits.length) + ")",
  10424. 1
  10425. /* TEXT */
  10426. )
  10427. ]),
  10428. vue.createElementVNode("view", { class: "benefits-grid" }, [
  10429. (vue.openBlock(true), vue.createElementBlock(
  10430. vue.Fragment,
  10431. null,
  10432. vue.renderList($options.currentLevel.benefits, (benefit, index) => {
  10433. return vue.openBlock(), vue.createElementBlock("view", {
  10434. class: "benefit-item",
  10435. key: index,
  10436. onClick: ($event) => $options.showBenefitDetail(benefit)
  10437. }, [
  10438. vue.createElementVNode("view", { class: "benefit-icon-wrapper" }, [
  10439. benefit.icon ? (vue.openBlock(), vue.createElementBlock("image", {
  10440. key: 0,
  10441. class: "benefit-icon",
  10442. src: benefit.icon,
  10443. mode: "aspectFit"
  10444. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  10445. "view",
  10446. {
  10447. key: 1,
  10448. class: "benefit-icon-placeholder"
  10449. },
  10450. vue.toDisplayString(benefit.name[0]),
  10451. 1
  10452. /* TEXT */
  10453. ))
  10454. ]),
  10455. vue.createElementVNode(
  10456. "text",
  10457. { class: "benefit-name" },
  10458. vue.toDisplayString(benefit.name),
  10459. 1
  10460. /* TEXT */
  10461. )
  10462. ], 8, ["onClick"]);
  10463. }),
  10464. 128
  10465. /* KEYED_FRAGMENT */
  10466. ))
  10467. ]),
  10468. vue.createElementVNode(
  10469. "view",
  10470. {
  10471. class: vue.normalizeClass(["popup-mask", { "show": $data.isPopupShow }]),
  10472. onClick: _cache[4] || (_cache[4] = (...args) => $options.closePopup && $options.closePopup(...args)),
  10473. onTouchmove: _cache[5] || (_cache[5] = vue.withModifiers(() => {
  10474. }, ["stop", "prevent"]))
  10475. },
  10476. [
  10477. vue.createElementVNode("view", {
  10478. class: "popup-modal",
  10479. onClick: _cache[3] || (_cache[3] = vue.withModifiers(() => {
  10480. }, ["stop"]))
  10481. }, [
  10482. vue.createElementVNode("view", { class: "popup-icon-wrapper" }, [
  10483. $data.currentBenefit && $data.currentBenefit.icon ? (vue.openBlock(), vue.createElementBlock("image", {
  10484. key: 0,
  10485. class: "benefit-icon-large",
  10486. src: $data.currentBenefit.icon,
  10487. mode: "aspectFit"
  10488. }, null, 8, ["src"])) : (vue.openBlock(), vue.createElementBlock(
  10489. "view",
  10490. {
  10491. key: 1,
  10492. class: "benefit-icon-placeholder-large"
  10493. },
  10494. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.name[0] : ""),
  10495. 1
  10496. /* TEXT */
  10497. ))
  10498. ]),
  10499. vue.createElementVNode(
  10500. "text",
  10501. { class: "popup-title" },
  10502. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.name : ""),
  10503. 1
  10504. /* TEXT */
  10505. ),
  10506. vue.createElementVNode(
  10507. "text",
  10508. { class: "popup-desc" },
  10509. vue.toDisplayString($data.currentBenefit ? $data.currentBenefit.desc : ""),
  10510. 1
  10511. /* TEXT */
  10512. ),
  10513. vue.createElementVNode("button", {
  10514. class: "popup-btn",
  10515. onClick: _cache[2] || (_cache[2] = (...args) => $options.closePopup && $options.closePopup(...args))
  10516. }, "我知道了")
  10517. ])
  10518. ],
  10519. 34
  10520. /* CLASS, NEED_HYDRATION */
  10521. )
  10522. ]);
  10523. }
  10524. 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"]]);
  10525. const _imports_1$1 = "/static/icons/icon_order_msg.svg";
  10526. const _imports_2$1 = "/static/icons/icon_system_msg.svg";
  10527. const _sfc_main$6 = {
  10528. data() {
  10529. return {};
  10530. },
  10531. methods: {
  10532. navBack() {
  10533. uni.navigateBack();
  10534. },
  10535. navToOrderMsg() {
  10536. uni.navigateTo({
  10537. url: "/pages/mine/message/order"
  10538. });
  10539. },
  10540. navToSystemMsg() {
  10541. uni.navigateTo({
  10542. url: "/pages/mine/message/system"
  10543. });
  10544. }
  10545. }
  10546. };
  10547. function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
  10548. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10549. vue.createElementVNode("view", { class: "nav-bar" }, [
  10550. vue.createElementVNode("view", {
  10551. class: "nav-left",
  10552. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10553. }, [
  10554. vue.createElementVNode("image", {
  10555. class: "back-icon",
  10556. src: _imports_0,
  10557. style: { "transform": "rotate(180deg)" }
  10558. })
  10559. ]),
  10560. vue.createElementVNode("text", { class: "nav-title" }, "消息中心"),
  10561. vue.createElementVNode("view", { class: "nav-right" }, [
  10562. vue.createElementVNode("view", { class: "more-dots" }, [
  10563. vue.createElementVNode("view", { class: "dot" }),
  10564. vue.createElementVNode("view", { class: "dot" }),
  10565. vue.createElementVNode("view", { class: "dot" })
  10566. ])
  10567. ])
  10568. ]),
  10569. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10570. vue.createElementVNode("view", { class: "message-list" }, [
  10571. vue.createElementVNode("view", {
  10572. class: "message-item",
  10573. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToOrderMsg && $options.navToOrderMsg(...args))
  10574. }, [
  10575. vue.createElementVNode("view", { class: "icon-wrapper" }, [
  10576. vue.createElementVNode("image", {
  10577. class: "msg-icon",
  10578. src: _imports_1$1
  10579. }),
  10580. vue.createElementVNode("view", { class: "red-dot-badge" })
  10581. ]),
  10582. vue.createElementVNode("view", { class: "content-wrapper" }, [
  10583. vue.createElementVNode("view", { class: "top-row" }, [
  10584. vue.createElementVNode("text", { class: "msg-title" }, "订单消息"),
  10585. vue.createElementVNode("text", { class: "msg-time" }, "5分钟前")
  10586. ]),
  10587. vue.createElementVNode("text", { class: "msg-preview" }, "你收到一个站长手动派单的新订单")
  10588. ])
  10589. ]),
  10590. vue.createElementVNode("view", {
  10591. class: "message-item",
  10592. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToSystemMsg && $options.navToSystemMsg(...args))
  10593. }, [
  10594. vue.createElementVNode("view", { class: "icon-wrapper" }, [
  10595. vue.createElementVNode("image", {
  10596. class: "msg-icon",
  10597. src: _imports_2$1
  10598. })
  10599. ]),
  10600. vue.createElementVNode("view", { class: "content-wrapper" }, [
  10601. vue.createElementVNode("view", { class: "top-row" }, [
  10602. vue.createElementVNode("text", { class: "msg-title" }, "系统消息"),
  10603. vue.createElementVNode("text", { class: "msg-time" }, "7天前")
  10604. ]),
  10605. vue.createElementVNode("text", { class: "msg-preview" }, "你的健康证明认证审核已通过。")
  10606. ])
  10607. ])
  10608. ])
  10609. ]);
  10610. }
  10611. 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"]]);
  10612. const _sfc_main$5 = {
  10613. methods: {
  10614. navBack() {
  10615. uni.navigateBack();
  10616. }
  10617. }
  10618. };
  10619. function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
  10620. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10621. vue.createElementVNode("view", { class: "nav-bar" }, [
  10622. vue.createElementVNode("view", {
  10623. class: "nav-left",
  10624. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10625. }, [
  10626. vue.createElementVNode("image", {
  10627. class: "back-icon",
  10628. src: _imports_0,
  10629. style: { "transform": "rotate(180deg)" }
  10630. })
  10631. ]),
  10632. vue.createElementVNode("text", { class: "nav-title" }, "订单消息"),
  10633. vue.createElementVNode("view", { class: "nav-right" })
  10634. ]),
  10635. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10636. vue.createElementVNode("view", { class: "msg-group" }, [
  10637. vue.createElementVNode("view", { class: "date-label" }, "2099-12-28"),
  10638. vue.createElementVNode("view", { class: "msg-card" }, [
  10639. vue.createElementVNode("view", { class: "card-header" }, [
  10640. vue.createElementVNode("text", { class: "card-title" }, "站长手动派单"),
  10641. vue.createElementVNode("view", { class: "red-dot" })
  10642. ]),
  10643. vue.createElementVNode("view", { class: "card-body" }, [
  10644. vue.createElementVNode("text", { class: "msg-text" }, "你收到一个新订单,请及时查看并接单。")
  10645. ]),
  10646. vue.createElementVNode("view", { class: "card-footer" }, [
  10647. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503521"),
  10648. vue.createElementVNode("image", {
  10649. class: "arrow-icon",
  10650. src: _imports_3
  10651. })
  10652. ])
  10653. ]),
  10654. vue.createElementVNode("view", { class: "msg-card" }, [
  10655. vue.createElementVNode("view", { class: "card-header" }, [
  10656. vue.createElementVNode("text", { class: "card-title" }, "系统自动派单")
  10657. ]),
  10658. vue.createElementVNode("view", { class: "card-body" }, [
  10659. vue.createElementVNode("text", { class: "msg-text" }, "你收到一个新订单,请及时查看并接单。")
  10660. ]),
  10661. vue.createElementVNode("view", { class: "card-footer" }, [
  10662. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503523"),
  10663. vue.createElementVNode("image", {
  10664. class: "arrow-icon",
  10665. src: _imports_3
  10666. })
  10667. ])
  10668. ])
  10669. ]),
  10670. vue.createElementVNode("view", { class: "msg-group" }, [
  10671. vue.createElementVNode("view", { class: "date-label" }, "2099-12-27"),
  10672. vue.createElementVNode("view", { class: "msg-card" }, [
  10673. vue.createElementVNode("view", { class: "card-header" }, [
  10674. vue.createElementVNode("text", { class: "card-title" }, "系统取消派单")
  10675. ]),
  10676. vue.createElementVNode("view", { class: "card-body" }, [
  10677. vue.createElementVNode("text", { class: "msg-text" }, "订单由于超时未接单已被系统取消。")
  10678. ]),
  10679. vue.createElementVNode("view", { class: "card-footer" }, [
  10680. vue.createElementVNode("text", { class: "order-id" }, "订单: 2099091503111"),
  10681. vue.createElementVNode("image", {
  10682. class: "arrow-icon",
  10683. src: _imports_3
  10684. })
  10685. ])
  10686. ])
  10687. ])
  10688. ]);
  10689. }
  10690. 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"]]);
  10691. const _sfc_main$4 = {
  10692. methods: {
  10693. navBack() {
  10694. uni.navigateBack();
  10695. },
  10696. navToDetail() {
  10697. uni.navigateTo({
  10698. url: "/pages/mine/message/detail"
  10699. });
  10700. }
  10701. }
  10702. };
  10703. function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
  10704. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10705. vue.createElementVNode("view", { class: "nav-bar" }, [
  10706. vue.createElementVNode("view", {
  10707. class: "nav-left",
  10708. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10709. }, [
  10710. vue.createElementVNode("image", {
  10711. class: "back-icon",
  10712. src: _imports_0,
  10713. style: { "transform": "rotate(180deg)" }
  10714. })
  10715. ]),
  10716. vue.createElementVNode("text", { class: "nav-title" }, "系统消息"),
  10717. vue.createElementVNode("view", { class: "nav-right" })
  10718. ]),
  10719. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10720. vue.createElementVNode("view", { class: "sys-msg-list" }, [
  10721. vue.createElementVNode("view", { class: "date-label" }, "2023-11-01"),
  10722. vue.createElementVNode("view", {
  10723. class: "sys-card",
  10724. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10725. }, [
  10726. vue.createElementVNode("view", { class: "sys-header" }, [
  10727. vue.createElementVNode("text", { class: "sys-title" }, "账号审核通过"),
  10728. vue.createElementVNode("view", { class: "red-dot" })
  10729. ]),
  10730. vue.createElementVNode("view", { class: "sys-content" }, [
  10731. vue.createElementVNode("text", { class: "sys-text" }, "恭喜,您的健康证已通过审核,现在可以开始接单了。")
  10732. ]),
  10733. vue.createElementVNode("view", { class: "sys-footer" }, [
  10734. vue.createElementVNode("text", { class: "sys-time" }, "10:00"),
  10735. vue.createElementVNode("view", { class: "check-more" }, [
  10736. vue.createElementVNode("text", null, "查看详情"),
  10737. vue.createElementVNode("image", {
  10738. class: "arrow-icon-small",
  10739. src: _imports_3
  10740. })
  10741. ])
  10742. ])
  10743. ]),
  10744. vue.createElementVNode("view", { class: "sys-card" }, [
  10745. vue.createElementVNode("view", { class: "sys-header" }, [
  10746. vue.createElementVNode("text", { class: "sys-title" }, "活动奖励到账")
  10747. ]),
  10748. vue.createElementVNode("view", { class: "sys-content" }, [
  10749. vue.createElementVNode("text", { class: "sys-text" }, "您参与的“新手启航”活动奖励金 ¥50 已发放到您的账户。")
  10750. ]),
  10751. vue.createElementVNode("view", { class: "sys-footer" }, [
  10752. vue.createElementVNode("text", { class: "sys-time" }, "09:15"),
  10753. vue.createElementVNode("view", { class: "check-more" }, [
  10754. vue.createElementVNode("text", null, "查看详情"),
  10755. vue.createElementVNode("image", {
  10756. class: "arrow-icon-small",
  10757. src: _imports_3
  10758. })
  10759. ])
  10760. ])
  10761. ]),
  10762. vue.createElementVNode("view", { class: "date-label" }, "2023-10-30"),
  10763. vue.createElementVNode("view", { class: "sys-card" }, [
  10764. vue.createElementVNode("view", { class: "sys-header" }, [
  10765. vue.createElementVNode("text", { class: "sys-title" }, "系统维护通知")
  10766. ]),
  10767. vue.createElementVNode("view", { class: "sys-content" }, [
  10768. vue.createElementVNode("text", { class: "sys-text" }, "平台将于 11月5日 凌晨 02:00-04:00 进行系统维护,届时将无法接单。")
  10769. ]),
  10770. vue.createElementVNode("view", { class: "sys-footer" }, [
  10771. vue.createElementVNode("text", { class: "sys-time" }, "18:30"),
  10772. vue.createElementVNode("view", { class: "check-more" }, [
  10773. vue.createElementVNode("text", null, "查看详情"),
  10774. vue.createElementVNode("image", {
  10775. class: "arrow-icon-small",
  10776. src: _imports_3
  10777. })
  10778. ])
  10779. ])
  10780. ])
  10781. ])
  10782. ]);
  10783. }
  10784. 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"]]);
  10785. const _sfc_main$3 = {
  10786. methods: {
  10787. navBack() {
  10788. uni.navigateBack();
  10789. }
  10790. }
  10791. };
  10792. function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
  10793. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10794. vue.createElementVNode("view", { class: "nav-bar" }, [
  10795. vue.createElementVNode("view", {
  10796. class: "nav-left",
  10797. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10798. }, [
  10799. vue.createElementVNode("image", {
  10800. class: "back-icon",
  10801. src: _imports_0,
  10802. style: { "transform": "rotate(180deg)" }
  10803. })
  10804. ]),
  10805. vue.createElementVNode("text", { class: "nav-title" }, "消息详情"),
  10806. vue.createElementVNode("view", { class: "nav-right" })
  10807. ]),
  10808. vue.createElementVNode("view", { class: "nav-placeholder" }),
  10809. vue.createElementVNode("view", { class: "detail-content" }, [
  10810. vue.createElementVNode("text", { class: "detail-title" }, "账号审核通过"),
  10811. vue.createElementVNode("text", { class: "detail-time" }, "2023-11-01 10:00"),
  10812. vue.createElementVNode("view", { class: "detail-body" }, [
  10813. vue.createElementVNode("text", null, "尊敬的用户,您的健康认证资料已通过平台审核。作为履约者,您现在可以正常接收并处理订单。请确保您熟读平台规则,遵守交通法规,安全配送。祝您工作愉快!")
  10814. ]),
  10815. vue.createElementVNode("view", { class: "detail-footer" }, [
  10816. vue.createElementVNode("view", { class: "divider" }),
  10817. vue.createElementVNode("text", { class: "footer-text" }, "如有疑问,请咨询在线客服。")
  10818. ])
  10819. ])
  10820. ]);
  10821. }
  10822. 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"]]);
  10823. const _imports_1 = "/static/icons/diamond_white.svg";
  10824. const _imports_2 = "/static/icons/star_decor.svg";
  10825. const _sfc_main$2 = {
  10826. data() {
  10827. return {
  10828. currentTab: 0,
  10829. list: [
  10830. {
  10831. title: "订单完成奖励",
  10832. desc: "订单 T1002839 完成",
  10833. time: "2026-02-05 18:42",
  10834. amount: "10",
  10835. type: "income",
  10836. tag: "订单"
  10837. },
  10838. {
  10839. title: "好评奖励",
  10840. desc: "获得五星好评",
  10841. time: "2026-02-05 19:00",
  10842. amount: "5",
  10843. type: "income",
  10844. tag: "奖励"
  10845. },
  10846. {
  10847. title: "超时扣分",
  10848. desc: "订单 T1002830 超时送达",
  10849. time: "2026-02-04 10:20",
  10850. amount: "-10",
  10851. type: "expense",
  10852. tag: "惩罚"
  10853. }
  10854. ]
  10855. };
  10856. },
  10857. computed: {
  10858. displayList() {
  10859. if (this.currentTab === 0)
  10860. return this.list;
  10861. const type = this.currentTab === 1 ? "income" : "expense";
  10862. return this.list.filter((item) => item.type === type);
  10863. }
  10864. },
  10865. methods: {
  10866. navBack() {
  10867. uni.navigateBack();
  10868. },
  10869. navToDetail() {
  10870. uni.navigateTo({
  10871. url: "/pages/mine/points/detail"
  10872. });
  10873. },
  10874. navToEquity() {
  10875. },
  10876. switchTab(index) {
  10877. this.currentTab = index;
  10878. }
  10879. }
  10880. };
  10881. function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
  10882. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  10883. vue.createElementVNode("view", { class: "nav-bar" }, [
  10884. vue.createElementVNode("view", {
  10885. class: "nav-left",
  10886. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  10887. }, [
  10888. vue.createElementVNode("image", {
  10889. class: "back-icon",
  10890. src: _imports_0
  10891. })
  10892. ]),
  10893. vue.createElementVNode("text", { class: "nav-title" }, "我的积分"),
  10894. vue.createElementVNode("view", { class: "nav-right" })
  10895. ]),
  10896. vue.createElementVNode("view", { class: "points-card" }, [
  10897. vue.createElementVNode("view", { class: "card-header" }, [
  10898. vue.createElementVNode("view", {
  10899. class: "equity-btn",
  10900. onClick: _cache[1] || (_cache[1] = (...args) => $options.navToEquity && $options.navToEquity(...args))
  10901. }, [
  10902. vue.createElementVNode("image", {
  10903. class: "equity-icon",
  10904. src: _imports_1
  10905. }),
  10906. vue.createElementVNode("text", null, "积分权益")
  10907. ]),
  10908. vue.createElementVNode("view", {
  10909. class: "detail-link",
  10910. onClick: _cache[2] || (_cache[2] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10911. }, [
  10912. vue.createElementVNode("text", null, "明细")
  10913. ])
  10914. ]),
  10915. vue.createElementVNode("view", { class: "card-body" }, [
  10916. vue.createElementVNode("text", { class: "label" }, "当前积分"),
  10917. vue.createElementVNode("text", { class: "value" }, "1200")
  10918. ]),
  10919. vue.createElementVNode("image", {
  10920. class: "bg-decor",
  10921. src: _imports_2,
  10922. mode: "aspectFit"
  10923. })
  10924. ]),
  10925. vue.createElementVNode("view", { class: "record-container" }, [
  10926. vue.createElementVNode("view", { class: "record-header" }, [
  10927. vue.createElementVNode("text", { class: "header-title" }, "最近积分变动"),
  10928. vue.createElementVNode("view", {
  10929. class: "header-more",
  10930. onClick: _cache[3] || (_cache[3] = (...args) => $options.navToDetail && $options.navToDetail(...args))
  10931. }, [
  10932. vue.createElementVNode("text", null, "查看全部"),
  10933. vue.createElementVNode("image", {
  10934. class: "more-icon",
  10935. src: _imports_3
  10936. })
  10937. ])
  10938. ]),
  10939. vue.createElementVNode("view", { class: "tabs-row" }, [
  10940. vue.createElementVNode(
  10941. "view",
  10942. {
  10943. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  10944. onClick: _cache[4] || (_cache[4] = ($event) => $options.switchTab(0))
  10945. },
  10946. [
  10947. vue.createElementVNode("text", null, "全部"),
  10948. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  10949. key: 0,
  10950. class: "tab-line"
  10951. })) : vue.createCommentVNode("v-if", true)
  10952. ],
  10953. 2
  10954. /* CLASS */
  10955. ),
  10956. vue.createElementVNode(
  10957. "view",
  10958. {
  10959. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  10960. onClick: _cache[5] || (_cache[5] = ($event) => $options.switchTab(1))
  10961. },
  10962. [
  10963. vue.createElementVNode("text", null, "获取"),
  10964. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  10965. key: 0,
  10966. class: "tab-line"
  10967. })) : vue.createCommentVNode("v-if", true)
  10968. ],
  10969. 2
  10970. /* CLASS */
  10971. ),
  10972. vue.createElementVNode(
  10973. "view",
  10974. {
  10975. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  10976. onClick: _cache[6] || (_cache[6] = ($event) => $options.switchTab(2))
  10977. },
  10978. [
  10979. vue.createElementVNode("text", null, "扣减"),
  10980. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  10981. key: 0,
  10982. class: "tab-line"
  10983. })) : vue.createCommentVNode("v-if", true)
  10984. ],
  10985. 2
  10986. /* CLASS */
  10987. )
  10988. ]),
  10989. vue.createElementVNode("view", { class: "record-list" }, [
  10990. (vue.openBlock(true), vue.createElementBlock(
  10991. vue.Fragment,
  10992. null,
  10993. vue.renderList($options.displayList, (item, index) => {
  10994. return vue.openBlock(), vue.createElementBlock("view", {
  10995. class: "list-item",
  10996. key: index
  10997. }, [
  10998. vue.createElementVNode("view", { class: "item-left" }, [
  10999. vue.createElementVNode(
  11000. "text",
  11001. { class: "item-title" },
  11002. vue.toDisplayString(item.title),
  11003. 1
  11004. /* TEXT */
  11005. ),
  11006. vue.createElementVNode(
  11007. "text",
  11008. { class: "item-desc" },
  11009. vue.toDisplayString(item.desc),
  11010. 1
  11011. /* TEXT */
  11012. ),
  11013. vue.createElementVNode(
  11014. "text",
  11015. { class: "item-time" },
  11016. vue.toDisplayString(item.time),
  11017. 1
  11018. /* TEXT */
  11019. )
  11020. ]),
  11021. vue.createElementVNode("view", { class: "item-right" }, [
  11022. vue.createElementVNode(
  11023. "text",
  11024. {
  11025. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  11026. },
  11027. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  11028. 3
  11029. /* TEXT, CLASS */
  11030. ),
  11031. vue.createElementVNode("view", { class: "item-tag" }, [
  11032. vue.createElementVNode(
  11033. "text",
  11034. null,
  11035. vue.toDisplayString(item.tag),
  11036. 1
  11037. /* TEXT */
  11038. )
  11039. ])
  11040. ])
  11041. ]);
  11042. }),
  11043. 128
  11044. /* KEYED_FRAGMENT */
  11045. ))
  11046. ])
  11047. ])
  11048. ]);
  11049. }
  11050. 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"]]);
  11051. const _sfc_main$1 = {
  11052. data() {
  11053. return {
  11054. currentTab: 0,
  11055. // 模拟数据结构
  11056. groups: [
  11057. {
  11058. month: "2月 2026",
  11059. income: "15",
  11060. expense: "10",
  11061. items: [
  11062. {
  11063. title: "订单完成奖励",
  11064. desc: "订单完成",
  11065. time: "02-05 18:42",
  11066. amount: "10",
  11067. type: "income",
  11068. tag: "订单"
  11069. },
  11070. {
  11071. title: "好评奖励",
  11072. desc: "五星好评",
  11073. time: "02-05 19:00",
  11074. amount: "5",
  11075. type: "income",
  11076. tag: "奖励"
  11077. },
  11078. {
  11079. title: "超时扣分",
  11080. desc: "订单超时",
  11081. time: "02-04 10:20",
  11082. amount: "-10",
  11083. type: "expense",
  11084. tag: "惩罚"
  11085. }
  11086. ]
  11087. },
  11088. {
  11089. month: "1月 2026",
  11090. income: "100",
  11091. expense: "0",
  11092. items: [
  11093. {
  11094. title: "新用户奖励",
  11095. desc: "注册赠送",
  11096. time: "01-10 09:00",
  11097. amount: "100",
  11098. type: "income",
  11099. tag: "系统"
  11100. }
  11101. ]
  11102. }
  11103. ]
  11104. };
  11105. },
  11106. computed: {
  11107. displayGroups() {
  11108. if (this.currentTab === 0)
  11109. return this.groups;
  11110. return this.groups.map((group) => {
  11111. const filteredItems = group.items.filter((item) => {
  11112. const type = this.currentTab === 1 ? "income" : "expense";
  11113. return item.type === type;
  11114. });
  11115. return {
  11116. ...group,
  11117. items: filteredItems
  11118. };
  11119. }).filter((group) => group.items.length > 0);
  11120. }
  11121. },
  11122. methods: {
  11123. navBack() {
  11124. uni.navigateBack();
  11125. },
  11126. switchTab(index) {
  11127. this.currentTab = index;
  11128. }
  11129. }
  11130. };
  11131. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  11132. return vue.openBlock(), vue.createElementBlock("view", { class: "container" }, [
  11133. vue.createElementVNode("view", { class: "nav-bar" }, [
  11134. vue.createElementVNode("view", {
  11135. class: "nav-left",
  11136. onClick: _cache[0] || (_cache[0] = (...args) => $options.navBack && $options.navBack(...args))
  11137. }, [
  11138. vue.createElementVNode("image", {
  11139. class: "back-icon",
  11140. src: _imports_0
  11141. })
  11142. ]),
  11143. vue.createElementVNode("text", { class: "nav-title" }, "积分明细"),
  11144. vue.createElementVNode("view", { class: "nav-right" })
  11145. ]),
  11146. vue.createElementVNode("view", { class: "content-area" }, [
  11147. vue.createElementVNode("view", { class: "tabs-row" }, [
  11148. vue.createElementVNode(
  11149. "view",
  11150. {
  11151. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 0 }]),
  11152. onClick: _cache[1] || (_cache[1] = ($event) => $options.switchTab(0))
  11153. },
  11154. [
  11155. vue.createElementVNode("text", null, "全部"),
  11156. $data.currentTab === 0 ? (vue.openBlock(), vue.createElementBlock("view", {
  11157. key: 0,
  11158. class: "tab-line"
  11159. })) : vue.createCommentVNode("v-if", true)
  11160. ],
  11161. 2
  11162. /* CLASS */
  11163. ),
  11164. vue.createElementVNode(
  11165. "view",
  11166. {
  11167. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 1 }]),
  11168. onClick: _cache[2] || (_cache[2] = ($event) => $options.switchTab(1))
  11169. },
  11170. [
  11171. vue.createElementVNode("text", null, "获取"),
  11172. $data.currentTab === 1 ? (vue.openBlock(), vue.createElementBlock("view", {
  11173. key: 0,
  11174. class: "tab-line"
  11175. })) : vue.createCommentVNode("v-if", true)
  11176. ],
  11177. 2
  11178. /* CLASS */
  11179. ),
  11180. vue.createElementVNode(
  11181. "view",
  11182. {
  11183. class: vue.normalizeClass(["tab-item", { active: $data.currentTab === 2 }]),
  11184. onClick: _cache[3] || (_cache[3] = ($event) => $options.switchTab(2))
  11185. },
  11186. [
  11187. vue.createElementVNode("text", null, "扣减"),
  11188. $data.currentTab === 2 ? (vue.openBlock(), vue.createElementBlock("view", {
  11189. key: 0,
  11190. class: "tab-line"
  11191. })) : vue.createCommentVNode("v-if", true)
  11192. ],
  11193. 2
  11194. /* CLASS */
  11195. )
  11196. ]),
  11197. vue.createElementVNode("scroll-view", {
  11198. "scroll-y": "",
  11199. class: "bill-list"
  11200. }, [
  11201. (vue.openBlock(true), vue.createElementBlock(
  11202. vue.Fragment,
  11203. null,
  11204. vue.renderList($options.displayGroups, (group, gIndex) => {
  11205. return vue.openBlock(), vue.createElementBlock("view", {
  11206. key: gIndex,
  11207. class: "month-group"
  11208. }, [
  11209. vue.createElementVNode("view", { class: "group-header" }, [
  11210. vue.createElementVNode(
  11211. "text",
  11212. { class: "month-title" },
  11213. vue.toDisplayString(group.month),
  11214. 1
  11215. /* TEXT */
  11216. ),
  11217. vue.createElementVNode(
  11218. "text",
  11219. { class: "month-summary" },
  11220. "获取 " + vue.toDisplayString(group.income) + " 扣减 " + vue.toDisplayString(group.expense),
  11221. 1
  11222. /* TEXT */
  11223. )
  11224. ]),
  11225. (vue.openBlock(true), vue.createElementBlock(
  11226. vue.Fragment,
  11227. null,
  11228. vue.renderList(group.items, (item, index) => {
  11229. return vue.openBlock(), vue.createElementBlock("view", {
  11230. class: "list-item",
  11231. key: index
  11232. }, [
  11233. vue.createElementVNode(
  11234. "view",
  11235. {
  11236. class: vue.normalizeClass(["item-icon-box", item.type])
  11237. },
  11238. [
  11239. vue.createElementVNode(
  11240. "text",
  11241. { class: "item-icon-symbol" },
  11242. vue.toDisplayString(item.type === "income" ? "+" : "-"),
  11243. 1
  11244. /* TEXT */
  11245. )
  11246. ],
  11247. 2
  11248. /* CLASS */
  11249. ),
  11250. vue.createElementVNode("view", { class: "item-center" }, [
  11251. vue.createElementVNode(
  11252. "text",
  11253. { class: "item-title" },
  11254. vue.toDisplayString(item.title),
  11255. 1
  11256. /* TEXT */
  11257. ),
  11258. vue.createElementVNode(
  11259. "text",
  11260. { class: "item-desc" },
  11261. vue.toDisplayString(item.time) + " " + vue.toDisplayString(item.desc),
  11262. 1
  11263. /* TEXT */
  11264. )
  11265. ]),
  11266. vue.createElementVNode("view", { class: "item-right" }, [
  11267. vue.createElementVNode(
  11268. "text",
  11269. {
  11270. class: vue.normalizeClass(["item-amount", { income: item.type === "income", expense: item.type === "expense" }])
  11271. },
  11272. vue.toDisplayString(item.type === "income" ? "+" : "") + vue.toDisplayString(item.amount),
  11273. 3
  11274. /* TEXT, CLASS */
  11275. ),
  11276. vue.createElementVNode("view", { class: "item-tag" }, [
  11277. vue.createElementVNode(
  11278. "text",
  11279. null,
  11280. vue.toDisplayString(item.tag),
  11281. 1
  11282. /* TEXT */
  11283. )
  11284. ])
  11285. ])
  11286. ]);
  11287. }),
  11288. 128
  11289. /* KEYED_FRAGMENT */
  11290. ))
  11291. ]);
  11292. }),
  11293. 128
  11294. /* KEYED_FRAGMENT */
  11295. )),
  11296. vue.createElementVNode("view", { class: "list-padding-bottom" })
  11297. ])
  11298. ])
  11299. ]);
  11300. }
  11301. const PagesMinePointsDetail = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/pages/mine/points/detail.vue"]]);
  11302. __definePage("pages/login/login", PagesLoginLogin);
  11303. __definePage("pages/recruit/landing", PagesRecruitLanding);
  11304. __definePage("pages/recruit/form", PagesRecruitForm);
  11305. __definePage("pages/recruit/auth", PagesRecruitAuth);
  11306. __definePage("pages/recruit/qualifications", PagesRecruitQualifications);
  11307. __definePage("pages/recruit/success", PagesRecruitSuccess);
  11308. __definePage("pages/login/reset-pwd-verify", PagesLoginResetPwdVerify);
  11309. __definePage("pages/login/reset-pwd-set", PagesLoginResetPwdSet);
  11310. __definePage("pages/home/index", PagesHomeIndex);
  11311. __definePage("pages/home/work-status", PagesHomeWorkStatus);
  11312. __definePage("pages/orders/index", PagesOrdersIndex);
  11313. __definePage("pages/orders/detail", PagesOrdersDetail);
  11314. __definePage("pages/orders/anomaly", PagesOrdersAnomaly);
  11315. __definePage("pages/mine/order-stats", PagesMineOrderStats);
  11316. __definePage("pages/mine/rewards", PagesMineRewards);
  11317. __definePage("pages/mine/rewards-all", PagesMineRewardsAll);
  11318. __definePage("pages/mine/index", PagesMineIndex);
  11319. __definePage("pages/mine/settings/index", PagesMineSettingsIndex);
  11320. __definePage("pages/mine/settings/profile/index", PagesMineSettingsProfileIndex);
  11321. __definePage("pages/mine/settings/auth/index", PagesMineSettingsAuthIndex);
  11322. __definePage("pages/mine/settings/auth/edit", PagesMineSettingsAuthEdit);
  11323. __definePage("pages/mine/settings/bank/index", PagesMineSettingsBankIndex);
  11324. __definePage("pages/mine/settings/security/index", PagesMineSettingsSecurityIndex);
  11325. __definePage("pages/mine/settings/profile/edit-name", PagesMineSettingsProfileEditName);
  11326. __definePage("pages/mine/settings/security/change-password", PagesMineSettingsSecurityChangePassword);
  11327. __definePage("pages/mine/settings/security/change-phone", PagesMineSettingsSecurityChangePhone);
  11328. __definePage("pages/mine/settings/notification/index", PagesMineSettingsNotificationIndex);
  11329. __definePage("pages/mine/settings/about/index", PagesMineSettingsAboutIndex);
  11330. __definePage("pages/mine/wallet/index", PagesMineWalletIndex);
  11331. __definePage("pages/mine/wallet/bill", PagesMineWalletBill);
  11332. __definePage("pages/mine/level/index", PagesMineLevelIndex);
  11333. __definePage("pages/mine/message/index", PagesMineMessageIndex);
  11334. __definePage("pages/mine/message/order", PagesMineMessageOrder);
  11335. __definePage("pages/mine/message/system", PagesMineMessageSystem);
  11336. __definePage("pages/mine/message/detail", PagesMineMessageDetail);
  11337. __definePage("pages/mine/points/index", PagesMinePointsIndex);
  11338. __definePage("pages/mine/points/detail", PagesMinePointsDetail);
  11339. const _sfc_main = {
  11340. onLaunch: function() {
  11341. formatAppLog("log", "at App.vue:4", "App Launch");
  11342. },
  11343. onShow: function() {
  11344. formatAppLog("log", "at App.vue:7", "App Show");
  11345. },
  11346. onHide: function() {
  11347. formatAppLog("log", "at App.vue:10", "App Hide");
  11348. }
  11349. };
  11350. const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "E:/CodeProjects/Cursor/pet-system-fulfiller-app/App.vue"]]);
  11351. function createApp() {
  11352. const app = vue.createVueApp(App);
  11353. return {
  11354. app
  11355. };
  11356. }
  11357. const { app: __app__, Vuex: __Vuex__, Pinia: __Pinia__ } = createApp();
  11358. uni.Vuex = __Vuex__;
  11359. uni.Pinia = __Pinia__;
  11360. __app__.provide("__globalStyles", __uniConfig.styles);
  11361. __app__._component.mpType = "app";
  11362. __app__._component.render = () => {
  11363. };
  11364. __app__.mount("#app");
  11365. })(Vue);