MOrder.Class.php 361 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925
  1. <?php
  2. /**
  3. * 订单数据模型
  4. * Created by PhpStorm.
  5. * User: XiaoMing
  6. * Date: 2019/10/31
  7. * Time: 15:53
  8. */
  9. namespace JinDouYun\Model\Order;
  10. use JinDouYun\Controller\System\Driver;
  11. use JinDouYun\Model\System\MDriver;
  12. use Mall\Framework\Core\StatusCode;
  13. use Mall\Framework\Core\ErrorCode;
  14. use Mall\Framework\Core\ResultWrapper;
  15. use Mall\Framework\Factory;
  16. use JinDouYun\Cache\ActivityLimitCache;
  17. use JinDouYun\Cache\CustomerCache;
  18. use JinDouYun\Cache\OverviewCache;
  19. use JinDouYun\Cache\SystemCache;
  20. use JinDouYun\Cache\Stock;
  21. use JinDouYun\Cache\EnterpriseCache;
  22. use JinDouYun\Controller\Common\CloudPrint;
  23. use JinDouYun\Controller\Common\Logger;
  24. use JinDouYun\Dao\Order\DOrderReceive;
  25. use JinDouYun\Dao\Order\DOrderIndex;
  26. use JinDouYun\Dao\Order\DOrder;
  27. use JinDouYun\Dao\Order\DOrderGoods;
  28. use JinDouYun\Dao\Order\DOrderStatistics;
  29. use JinDouYun\Dao\Cashier\DCashierCustomerPrice;
  30. use JinDouYun\Dao\Customer\DCustomer;
  31. use JinDouYun\Dao\Department\DStaff;
  32. use JinDouYun\Dao\System\DCustomerSource;
  33. use JinDouYun\Dao\System\DExpressCode;
  34. use JinDouYun\Dao\UserCenter\DUserCenter;
  35. use JinDouYun\Dao\Finance\DReceivedIndex;
  36. use JinDouYun\Model\System\MBasicSetup;
  37. use JinDouYun\Model\Finance\MCustomerBalance;
  38. use JinDouYun\Model\System\MPaymentSetting;
  39. use JinDouYun\Model\Market\MUserCoupon;
  40. use JinDouYun\Model\MBaseModel;
  41. use JinDouYun\Model\Log\MOrderLog;
  42. use JinDouYun\Model\GoodsManage\MSku;
  43. use JinDouYun\Model\Shop\MShop;
  44. use JinDouYun\Model\Customer\MShippingAddress;
  45. use JinDouYun\Model\Cart\MCart;
  46. use JinDouYun\Model\Stock\MInventory;
  47. use JinDouYun\Model\Stock\MInventoryOut;
  48. use JinDouYun\Model\Stock\MWarehouse;
  49. use JinDouYun\Model\Customer\MCustomer;
  50. use JinDouYun\Model\Goods\MGoods;
  51. use JinDouYun\Model\Finance\MAccount;
  52. use JinDouYun\Model\Finance\MReceived;
  53. use JinDouYun\Model\SysAreaChina\MSysAreaChina;
  54. use JinDouYun\Model\Customer\MMemberBalanceDetail;
  55. use JinDouYun\Model\Cashier\MCashier;
  56. use JinDouYun\Model\Cashier\MCashierCart;
  57. use JinDouYun\Model\Department\MStaff;
  58. use JinDouYun\Model\Finance\MMerchantFlow;
  59. use JinDouYun\Model\Finance\MReceive;
  60. use JinDouYun\Model\Finance\MRefund;
  61. use JinDouYun\Model\System\MDeliverySetting;
  62. use JinDouYun\Model\System\MPrintNum;
  63. use JinDouYun\Model\System\MProcessSetting;
  64. use JinDouYun\Model\Order\MPay;
  65. use JinDouYun\Model\GoodsManage\MGoodsBasic;
  66. use JinDouYun\Model\Merchant\MMerchantSettlement;
  67. use JinDouYun\Model\System\MSystemPushMessage;
  68. use Util\KDNiao\KDNiaoQuery;
  69. use Util\KuaiDi100\Query;
  70. use Util\WeiXin\Pay;
  71. use Util\AliPay\Pay as aliPay;
  72. use Util\ByteDance\Pay as bytePay;
  73. //use Util\Common\PartnerTools;
  74. class MOrder extends MBaseModel
  75. {
  76. /**
  77. * @var DOrder
  78. */
  79. private $objDOrder;
  80. /**
  81. * @var int 用户id
  82. */
  83. private $onlineUserId;
  84. /**
  85. * @var int 企业id
  86. */
  87. private $onlineEnterpriseId;
  88. /**
  89. * @var int 单表数据量
  90. */
  91. private $cutTable = 500000;
  92. /**
  93. * @var DOrderIndex
  94. */
  95. private $objDOrderIndex;
  96. /**
  97. * @var DOrderGoods
  98. */
  99. private $objDOrderGoods;
  100. /**
  101. * @var DOrderStatistics
  102. */
  103. private $objDOrderStatistics;
  104. /**
  105. * @var bool
  106. */
  107. private $isFront;//是否是前台调用此Model 前台=>true
  108. /**
  109. * @var OverviewCache
  110. */
  111. private $objOverviewCache;
  112. /**
  113. * @var string
  114. */
  115. private $orderStatisticsTableName = 'order_statistics';
  116. /**
  117. * @var MAccount
  118. */
  119. private $objMAccount;
  120. /**
  121. * @var MReceived
  122. */
  123. private $objMReceived;
  124. /**
  125. * @var ActivityLimitCache
  126. */
  127. private $objActivityLimitCache;
  128. /**
  129. * @var SaleOrder 销售单
  130. */
  131. private $objSaleOrder;
  132. /**
  133. * @var bool 销售单是否打印小票
  134. */
  135. private $isEnablePrint = false;
  136. /**
  137. * @var DOrderReceive
  138. */
  139. private $objDOrderReceive;
  140. /**
  141. * @var DCustomer
  142. */
  143. private $objDCustomer;
  144. /**
  145. * @var int
  146. */
  147. private $loginUserCenterId;
  148. /**
  149. * @var array
  150. */
  151. private $expressMap = [
  152. 'express_hundred' => 'kuaidi100',
  153. 'express_bird' => 'kdniao'
  154. ];
  155. /**
  156. * @var bool
  157. */
  158. private $isCashier;
  159. /**
  160. * @var MProcessSetting
  161. */
  162. private $objMProcessSetting;
  163. use TStdOrder;
  164. /**
  165. * MOrder constructor.
  166. * @param $onlineUserId
  167. * @param $onlineEnterpriseId
  168. * @param null $loginUserCenterId
  169. * @param bool $isFront
  170. * @throws \Exception
  171. */
  172. public function __construct($onlineUserId, $onlineEnterpriseId, $loginUserCenterId = null, $isFront = false, $isCashier = false)
  173. {
  174. $this->isCashier = $isCashier;
  175. $this->isFront = $isFront;
  176. $this->onlineUserId = $onlineUserId;
  177. $this->onlineEnterpriseId = $onlineEnterpriseId;
  178. $this->loginUserCenterId = $loginUserCenterId;
  179. parent::__construct($this->onlineEnterpriseId, $loginUserCenterId);
  180. $this->objDOrder = new DOrder('default');
  181. self::orderSubTable($onlineEnterpriseId, $onlineUserId);
  182. $this->objDOrderIndex = new DOrderIndex();
  183. $this->objDOrderGoods = new DOrderGoods('default');
  184. $this->objDOrderReceive = new DOrderReceive();
  185. $this->objDOrderStatistics = new DOrderStatistics('default');
  186. $this->objMAccount = new MAccount($onlineEnterpriseId, $onlineUserId);
  187. $this->objMReceived = new MReceived($onlineEnterpriseId, $onlineUserId);
  188. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  189. $this->objDOrderStatistics->setTable($this->objDOrderStatistics->get_Table() . '_' . $this->onlineEnterpriseId);
  190. $this->objDOrder->setSearchIndex('order_search')->setType('order');
  191. $this->objActivityLimitCache = new ActivityLimitCache($this->onlineEnterpriseId);
  192. $this->objOverviewCache = new OverviewCache();
  193. $this->objSaleOrder = new SaleOrder();
  194. $this->objDCustomer = new DCustomer();
  195. $this->objDCustomer->setTable('qianniao_customer_' . $this->onlineEnterpriseId);
  196. $this->objMProcessSetting = new MProcessSetting($this->onlineEnterpriseId);
  197. }
  198. /**
  199. * 订单分表 分表规则:企业id_(客户/200000)
  200. * @param $enterpriseId (企业id)
  201. * @param $userId (用户id)
  202. * @throws \Exception
  203. */
  204. public function orderSubTable($enterpriseId, $userId)
  205. {
  206. $tableName = $this->objDOrder->getTableName('qianniao_order_' . $enterpriseId, $userId, $this->cutTable);
  207. self::existsTable($tableName);
  208. $this->objDOrder->setTable($tableName);
  209. }
  210. /**
  211. * 获取订单表表名
  212. */
  213. public function getOrderTable($enterpriseId, $userId){
  214. return $this->objDOrder->getTableName('qianniao_order_' . $enterpriseId, $userId, $this->cutTable);
  215. }
  216. /**
  217. * 统计订单信息
  218. *
  219. * @param $data
  220. * @param $className
  221. */
  222. private static function noticeStatistics($data, $className)
  223. {
  224. $i = 1;
  225. do {
  226. $postData = [
  227. 'topicName' => 'MyJob',
  228. 'topicClass' => "Jobs\Model\MTopic\Order\\" . $className,
  229. 'topicMethon' => 'push',
  230. 'topicMethonParams' => [
  231. 'userCenterId' => $data['userCenterId'],
  232. 'enterpriseId' => $data['enterpriseId'],
  233. 'customerId' => $data['customerId'],
  234. 'no' => $data['no'],
  235. 'noticeType' => $data['noticeType'],
  236. ],
  237. ];
  238. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  239. $result = request($url, $postData);
  240. $i++;
  241. } while ($result['httpcode'] != 200 && $i <= 3);
  242. }
  243. /**
  244. * 分表后缀+月日+订单id
  245. * @param $orderId
  246. * @return string
  247. */
  248. private function createVerifyCode($orderId)
  249. {
  250. $fix = ceil($this->onlineUserId / $this->cutTable);
  251. return $fix . '-' . date('nj') . '-' . $orderId;
  252. }
  253. /**
  254. * Doc: (des="")
  255. * User: XMing
  256. * Date: 2020/12/25
  257. * Time: 2:11 下午
  258. * @param $data
  259. * @return ResultWrapper
  260. */
  261. public function checkLimit($data)
  262. {
  263. foreach ($data as $goods) {
  264. if (isset($goods['activityId'])) {
  265. //获取活动商品剩余数量
  266. $surplusNum = $this->objActivityLimitCache->getLen($goods['activityId'], $goods['goodsId'], $goods['skuId']);
  267. if ($surplusNum < $goods['buyNum']) {
  268. return ResultWrapper::fail($goods['title'] . '活动剩余数量不足', ErrorCode::$paramError);
  269. }
  270. }
  271. }
  272. return ResultWrapper::success($data);
  273. }
  274. /**
  275. * Doc: (des="订单编辑")
  276. * User: XMing
  277. * Date: 2020/11/5
  278. * Time: 10:07 上午
  279. * @param array $params
  280. * @param $id
  281. * @return ResultWrapper
  282. * @throws \Exception
  283. */
  284. public function edit(array $params, $id): ResultWrapper
  285. {
  286. $orderIndex = $this->objDOrderIndex->get($id);
  287. if ($orderIndex === false) {
  288. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  289. }
  290. if (empty($orderIndex)) {
  291. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  292. }
  293. /*if ($orderIndex['payStatus'] == StatusCode::$standard) {
  294. return ResultWrapper::fail('订单已支付,不能编辑', ErrorCode::$paramError);
  295. }
  296. if ($orderIndex['auditStatus'] != StatusCode::$auditStatus['auditing']) {
  297. return ResultWrapper::fail('订单已审核不能编辑', ErrorCode::$paramError);
  298. }*/
  299. if (
  300. in_array($orderIndex['orderStatus'], [StatusCode::$orderStatus['waitReceive'], StatusCode::$orderStatus['finish'], StatusCode::$orderStatus['close']])
  301. ) {
  302. return ResultWrapper::fail('此订单不能编辑', ErrorCode::$paramError);
  303. }
  304. $fix = ceil((empty($params['userCenterId']) ? 1 : $params['userCenterId']) / $this->cutTable);
  305. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  306. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $fix);
  307. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  308. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  309. $customerResult = self::getCustomerInfoByUserCenterId($params['userCenterId']);
  310. if (!$customerResult->isSuccess()) {
  311. return ResultWrapper::fail($customerResult->getData(), $customerResult->getErrorCode());
  312. }
  313. $customer = $customerResult->getData();
  314. isset($customer['customerType']) && $params['customerType'] = $customer['customerType'];
  315. isset($customer['salesManId']) && $params['salesManId'] = $customer['salesManId'];
  316. isset($customer['salesManName']) && $params['salesManName'] = $customer['salesManName'];
  317. $params['customerOwe'] = $objMCustomerBalance->getCustomerBalance($customer['id']);//获取客户当前欠款
  318. $address = [];
  319. $selfRule = [];
  320. switch ($params['deliveryType']) {
  321. case StatusCode::$deliveryType['goodsDelivery']:
  322. $addressResult = self::getAddressInfo($params['addressId']);
  323. if (!$addressResult->isSuccess()) {
  324. return ResultWrapper::fail($addressResult->getData(), $addressResult->getErrorCode());
  325. }
  326. $address = $addressResult->getData();
  327. break;
  328. case StatusCode::$deliveryType['selfMention']:
  329. $selfRuleResult = self::getSelfRuleData($params['selfRuleId']);
  330. if (!$selfRuleResult->isSuccess()) {
  331. return ResultWrapper::fail($selfRuleResult->getData(), $selfRuleResult->getErrorCode());
  332. }
  333. $selfRule = $selfRuleResult->getData();
  334. break;
  335. }
  336. $status = $this->objDOrder->beginTransaction();
  337. $updateIndexResult = $this->objDOrderIndex->update(
  338. [
  339. 'userCenterId' => isset($params['userCenterId']) ? $params['userCenterId'] : 0,
  340. 'deliveryType' => isset($params['deliveryType']) ? $params['deliveryType'] : 0,
  341. 'customerId' => isset($params['customerId']) ? $params['customerId'] : 0,
  342. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  343. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  344. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  345. 'selfRuleId' => isset($params['selfRuleId']) ? $params['selfRuleId'] : 0,
  346. 'updateTime' => time(),
  347. ],
  348. $id
  349. );
  350. if ($updateIndexResult === false) {
  351. $this->objDOrder->rollBack();
  352. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  353. }
  354. $updateOrder = [
  355. 'customerName' => isset($params['customerName']) ? $params['customerName'] : '',
  356. 'customerId' => isset($params['customerId']) ? $params['customerId'] : 0,
  357. 'deliveryType' => isset($params['deliveryType']) ? $params['deliveryType'] : 0,
  358. 'remark' => isset($params['remark']) ? $params['remark'] : '',
  359. 'salesManId' => isset($params['salesManId']) ? $params['salesManId'] : 0,
  360. 'salesManName' => isset($params['salesManName']) ? $params['salesManName'] : '',
  361. 'customerType' => isset($params['customerType']) ? $params['customerType'] : 0,
  362. 'userCenterId' => isset($params['userCenterId']) ? $params['userCenterId'] : 0,
  363. 'customerOwe' => isset($params['customerOwe']) ? $params['customerOwe'] : 0,
  364. 'preferential' => isset($params['preferential']) ? $params['preferential'] : 0,
  365. 'vipDiscount' => isset($params['vipDiscount']) ? $params['vipDiscount'] : 0,
  366. 'expressMoney' => isset($params['expressMoney']) ? $params['expressMoney'] : 0,
  367. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  368. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  369. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  370. 'selfRuleId' => isset($params['selfRuleId']) ? $params['selfRuleId'] : 0,
  371. 'originPayAmount' => isset($params['originPayAmount']) ? $params['originPayAmount'] : 0,
  372. 'payAmount' => isset($params['payMoney']) ? $params['payMoney'] : 0,
  373. 'totalMoney' => isset($params['totalMoney']) ? $params['totalMoney'] : 0,
  374. 'receivedMoney' => isset($params['receivedMoney']) ? $params['receivedMoney'] : 0,
  375. "accountList" => isset($params['accountList']) ? json_encode($params['accountList']) : null,
  376. "currentAccountName" => isset($params['currentAccountName']) ? $params['currentAccountName'] : '',
  377. "totalReduceMoney" => isset($params['totalReduceMoney']) ? $params['totalReduceMoney'] : 0,
  378. "selfRuleData" => empty($selfRule) ? null : json_encode($selfRule),
  379. "updateTime" => time(),
  380. ];
  381. $updateOrderResult = $this->objDOrder->update($updateOrder, $id);
  382. if ($updateOrderResult === false) {
  383. $this->objDOrder->rollBack();
  384. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  385. }
  386. if (!empty($address)) {
  387. $updateReceiveResult = $this->objDOrderReceive->update([
  388. 'customerId' => $address['customerId'],
  389. 'customerCode' => $address['customerCode'],
  390. 'realName' => $address['name'],
  391. 'mobile' => $address['mobile'],
  392. 'address' => $address['address'],
  393. 'provinceCode' => $address['provinceCode'],
  394. 'cityCode' => $address['cityCode'],
  395. 'districtCode' => $address['districtCode'],
  396. 'updateTime' => time()
  397. ], ['orderId' => $id]);
  398. if ($updateReceiveResult === false) {
  399. $this->objDOrder->rollBack();
  400. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  401. }
  402. }
  403. //编辑商品
  404. if ($orderIndex['payStatus'] != StatusCode::$standard || $orderIndex['auditStatus'] != StatusCode::$auditStatus['auditPass']) {
  405. //解锁库存
  406. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  407. $unlockResult = $objMInventory->unlockInventory([$id], StatusCode::$orderType['saleOrder'], $orderIndex['createTime']);
  408. if (!$unlockResult->isSuccess()) {
  409. $this->objDOrder->rollBack();
  410. Logger::logs(E_USER_ERROR, '编辑订单,库存解锁失败', __CLASS__, __LINE__, $unlockResult->getData());
  411. return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  412. }
  413. $editResult = $objMOrderGoods->edit($params, $id,$orderIndex['no']);
  414. if (!$editResult->isSuccess()) {
  415. $this->objDOrder->rollBack();
  416. return ResultWrapper::fail($editResult->getData(), $editResult->getErrorCode());
  417. }
  418. }
  419. /*
  420. //跟新es
  421. $_id = self::createEsDocumentId($id);
  422. $this->objDOrder->esupdateTypeFieldVaule($updateOrder, $_id);*/
  423. if ($status){
  424. $this->objDOrder->commit();
  425. }
  426. return ResultWrapper::success(true);
  427. }
  428. /**
  429. * Doc: (des="代客下单,销售订单")
  430. * User: XMing
  431. * Date: 2020/12/19
  432. * Time: 2:38 下午
  433. * @param $params
  434. * @return ResultWrapper
  435. * @throws \Exception
  436. */
  437. public function add($params): ResultWrapper
  438. {
  439. $params['orderType'] = getArrayItem($params,'orderType',StatusCode::$orderType['saleOrder']);
  440. $goodsNameStr = self::createGoodsName($params['lists']);
  441. $commonParamsResult = self::formatCommonParams($params); // 格式化订单关联数据
  442. if (!$commonParamsResult->isSuccess()){
  443. return ResultWrapper::fail($commonParamsResult->getData(),$commonParamsResult->getErrorCode());
  444. }
  445. $params = $commonParamsResult->getData();
  446. $lists = $params['lists'];
  447. unset($params['lists']);
  448. $groupShopDataResult = self::buildGoodsByShop($lists,$params);
  449. if (!$groupShopDataResult->isSuccess()){
  450. return ResultWrapper::fail($groupShopDataResult->getData(),$groupShopDataResult->getErrorCode());
  451. }
  452. $shopGoodsData = $groupShopDataResult->getData();
  453. //锁定库存 查询商铺对应的仓库
  454. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  455. $modelResult = $objMShop->getShopDataByShopIds(array_column($shopGoodsData, 'shopId')); // 根据shopIds获取商铺数据
  456. if (!$modelResult->isSuccess()) {
  457. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  458. }
  459. $shopMap = $modelResult->getData();
  460. $buildGroupResult = self::groupSupplierOrderData($shopGoodsData,$params,$shopMap); // 将商品数据按照指定的字段分组
  461. if (!$buildGroupResult->isSuccess()){
  462. return ResultWrapper::fail($buildGroupResult->getData(),$buildGroupResult->getErrorCode());
  463. }
  464. $buildGroup = $buildGroupResult->getData();
  465. $insertOrderResult = self::insertOrder($buildGroup,$params);
  466. if (!$insertOrderResult->isSuccess()){
  467. return ResultWrapper::fail($insertOrderResult->getData(),$insertOrderResult->getErrorCode());
  468. }
  469. $orderIds = $insertOrderResult->getData();
  470. /* 拣货信息 */
  471. /* 功能临时屏蔽
  472. $orderNum = 0;
  473. $notOutNum = 0;
  474. $notPickingNum = 0;
  475. $otherNum = 0;
  476. foreach ($lists as $listKey => $listValue){
  477. $notOutNum = bcadd($notOutNum,$listValue['buyNum'],4);
  478. $notPickingNum = bcadd($notPickingNum,$listValue['buyNum'],4);
  479. $otherNum = bcadd($otherNum,$listValue['otherNum']);
  480. $orderNum = bcadd($orderNum,$listValue['buyNum']);
  481. }
  482. //组装订单拣货信息
  483. $orderPickingDate = [
  484. 'orderId' => $orderIds[0],
  485. 'sort' => 0,
  486. 'outNum' => 0,
  487. 'notOutNum' => $notOutNum,
  488. 'orderNum' => $orderNum,
  489. 'notPickingNum' => $notPickingNum,
  490. 'pickingNum' => 0,
  491. 'outTime' => 0,
  492. 'otherNum' => $otherNum,
  493. 'mangeId' => getArrayItem($params,'operatorId',0),
  494. 'mangeName' => getArrayItem($params,'operatorName',''),
  495. ];
  496. $objOrderPicking = new MOrderPicking($this->onlineUserId,$this->onlineEnterpriseId);
  497. $orderPickingResult = $objOrderPicking->addOrderPick($orderPickingDate); //临时注释
  498. if(!$orderPickingResult->isSuccess()){
  499. return ResultWrapper::fail($orderPickingResult->getData(), $orderPickingResult->getErrorCode());
  500. }*/
  501. parent::sendMessage($this->onlineEnterpriseId,'NewOrder');
  502. $params['orderType'] == StatusCode::$orderType['saleOrder'] && self::runProcessNextAudit($orderIds);
  503. return ResultWrapper::success($orderIds);
  504. }
  505. /**
  506. * Doc: (des="商品名称")
  507. * User: XMing
  508. * Date: 2020/11/18
  509. * Time: 3:27 下午
  510. * @param $goods
  511. * @return string
  512. */
  513. public static function createGoodsName($goods): string
  514. {
  515. $str = '';
  516. foreach ($goods as $val){
  517. if (isset($val['goodsName']) && !empty($val['goodsName'])){
  518. $str .= (string)$val['goodsName'].' ';
  519. }
  520. }
  521. return $str;
  522. }
  523. /**
  524. * Doc: (des="执行订单的下一步操作")
  525. * User: XMing
  526. * Date: 2020/11/6
  527. * Time: 5:03 下午
  528. * @param array $ids 订单ids
  529. * @return ResultWrapper
  530. * @throws \Exception
  531. */
  532. private function runProcessNextAudit(array $ids): ResultWrapper
  533. {
  534. Logger::logs(E_USER_ERROR,'订单自动审核',__CLASS__,__LINE__,$ids);
  535. if (empty($ids)){
  536. return ResultWrapper::success(true);
  537. }
  538. $setResult = $this->objMProcessSetting->getProcessSettingByType(StatusCode::$processType['sales'],'audit');
  539. if (!$setResult->isSuccess()){
  540. Logger::logs(E_USER_ERROR,'获取流程配置出错',__CLASS__,__LINE__,$setResult->getData());
  541. return ResultWrapper::fail($setResult->getData(),$setResult->getErrorCode());
  542. }
  543. $set = $setResult->getData();
  544. if (empty($set)){
  545. Logger::logs(E_USER_ERROR,'配置为空',__CLASS__,__LINE__,'');
  546. return ResultWrapper::success(true);
  547. }
  548. if (isset($set['enableStatus']) && $set['enableStatus'] == StatusCode::$standard){
  549. Logger::logs(E_USER_ERROR,'配置',__CLASS__,__LINE__,$set);
  550. return ResultWrapper::success(true);
  551. }
  552. foreach ($ids as $id){
  553. $params = [
  554. 'id' => $id,
  555. 'audit' => '自动审核',
  556. 'auditId' => $this->onlineUserId,
  557. 'auditStatus' => StatusCode::$auditStatus['auditPass'],
  558. ];
  559. $auditResult = $this->updateAuditStatus($params);
  560. if (!$auditResult->isSuccess()){
  561. Logger::logs(E_USER_ERROR,'自动审核订单出错',__CLASS__,__LINE__,$auditResult->getData());
  562. return ResultWrapper::fail($auditResult->getData(),$auditResult->getErrorCode());
  563. }
  564. }
  565. Logger::logs(E_USER_ERROR,'自动审核订单成功',__CLASS__,__LINE__,$ids);
  566. return ResultWrapper::success(true);
  567. }
  568. /**
  569. * Doc: (des="根据客户id获取客户信息")
  570. * User: XMing
  571. * Date: 2020/11/3
  572. * Time: 2:11 下午
  573. * @param int $id
  574. * @return ResultWrapper
  575. * @throws \Exception
  576. */
  577. private function getCustomerInfoByUserCenterId(int $id): ResultWrapper
  578. {
  579. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  580. //获取客户信息
  581. $customerData = $objMCustomer->getCustomerInfoByUserCenterId($id);
  582. if (!$customerData->isSuccess()) {
  583. return ResultWrapper::fail($customerData->getData(), $customerData->getErrorCode());
  584. }
  585. $customerData = $customerData->getData();
  586. if (empty($customerData)) {
  587. return ResultWrapper::fail('未获取到客户信息', ErrorCode::$paramError);
  588. }
  589. return ResultWrapper::success($customerData);
  590. }
  591. /**
  592. * Doc: (des="根据id查询自提点信息")
  593. * User: XMing
  594. * Date: 2020/11/3
  595. * Time: 11:49 上午
  596. * @param int $id
  597. * @return ResultWrapper
  598. * @throws \Exception
  599. */
  600. private function getSelfRuleData(int $id): ResultWrapper
  601. {
  602. $objMDeliverySetting = new MDeliverySetting($this->onlineUserId, $this->onlineEnterpriseId);
  603. $selfRuleDataResult = $objMDeliverySetting->getSelfRuleInfo($id);
  604. if (!$selfRuleDataResult->isSuccess()) {
  605. return ResultWrapper::fail($selfRuleDataResult->getData(), $selfRuleDataResult->getErrorCode());
  606. }
  607. $selfRuleData = $selfRuleDataResult->getData();
  608. $selfRuleData = isset($selfRuleData['setData']) ? $selfRuleData['setData'] : [];
  609. return ResultWrapper::success($selfRuleData);
  610. }
  611. /**
  612. * Doc: (des="根据id获取收货地址信息")
  613. * User: XMing
  614. * Date: 2020/11/3
  615. * Time: 11:52 上午
  616. * @param int $id
  617. * @return ResultWrapper
  618. */
  619. private function getAddressInfo($id): ResultWrapper
  620. {
  621. $objMShippingAddress = new MShippingAddress($this->onlineEnterpriseId);
  622. $result = $objMShippingAddress->getShippingAddressInfo($id);
  623. if (!$result->isSuccess()) {
  624. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  625. }
  626. $addressData = $result->getData();
  627. if (empty($addressData)) {
  628. return ResultWrapper::fail('未获取到收货地址信息', ErrorCode::$dberror);
  629. }
  630. return ResultWrapper::success($addressData);
  631. }
  632. /**
  633. * Doc: (des="小程序下单")
  634. * User: XMing
  635. * Date: 2020/12/18
  636. * Time: 11:39 上午
  637. * @param $params
  638. * @param $ip
  639. * @param $token
  640. * @param $auth
  641. * @return ResultWrapper
  642. * @throws \Exception
  643. */
  644. public function addOrder($params, $ip, $token, $auth): ResultWrapper
  645. {
  646. $goodsData = getArrayItem($params,'goodsData',[]);
  647. unset($params['goodsData']);
  648. $shopGoodsData = getArrayItem($goodsData,'goodsData',[]);//商品数据
  649. unset($goodsData['goodsData']);
  650. $common = array_merge($params,$goodsData);
  651. $params = $common;//公共数据
  652. unset($common);
  653. $params['token'] = $token;
  654. $params['auth'] = $auth;
  655. $params['orderType'] = StatusCode::$orderType['saleOrder'];
  656. $params['userCenterId'] = $this->onlineUserId;
  657. $params['orderStatus'] = StatusCode::$orderStatus['waitPay'];
  658. // 货到付款和银行打款 修改订单状态为待发货
  659. if( in_array($params['payType'],[StatusCode::$payType['cashPay']]) ){
  660. $params['orderStatus'] = StatusCode::$orderStatus['waitDelivery'];
  661. }
  662. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  663. $params['outerTradeNo'] = $tmpOuterTradeNo;
  664. // 格式化订单关联数据
  665. $commonParamsResult = self::formatCommonParams($params);
  666. if (!$commonParamsResult->isSuccess()){
  667. return ResultWrapper::fail($commonParamsResult->getData(),$commonParamsResult->getErrorCode());
  668. }
  669. $params = $commonParamsResult->getData();
  670. //查询商铺对应的仓库
  671. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  672. $modelResult = $objMShop->getShopDataByShopIds(array_column($shopGoodsData, 'shopId'));
  673. if (!$modelResult->isSuccess()) {
  674. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  675. }
  676. $shopMap = $modelResult->getData();
  677. // 将商品数据按照指定的字段分组
  678. $buildGroupResult = self::groupSupplierOrderData($shopGoodsData,$params,$shopMap);
  679. if (!$buildGroupResult->isSuccess()){
  680. return ResultWrapper::fail($buildGroupResult->getData(),$buildGroupResult->getErrorCode());
  681. }
  682. $buildGroup = $buildGroupResult->getData();
  683. //mysql写入数据
  684. $insertOrderResult = self::insertOrder($buildGroup,$params);
  685. if (!$insertOrderResult->isSuccess()){
  686. return ResultWrapper::fail($insertOrderResult->getData(),$insertOrderResult->getErrorCode());
  687. }
  688. $orderIds = $insertOrderResult->getData();
  689. // 处理支付
  690. $payResult = self::toPay($tmpOuterTradeNo,$params,$orderIds,$ip);
  691. if (!$payResult->isSuccess()){
  692. return ResultWrapper::fail($payResult->getData(),$payResult->getErrorCode());
  693. }
  694. // 发送新订单提醒
  695. parent::sendMessage($this->onlineEnterpriseId,'NewOrder');
  696. $params['orderType'] == StatusCode::$orderType['saleOrder'] && self::runProcessNextAudit($orderIds);
  697. echo '2';
  698. $customerData = $this->objDCustomer->get($buildGroup['orderIndex'][0]['customerId']);
  699. if ($customerData === false) {
  700. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  701. }
  702. echo '3';
  703. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  704. $orderData = $this->objDOrder->get($orderIds);
  705. if($orderData === false){
  706. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  707. }
  708. if( empty($orderData) ){
  709. return ResultWrapper::fail('查找不到该订单数据', ErrorCode::$contentNotExists);
  710. }
  711. foreach($buildGroup['order'] as $key => $value){
  712. // 发送小程序订阅消息
  713. $sendMessageData = [
  714. 'character_string6' => [ 'value' => StatusCode::$noPrefix[1].'-'.$key ], // 订单编号
  715. 'amount10' => [ 'value' => $value['payAmount'] ], // 订单金额
  716. 'thing15' => [ 'value' => $buildGroup['orderReceive'][$key]['realName'] ], // 收货人姓名
  717. 'phone_number16' => [ 'value' => $buildGroup['orderReceive'][$key]['mobile'] ], // 收货人电话
  718. 'phrase19' => [ 'value' => $orderData['payStatus'] == StatusCode::$delete ? '待支付':'已支付'], // 支付状态
  719. ];
  720. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  721. $result = $objMSystemPushMessage->sendWeiXinPushMessage(1, $customerData['openId'], $sendMessageData, '/pagesT/order/orderDetail?id='.array_pop($orderIds));
  722. if(!$result->isSuccess()){
  723. file_put_contents('/www/wwwroot/logs/api.junhailan.com/phperstar.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  724. }
  725. }
  726. }
  727. echo '4';
  728. return ResultWrapper::success($payResult->getData());
  729. }
  730. /**
  731. * Doc: (des="支付")
  732. * User: XMing
  733. * Date: 2020/12/18
  734. * Time: 4:17 下午
  735. * @param string $tmpOuterTradeNo 临时订单号
  736. * @param array $params 公共参数
  737. * @param array $orderIds 所有订单号
  738. * @param $ip
  739. * @return ResultWrapper
  740. * @throws \Exception
  741. */
  742. public function toPay($tmpOuterTradeNo,$params,$orderIds,$ip): ResultWrapper
  743. {
  744. // 获取支付金额
  745. $payMoney = getArrayItem($params,'payMoney',0);
  746. if (empty($payMoney)){
  747. return ResultWrapper::fail('支付金额异常',ErrorCode::$paramError);
  748. }
  749. // 处理支付方式
  750. $payType = explode(',', $params['payType']);
  751. rsort($payType);
  752. $objSystemCache = new SystemCache();
  753. // 后台代客下单/货到付款/银行打款不需要返回支付配置
  754. if ( $params['source'] == StatusCode::$source['manage'] || in_array(StatusCode::$payType['cashPay'], $payType) ) {
  755. return ResultWrapper::success($orderIds);
  756. }
  757. $payment = [];
  758. $payParams = '';
  759. $payStatus = StatusCode::$partion;
  760. $orderStatus = StatusCode::$orderStatus['waitPay'];
  761. $notPayMoney = $payMoney;
  762. foreach($payType as $k => $v){
  763. //判断支付状态(有银行打款是5,没有直接给3)
  764. // 除了余额支付其他方式都要获取支付配置
  765. if($v != StatusCode::$payType['balance'] && $v != StatusCode::$payType['bankLoans']){
  766. $objMPaymentSetting = new MPaymentSetting($this->onlineUserId, $this->onlineEnterpriseId);
  767. $result = $objMPaymentSetting->getPayData($v);
  768. if (!$result->isSuccess() || empty($result->getData())) {
  769. return ResultWrapper::fail('获取微信配置错误', ErrorCode::$configEroor);
  770. }
  771. $payment = $result->getData();
  772. }
  773. switch (true){
  774. case in_array(StatusCode::$payType['balance'], $payType):
  775. //减少余额()
  776. $status = $this->objDOrderIndex->beginTransaction();
  777. //新增会员流水记录
  778. $memberBalanceDetailData = [
  779. 'customerId' => $params['id'],
  780. 'type' => StatusCode::$delete,
  781. 'userCenterId' => $this->onlineUserId,
  782. 'purpose' => '创建订单消费',
  783. 'orderIds' =>implode(',',$orderIds),
  784. 'remark' => '订单id'.implode(',',$orderIds),
  785. 'financeType' => '会员余额消费'
  786. ];
  787. // 组合支付方式
  788. if( !empty($params['admixPayData']) ) {
  789. foreach ($params['admixPayData'] as $key => $value) {
  790. if ($value['payType'] == StatusCode::$payType['balance']) {
  791. // 本次混合支付余额支付金额
  792. $memberBalanceDetailData['money'] = $value['payMoney'];
  793. // 总金额 - 余额支付金额 = 剩余需要搭配支付金额
  794. $payMoney = bcsub($payMoney, $value['payMoney'], 2);
  795. $notPayMoney = $payMoney;
  796. }
  797. }
  798. }else{
  799. $orderStatus = StatusCode::$orderStatus['waitDelivery'];
  800. $payStatus = StatusCode::$standard;
  801. $memberBalanceDetailData['money'] = $payMoney;
  802. $notPayMoney = 0;
  803. }
  804. $objMMemberBalanceDetail = new MMemberBalanceDetail($this->onlineEnterpriseId,$this->onlineUserId);
  805. $memberBalanceDbResult = $objMMemberBalanceDetail->addMemberBalanceDetail($memberBalanceDetailData);
  806. if (!$memberBalanceDbResult->isSuccess()) {
  807. $this->objDOrderIndex->rollBack();
  808. return ResultWrapper::fail($memberBalanceDbResult->getData(), $memberBalanceDbResult->getErrorCode());
  809. }
  810. // 查询余额对应的银行账户
  811. $defaultAccountResult = $this->objMAccount->getDefaultAccount(StatusCode::$payType['balance']);
  812. if ($defaultAccountResult->isSuccess() == false) {
  813. $this->objDOrderIndex->rollBack();
  814. return ResultWrapper::fail($defaultAccountResult->getData(), $defaultAccountResult->getErrorCode());
  815. }
  816. if(empty($defaultAccountResult->getData())){
  817. $this->objDOrderIndex->rollBack();
  818. return ResultWrapper::fail('没有默认的'.StatusCode::$payType[$payType['balance']].'账户', ErrorCode::$notAllowAccess);
  819. }
  820. $defaultAccount = $defaultAccountResult->getData();
  821. //修改订单状态
  822. $time = time();
  823. $this->objDOrderIndex->setTable('qianniao_order_index_'.$this->onlineEnterpriseId);
  824. $fix = ceil($params['userCenterId'] / $this->cutTable);
  825. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  826. foreach ($orderIds as $orderId){
  827. $updateIndexResult = $this->objDOrderIndex->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'updateTime' => $time],$orderId);
  828. if ($updateIndexResult === false){
  829. $this->objDOrderIndex->rollBack();
  830. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  831. }
  832. $updateIndex = $this->objDOrder->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'payTime'=> $time,'updateTime' => $time,'notPayMoney'=>$notPayMoney],$orderId);
  833. if ($updateIndex === false){
  834. $this->objDOrderIndex->rollBack();
  835. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  836. }
  837. $orderInfo = $this->objDOrder->get($orderId);
  838. if($orderInfo == false){
  839. $this->objDOrderIndex->rollBack();
  840. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  841. }
  842. // 生成收款单
  843. $receivedData = [
  844. 'customerId' => $orderInfo['customerId'],
  845. 'customerName' => $orderInfo['customerName'],
  846. 'currentAccountName' => $orderInfo['shopName'],
  847. 'financeType' => '销售收款',
  848. 'financeTypeId' => StatusCode::$systemFinanceType['saleReceipt'],
  849. 'shopId' => $orderInfo['shopId'],
  850. 'shopName' => $orderInfo['shopName'],
  851. 'receiptTime' => time(),
  852. 'operatorId' => $this->onlineUserId,
  853. 'originId' => $orderId,
  854. 'originNo' => $orderInfo['no'],
  855. 'sourceId' => $orderId,
  856. 'sourceNo' => $orderInfo['no'],
  857. 'sourceNoMoney' => $orderInfo['totalMoney'], //原单据订单总金额
  858. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  859. 'createTime' => time(),
  860. 'updateTime' => time(),
  861. 'accountList' => [
  862. [
  863. "accountId" => isset($defaultAccount['id']) ? $defaultAccount['id'] : 0,
  864. "accountNumber" => isset($defaultAccount['accountNumber']) ? $defaultAccount['accountNumber'] : '',
  865. 'accountName' => isset($defaultAccount['name']) ? $defaultAccount['name'] : '',
  866. "money" => $memberBalanceDetailData['money'],
  867. "discountMoney" => 0,
  868. "finalMoney" => $memberBalanceDetailData['money'],
  869. "payWay" => '余额支付',
  870. "remark" => "在线余额支付自动生成收款单"
  871. ]
  872. ],
  873. ];
  874. $result = $this->objMReceived->addReceived($receivedData, true);
  875. if ($result->isSuccess() == false) {
  876. $this->objDOrderIndex->rollBack();
  877. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  878. }
  879. unset($receivedData);
  880. unset($result);
  881. }
  882. // 根据客户id (customerId) 获取 openId
  883. if(!empty($orderInfo['customerId'])){
  884. $customerId = $orderInfo['customerId'];
  885. $objDCustomer = new DCustomer('default');
  886. $objDCustomer->setTable($objDCustomer->get_Table() . '_' . $this->onlineEnterpriseId);
  887. $customerData = $objDCustomer->get($customerId);
  888. if($customerData === false){
  889. return ResultWrapper::fail($objDCustomer->error(), ErrorCode::$dberror);
  890. }
  891. if( empty($customerData) ){
  892. return ResultWrapper::fail('查找不到该客户数据', ErrorCode::$contentNotExists);
  893. }
  894. // 小程序订阅消息
  895. if (isset($customerData['openId']) && !empty($customerData['openId'])) {
  896. // 发送小程序订阅消息
  897. $sendMessageData = [
  898. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfo['no']], // 订单编号
  899. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfo['createTime'])], // 下单时间
  900. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  901. 'thing7' => ['value' => '余额支付'], // 支付方式
  902. 'name8' => ['value' => substr($orderInfo['shopName'],0,30)] // 商家名称
  903. ];
  904. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  905. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customerData['openId'], $sendMessageData);
  906. if (!$result->isSuccess()) {
  907. file_put_contents('/www/wwwroot/logs/api.junhailan.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  908. }
  909. }
  910. }
  911. $status && $this->objDOrderIndex->commit();
  912. $payParams = ResultWrapper::success(['code'=>100,'msg'=>'余额支付成功']);
  913. break;
  914. case in_array(StatusCode::$payType['aliPay'], $payType):
  915. //ali
  916. /*********读取支付宝支付参数(原配置)*********/
  917. /**$aliPayConfigData = Factory::config()->get('alipay');
  918. * if (empty($aliPayConfigData)) {
  919. * return ResultWrapper::fail('支付宝配置错误', ErrorCode::$configEroor);
  920. * }*/
  921. $payOrderData = [
  922. 'subject' => '千鸟云商',
  923. 'out_trade_no' => $tmpOuterTradeNo,
  924. 'total_amount' => $payMoney,
  925. 'passback_params' => $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', $orderIds),
  926. ];
  927. $aliPayConfigData = [
  928. 'appid' => $payment['appid'],
  929. 'rsaPrivateKey' => $payment['rsaPrivateKey'],
  930. 'alipayrsaPublicKey' => $payment['alipayrsaPublicKey'],
  931. ];
  932. $objAliPay = new aliPay($aliPayConfigData['appid'], $aliPayConfigData['rsaPrivateKey'], $aliPayConfigData['alipayrsaPublicKey']);
  933. $payParams = $objAliPay->appPay($payOrderData);
  934. break;
  935. case in_array(StatusCode::$payType['wxPay'], $payType):
  936. //wx
  937. /********************生成小程序唤起支付用到的参数(原配置)*****/
  938. /**$weixinConfigData = Factory::config()->get('weixin');
  939. * if (empty($weixinConfigData)) {
  940. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  941. * }*/
  942. // 获取当前登录企业的小程序配置
  943. $miniprogramSetting = $objSystemCache->getAppIdByEnterpriseId($this->onlineEnterpriseId);
  944. if (empty($miniprogramSetting)) {
  945. return ResultWrapper::fail('后台小程序配置项为空', ErrorCode::$configEroor);
  946. }
  947. $miniprogramSetting = json_decode($miniprogramSetting, true);//获取小程序appid
  948. // 获取配置文件微信公众号
  949. $weixinConfigData = Factory::config()->getAppoint('weixin', 'offiaccount');
  950. switch ($params['source']) {
  951. case StatusCode::$source['weiXinBrowser'];
  952. if (empty($weixinConfigData)) {
  953. return ResultWrapper::fail('微信公众号配置错误', ErrorCode::$configEroor);
  954. }
  955. $appid = $weixinConfigData['appid'];
  956. $paySource = 'weiXinBrowser';
  957. break;
  958. case StatusCode::$source['H5'];
  959. if (empty($weixinConfigData)) {
  960. return ResultWrapper::fail('微信公众号配置错误', ErrorCode::$configEroor);
  961. }
  962. $appid = $weixinConfigData['appid'];
  963. $paySource = 'H5';
  964. break;
  965. case StatusCode::$source['miniProgram'];
  966. $appid = $miniprogramSetting['appid'];
  967. $paySource = 'miniProgram';
  968. break;
  969. default :
  970. $appid = $payment['mobileAppid'];
  971. $paySource = 'APP';
  972. break;
  973. }
  974. $weixinConfigData = [
  975. 'mch_id' => $payment['mchId'],
  976. 'apiPartnerKey' => $payment['apiPartnerKey'],
  977. 'appid' => $appid
  978. ];
  979. $attach = $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', $orderIds);
  980. //$objPay = new Pay($appid, $weixinConfigData['pay']['mch_id'], $weixinConfigData['pay']['apiPartnerKey']);//old
  981. //判断是否是子商户,优先选择子商户
  982. if(isset($payment['sub_mch_id']) && !empty($payment['sub_mch_id']) && $payMoney['mch_type'] == 2 ){
  983. $sub_mch_id = $payment['sub_mch_id'];
  984. $sub_weixinConfigData = Factory::config()->get('weixin');
  985. if (empty($sub_weixinConfigData)) {
  986. return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  987. }
  988. $objPay = new Pay($appid, $sub_weixinConfigData['service_pay']['mch_id'], $sub_weixinConfigData['service_pay']['apiPartnerKey']);
  989. $payParams = $objPay->unifiedorder($tmpOuterTradeNo,$payMoney, $ip, $paySource, '千鸟云商', $params['openId'], $attach,$sub_mch_id);
  990. break;
  991. }
  992. $objPay = new Pay($appid, $weixinConfigData['mch_id'], $weixinConfigData['apiPartnerKey']);
  993. $payParams = $objPay->unifiedorder($tmpOuterTradeNo,$payMoney, $ip, $paySource, '千鸟云商', $params['openId'], $attach);
  994. break;
  995. case in_array(StatusCode::$payType['byte'],$payType):
  996. //字节跳动
  997. $mweb_url = '';
  998. //读取缓存配置
  999. //$objSystemCache->getByteDanceSetting($this->onlineEnterpriseId);
  1000. // 获取配置文件字节小程序
  1001. $byteDanceConfigData = Factory::config()->getAppoint('byteDance', 'pay');
  1002. if (empty($byteDanceConfigData)) {
  1003. return ResultWrapper::fail('字节跳动配置错误', ErrorCode::$configEroor);
  1004. }
  1005. $objbytePay = new bytePay($byteDanceConfigData['appid'], $byteDanceConfigData['merchant_id'], $byteDanceConfigData['app_secret']);
  1006. unset($payParams);
  1007. $payParams = $objbytePay->pay($tmpOuterTradeNo, $payMoney, '千鸟云商', $ip, $mweb_url);
  1008. break;
  1009. case in_array(StatusCode::$payType['bankLoans'], $payType):
  1010. foreach ($orderIds as $orderId){
  1011. $orderInfo = $this->objDOrder->get($orderId);
  1012. if($orderInfo == false){
  1013. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1014. }
  1015. }
  1016. // 根据客户id (customerId) 获取 openId
  1017. if(!empty($orderInfo['customerId'])){
  1018. $customerId = $orderInfo['customerId'];
  1019. $objDCustomer = new DCustomer('default');
  1020. $objDCustomer->setTable($objDCustomer->get_Table() . '_' . $this->onlineEnterpriseId);
  1021. $customerData = $objDCustomer->get($customerId);
  1022. if($customerData === false){
  1023. return ResultWrapper::fail($objDCustomer->error(), ErrorCode::$dberror);
  1024. }
  1025. if( empty($customerData) ){
  1026. return ResultWrapper::fail('查找不到该客户数据', ErrorCode::$contentNotExists);
  1027. }
  1028. // 小程序订阅消息
  1029. if (isset($customerData['openId']) && !empty($customerData['openId'])) {
  1030. // 发送小程序订阅消息
  1031. $sendMessageData = [
  1032. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfo['no']], // 订单编号
  1033. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfo['createTime'])], // 下单时间
  1034. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  1035. 'thing7' => ['value' => '银行打款'], // 支付方式
  1036. 'name8' => ['value' => substr($orderInfo['shopName'],0,30)] // 商家名称
  1037. ];
  1038. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  1039. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customerData['openId'], $sendMessageData);
  1040. if (!$result->isSuccess()) {
  1041. file_put_contents('/www/wwwroot/logs/api.junhailan.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  1042. }
  1043. }
  1044. }
  1045. $payParams = ResultWrapper::success($orderIds);
  1046. break;
  1047. default:
  1048. //TODO
  1049. return ResultWrapper::fail('暂未开放的支付方式',ErrorCode::$paramError);
  1050. break;
  1051. }
  1052. unset($payType[$k]);
  1053. if (!$payParams->isSuccess()) {
  1054. return ResultWrapper::fail($payParams->getData(), $payParams->getErrorCode());
  1055. }
  1056. }
  1057. return ResultWrapper::success($payParams->getData());
  1058. }
  1059. /**
  1060. * Doc: (des="已审核未出库订单,审核驳回")
  1061. * User: XMing
  1062. * Date: 2021/2/25
  1063. * Time: 9:41 上午
  1064. * @param int $orderId
  1065. * @return ResultWrapper
  1066. * @throws \Exception
  1067. */
  1068. public function revokeAudit(int $orderId): ResultWrapper
  1069. {
  1070. $orderIndex = $this->objDOrderIndex->get($orderId);
  1071. if ($orderIndex === false) {
  1072. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1073. }
  1074. if (empty($orderIndex)) {
  1075. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  1076. }
  1077. $fix = ceil((empty($params['userCenterId']) ? 1 : $params['userCenterId']) / $this->cutTable);
  1078. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1079. $orderData = $this->objDOrder->get($orderId);
  1080. if ($orderData === false){
  1081. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1082. }
  1083. if (empty($orderData)){
  1084. return ResultWrapper::fail('为获取到指定的订单信息',ErrorCode::$paramError);
  1085. }
  1086. if ($orderData['auditStatus'] != StatusCode::$auditStatus['auditPass']){
  1087. return ResultWrapper::fail('订单审核状态异常,不能驳回',ErrorCode::$paramError);
  1088. }
  1089. if ($orderData['outStatus'] != StatusCode::$delete){
  1090. return ResultWrapper::fail('订单已经出库,不能驳回',ErrorCode::$paramError);
  1091. }
  1092. if ($orderData['orderStatus'] == StatusCode::$orderStatus['close']){
  1093. return ResultWrapper::fail('订单已关闭,不嫩驳回',ErrorCode::$paramError);
  1094. }
  1095. $this->objDOrderIndex->beginTransaction();
  1096. $time = time();
  1097. //update order
  1098. $updateOrder = $this->objDOrder->update([
  1099. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1100. 'updateTime' => $time,
  1101. 'revokeTime' => $time
  1102. ],$orderId);
  1103. if ($updateOrder === false){
  1104. $this->objDOrderIndex->rollBack();
  1105. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1106. }
  1107. //update orderIndex
  1108. $updateOrderIndex = $this->objDOrderIndex->update([
  1109. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1110. 'updateTime' => $time
  1111. ],$orderId);
  1112. if ($updateOrderIndex === false){
  1113. $this->objDOrderIndex->rollBack();
  1114. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1115. }
  1116. //update stock
  1117. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  1118. $stockOutResult = $objMInventoryOut->delInventoryOutStatus([
  1119. 'sourceId' => $orderId,
  1120. 'type' => StatusCode::$orderType['saleOut']
  1121. ]);
  1122. if (!$stockOutResult->isSuccess()){
  1123. $this->objDOrderIndex->rollBack();
  1124. return ResultWrapper::fail($stockOutResult->getData(),$stockOutResult->getErrorCode());
  1125. }
  1126. // 删除已生成的收款单
  1127. $objDReceivedIndex = new DReceivedIndex('finance');
  1128. $objDReceivedIndex->setTable('qianniao_received_index_' . $this->onlineEnterpriseId);
  1129. $deleteReceive = $objDReceivedIndex->delete(['sourceId'=>$orderIndex['id']]);
  1130. if ($deleteReceive === false) {
  1131. return ResultWrapper::fail($objDReceivedIndex->error(), ErrorCode::$dberror);
  1132. }
  1133. /*
  1134. //update es
  1135. $_id = self::createEsDocumentId($orderId);
  1136. $this->objDOrder->esupdateTypeFieldVaule([
  1137. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1138. 'updateTime' => $time
  1139. ], $_id);*/
  1140. $this->objDOrderIndex->commit();
  1141. return ResultWrapper::success(true);
  1142. }
  1143. /**
  1144. * Doc: (des="")
  1145. * User: XMing
  1146. * Date: 2021/3/9
  1147. * Time: 5:13 下午
  1148. * @param int $orderId
  1149. * @return ResultWrapper
  1150. * @throws \Exception
  1151. */
  1152. public function reStockOut(int $orderId): ResultWrapper
  1153. {
  1154. // 获取订单索引表数据
  1155. $orderIndex = $this->objDOrderIndex->get($orderId);
  1156. if ($orderIndex === false){
  1157. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1158. }
  1159. if (empty($orderIndex)){
  1160. return ResultWrapper::fail('未获取到指定地订单信息',ErrorCode::$paramError);
  1161. }
  1162. // 获取订单数据
  1163. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1164. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1165. $orderData = $this->objDOrder->get($orderId);
  1166. if ($orderData === false){
  1167. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1168. }
  1169. if (empty($orderData)){
  1170. return ResultWrapper::fail('未获取到指定的订单信息',ErrorCode::$paramError);
  1171. }
  1172. if ($orderData['outStatus'] == StatusCode::$standard){
  1173. return ResultWrapper::fail('订单已经出库,请不要重复出库',ErrorCode::$paramError);
  1174. }
  1175. // 查询销售订单是否还有未审核的出库单,必须先处理完,再生成新的出库单
  1176. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  1177. $condition = [
  1178. 'originId' => $orderData['id'],
  1179. 'deleteStatus' => StatusCode::$standard,
  1180. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1181. ];
  1182. $result = $objMInventoryOut->getInventoryOutData($condition);
  1183. if (!$result->isSuccess()) {
  1184. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  1185. }
  1186. $inventoryOutData = $result->getData();
  1187. if( !empty($inventoryOutData) ){
  1188. return ResultWrapper::fail('当前销售订单还有未审核的出库单,单号:'.StatusCode::$noPrefix[5].'-'.$inventoryOutData[0]['no'].',请先处理完成', ErrorCode::$notAllowAccess);
  1189. }
  1190. // 查询订单商品表数据
  1191. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  1192. $orderGoodsData = $this->objDOrderGoods->select(['orderId' => $orderId,'deleteStatus' => StatusCode::$standard]);
  1193. if ($orderGoodsData === false){
  1194. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  1195. }
  1196. if (empty($orderGoodsData)){
  1197. return ResultWrapper::fail('订单商品获取失败',ErrorCode::$paramError);
  1198. }
  1199. // 组装出库单数据
  1200. $saleOutData = [
  1201. 'sourceId' => $orderData['id'],
  1202. 'sourceNo' => $orderData['no'],
  1203. 'originNo' => $orderData['no'],
  1204. 'originId' => $orderData['id'],
  1205. 'shopId' => $orderData['shopId'],
  1206. 'shopName' => $orderData['shopName'],
  1207. 'amount' => $orderData['payAmount'],
  1208. 'operatorId' => $orderData['auditId'],//操作人id
  1209. 'operatorName' => $orderData['audit'],//操作人信息
  1210. 'customerId' => $orderData['customerId'],
  1211. 'customerName' => $orderData['customerName'],
  1212. 'customerCode' => createCode(StatusCode::$code['customer']['prefix'], $orderData['customerId'], StatusCode::$code['customer']['length']),
  1213. 'customerMobile' => $orderData['customerMobile'],
  1214. 'source' => StatusCode::$orderType['saleOrder'], //订单来源(出库类型)
  1215. 'type' => StatusCode::$orderType['saleOut'],
  1216. 'deliveryType' => $orderData['deliveryType'],//配送方式
  1217. 'remark' => $orderData['remark'],
  1218. ];
  1219. $saleOutData['materielNum'] = 0;
  1220. //获取sku
  1221. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  1222. $skuIds = array_column(array_values($orderGoodsData), 'skuId');
  1223. $modelResult = $objMSku->getSkuDataBySkuIds($skuIds);
  1224. if (!$modelResult->isSuccess()) {
  1225. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1226. }
  1227. $skuData = $modelResult->getData();
  1228. unset($modelResult);
  1229. foreach ($orderGoodsData as $key => $value) {
  1230. if ($value['outOfNum'] > 0 && $value['isEq'] == StatusCode::$delete){
  1231. $saleOutData['materielNum']++;
  1232. $totalMoney = bcsub(bcsub($value['totalMoney'], $value['vipDiscount']), $value['preferential']);//销售总价 !优惠后
  1233. $saleOutData['orderGoodsData'][] = [
  1234. 'materielId' => $value['goodsBasicId'],
  1235. 'materielName' => $value['goodsName'],
  1236. 'materielCode' => createCode(StatusCode::$code['goodsBasic']['prefix'], $value['goodsBasicId'], StatusCode::$code['goodsBasic']['length']),
  1237. 'skuId' => $value['skuId'],
  1238. 'num' => $value['outOfNum'],
  1239. 'otherNum' => $value['otherNum'],
  1240. 'outNum' => 0,
  1241. 'total' => $value['outOfNum'],
  1242. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  1243. 'skuName' => isset($skuData[$value['skuId']]) ? $skuData[$value['skuId']]['skuName'] : '',
  1244. 'unitPrice' => $value['price'],//单价 不优惠
  1245. 'totalPrice' => $totalMoney,//销售总价 !优惠后
  1246. ];
  1247. }
  1248. }
  1249. if (empty($saleOutData['orderGoodsData'])){
  1250. return ResultWrapper::fail('此订单没有需要出库的商品',ErrorCode::$paramError);
  1251. }
  1252. // 新增出库单
  1253. $dbResult = $objMInventoryOut->addInventoryOut($saleOutData);
  1254. if (!$dbResult->isSuccess()){
  1255. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  1256. }
  1257. return ResultWrapper::success($dbResult->getData());
  1258. }
  1259. /**
  1260. * Doc: (des="")
  1261. * User: XMing
  1262. * Date: 2021/3/18
  1263. * Time: 6:55 下午
  1264. * @param int $orderId
  1265. * @return ResultWrapper
  1266. * @throws \Exception
  1267. */
  1268. public function retAmount(int $orderId)
  1269. {
  1270. $message = '退款成功';
  1271. // 从订单索引表查询订单数据
  1272. $orderIndex = $this->objDOrderIndex->get($orderId);
  1273. if ($orderIndex === false){
  1274. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1275. }
  1276. if (empty($orderIndex)){
  1277. return ResultWrapper::fail('未获取到订单数据',ErrorCode::$paramError);
  1278. }
  1279. // 从订单和订单商品查询订单数据
  1280. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1281. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1282. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  1283. $order = $this->objDOrder->get($orderId);
  1284. if ($order === false){
  1285. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1286. }
  1287. if ( empty($order) ){
  1288. return ResultWrapper::fail('未获取到指定订单信息',ErrorCode::$paramError);
  1289. }
  1290. $sql = 'SELECT * FROM qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix.' WHERE orderId = '.$orderId.' AND deleteStatus = '.StatusCode::$standard.' AND outOfNum > 0';
  1291. $rows = $this->objDOrderGoods->query($sql);
  1292. if ($rows === false){
  1293. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  1294. }
  1295. if (empty($rows)){
  1296. return ResultWrapper::fail('未获取到指定订单的商品信息',ErrorCode::$paramError);
  1297. }
  1298. // 根据实际订单未出库数量计算退款金额
  1299. $receiveMoney = 0;
  1300. foreach ($rows as $row){
  1301. if ($row['outOfNum'] <= 0) continue;
  1302. $receiveMoney = bcadd($receiveMoney,bcmul($row['price'],$row['outOfNum'], 4),4);
  1303. }
  1304. // 保留4位判断金额是否异常
  1305. if ($receiveMoney <= 0){
  1306. return ResultWrapper::fail('退款金额异常',ErrorCode::$paramError);
  1307. }
  1308. $receiveMoney = bcadd($receiveMoney, '0', 2); // 实际退款保留两位
  1309. $status = $this->objDOrder->beginTransaction();
  1310. $payType = explode(',', $orderIndex['payType']);
  1311. // 未支付订单不生成退款单
  1312. if( $order['payStatus'] == StatusCode::$standard){
  1313. // 小于1分钱不做退款处理
  1314. if ($receiveMoney >= 0.01){
  1315. // 根据订单支付方式规划退款账户
  1316. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  1317. // 包含余额组合支付方式统一返回余额,其他原路返回
  1318. if( in_array(StatusCode::$payType['balance'],$payType) ){
  1319. $financeAccountData = $objMAccount->getDefaultAccount(StatusCode::$payType['balance']);
  1320. }else if( in_array(StatusCode::$payType['bankLoans'],$payType) ){
  1321. $extends = json_decode($order['extends'], true);
  1322. if( isset($extends['bankData']['id']) && !empty($extends['bankData']['id'])){
  1323. $accountId = $extends['bankData']['id'];
  1324. //获取银行打款账户信息
  1325. $financeAccountData = $objMAccount->getAccountInfo($accountId);
  1326. }else{
  1327. $financeAccountData = ResultWrapper::fail('获取打款账户错误');
  1328. }
  1329. } else{
  1330. $financeAccountData = $objMAccount->getDefaultAccount($payType);
  1331. }
  1332. if(!$financeAccountData->isSuccess()){
  1333. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  1334. }
  1335. $financeAccountData = $financeAccountData->getData();
  1336. //记录负应收的id
  1337. //$financeRefundData['offsetId'] = (int)$addReceiveResult->getData();
  1338. // 生成财务退款单
  1339. $financeRefundData = [
  1340. 'originId' => getArrayItem($order,'id',0),
  1341. 'originNo' => getArrayItem($order,'no',''),
  1342. 'sourceId' => getArrayItem($order,'id',0),
  1343. 'sourceNo' => getArrayItem($order,'no',''),
  1344. 'refundTime' => time(),
  1345. 'createTime' => time(),
  1346. 'unitId' => getArrayItem($order,'customerId',0),
  1347. 'unitName' => getArrayItem($order,'customerName',0),
  1348. 'currentAccountName' => getArrayItem($order,'customerName',''),
  1349. 'financeType' => '订单完结退款',
  1350. 'financeTypeId' => 1,
  1351. 'payType' =>getArrayItem($order,'payType',''),
  1352. 'shopId' => getArrayItem($order,'shopId',0),
  1353. 'shopName' => getArrayItem($order,'shopName',0),
  1354. 'money' => $receiveMoney,
  1355. 'operatorId' => $this->onlineUserId,
  1356. 'type' => StatusCode::$standard,
  1357. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1358. 'remark' => '订单一键完结,订单编号:'. getArrayItem($order,'no','').'完结后需退款金额:'.$receiveMoney
  1359. ];
  1360. $financeRefundData['accountList'] = [
  1361. [
  1362. 'accountId' => $financeAccountData['id'],
  1363. 'accountNumber' => $financeAccountData['accountNumber'],
  1364. 'accountName' => $financeAccountData['name'],
  1365. 'money' => $receiveMoney,
  1366. ]
  1367. ];
  1368. $objMRefund = new MRefund($this->onlineEnterpriseId,$this->onlineUserId);
  1369. $result = $objMRefund->addRefund($financeRefundData);
  1370. if(!$result->isSuccess()){
  1371. $this->objDOrder->rollBack();
  1372. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  1373. }
  1374. // 应收自动审核队列
  1375. //Factory::cache('finance')->zadd('salesOutReceive::'.$this->onlineEnterpriseId, time(), $addReceiveResult->getData());
  1376. }else{
  1377. $message = '退款金额少于0.01,不做退款处理,退款成功';
  1378. }
  1379. }
  1380. $updateIndexData = [
  1381. 'updateTime' => time(),
  1382. 'isRet' => StatusCode::$standard,
  1383. ];
  1384. $updateOrderIndex = $this->objDOrderIndex->update($updateIndexData, $orderId);
  1385. if ($updateOrderIndex === false){
  1386. $this->objDOrder->rollBack();
  1387. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1388. }
  1389. $update = [
  1390. 'updateTime' => time(),
  1391. 'retTime' => time(),
  1392. 'retMoney' => $receiveMoney,
  1393. 'isRet' => StatusCode::$standard,
  1394. ];
  1395. $updateOrder = $this->objDOrder->update($update,$orderId);
  1396. if ($updateOrder === false){
  1397. $this->objDOrder->rollBack();
  1398. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1399. }
  1400. //订单解锁
  1401. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  1402. $unlockResult = $objMInventory->unlockInventory([$orderId], StatusCode::$orderType['saleOrder'], $orderIndex['createTime']);
  1403. if (!$unlockResult->isSuccess()) {
  1404. $this->objDOrder->rollBack();
  1405. return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  1406. }
  1407. $status && $this->objDOrder->commit();
  1408. return ResultWrapper::success($message);
  1409. }
  1410. /**
  1411. * Doc: (des="创建分销")
  1412. * User: XMing
  1413. * Date: 2020/7/29
  1414. * Time: 6:41 下午
  1415. * @param string $token
  1416. * @param string $auth
  1417. * @param int $customerId
  1418. * @param int $orderId
  1419. */
  1420. private function taskCreateCommission(string $token, string $auth, int $customerId, int $orderId)
  1421. {
  1422. $i = 1;
  1423. do {
  1424. $postData = [
  1425. 'topicName' => 'MyJob',
  1426. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  1427. 'topicMethon' => 'push',
  1428. 'topicMethonParams' => [
  1429. 'Authorization' => $auth,
  1430. 'Token' => $token,
  1431. 'orderId' => $orderId,
  1432. 'customerId' => $customerId,
  1433. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  1434. ],
  1435. ];
  1436. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  1437. $result = request($url, $postData);
  1438. $i++;
  1439. } while ($result['httpcode'] != 200 && $i <= 3);
  1440. Logger::logs(E_USER_ERROR, '投递任务成功', __CLASS__, __LINE__, $postData);
  1441. }
  1442. /**
  1443. * Doc: (des="修改订单的退货状态")
  1444. * User: XMing
  1445. * Date: 2020/7/14
  1446. * Time: 3:54 下午
  1447. * @param $params
  1448. * @return ResultWrapper
  1449. * @throws \Exception
  1450. */
  1451. public function editOrder($params)
  1452. {
  1453. if (empty($params['id'])) {
  1454. return ResultWrapper::fail('没有订单id', ErrorCode::$paramError);
  1455. }
  1456. $id = $params['id'];
  1457. unset($params['id']);
  1458. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1459. $orderIndex = $this->objDOrderIndex->get(['id' => $id], 'userCenterId');
  1460. if ($orderIndex === false) {
  1461. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1462. }
  1463. $this->objDOrderIndex->beginTransaction();
  1464. $updateResult = $this->objDOrderIndex->update([
  1465. 'updateTime' => $params['updateTime'],
  1466. 'returnStatus' => $params['returnStatus'],
  1467. ], ['id' => $id]);
  1468. if ($updateResult === false) {
  1469. $this->objDOrderIndex->rollBack();
  1470. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1471. }
  1472. $tableNum = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1473. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $tableNum);
  1474. $dbResult = $this->objDOrder->update([
  1475. 'updateTime' => $params['updateTime'],
  1476. 'returnStatus' => $params['returnStatus'],
  1477. ], $id);
  1478. if ($dbResult === false) {
  1479. $this->objDOrderIndex->rollBack();
  1480. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1481. }
  1482. $this->objDOrderIndex->commit();
  1483. /*//修改es数据
  1484. $_id = self::createEsDocumentId($id);
  1485. $this->objDOrder->esupdateTypeFieldVaule(['returnStatus' => $params['returnStatus'], 'updateTime' => $params['updateTime']], $_id);*/
  1486. return ResultWrapper::success($dbResult);
  1487. }
  1488. /**
  1489. * 更新ES
  1490. * @param $orderId
  1491. * @param $order
  1492. * @param $addressData
  1493. * @param $addOrderGoodsName
  1494. * @param int $userCenterId
  1495. */
  1496. public function updateEsData($orderId, $order, $addressData, $addOrderGoodsName, $userCenterId = 0)
  1497. {
  1498. $orderEsData = [
  1499. /*订单表信息*/
  1500. 'id' => $orderId,//订单编号,
  1501. 'no' => $order['no'],//订单编号,
  1502. 'outerTradeNo' => '',//'外部流水号(支付宝/微信返回的流水号)'
  1503. 'shopId' => $order['shopId'],
  1504. 'shopName' => $order['shopName'],
  1505. 'enterpriseId' => $this->onlineEnterpriseId,
  1506. 'userCenterId' => $userCenterId != 0 ? $userCenterId : $this->onlineUserId,
  1507. 'totalMoney' => $order['totalMoney'],
  1508. 'payAmount' => $order['payAmount'],
  1509. 'buyTotal' => isset($order['buyTotal']) ? $order['buyTotal'] : 0,//购买总数
  1510. 'customerName' => $order['customerName'],//客户姓名
  1511. 'customerId' => $order['customerId'],//客户id
  1512. 'customerType' => isset($order['customerType']) ? $order['customerType'] : 0,//客户类型
  1513. 'payStatus' => StatusCode::$delete,//'支付状态 默认4 未支付 5已支付'
  1514. 'orderStatus' => StatusCode::$orderStatus['waitPay'],//订单状态 默认1 创建 2待支付 3代发货 4待收货 5已完成 6已关闭
  1515. 'payType' => $order['payType'],//'支付方式 1微信 2支付宝 3货到付款 4上门自提'
  1516. 'deliveryType' => $order['deliveryType'],//'配送方式 1商品配送 2上门自提'
  1517. 'source' => $order['source'],//订单来源 默认1 ios 2android 3小程序 4后台创建
  1518. 'remark' => $order['remark'],//订单备注
  1519. 'auditStatus' => $order['auditStatus'],// '审核状态 默认1 待审 2审核通过 3 审核未通过 4 审核中'
  1520. //'payTime' => '',//'付款时间'
  1521. 'createTime' => $order['createTime'],//'创建时间'
  1522. 'updateTime' => $order['updateTime'],//'修改时间',
  1523. 'salesManId' => isset($order['salesManId']) ? $order['salesManId'] : 0,
  1524. 'salesManName' => isset($order['salesManName']) ? $order['salesManName'] : '',
  1525. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  1526. 'outStatus' => StatusCode::$delete,
  1527. 'verifyCode' => $order['verifyCode'],//核销码
  1528. /*收货人信息*/
  1529. 'realName' => isset($addressData['realName']) ? $addressData['realName'] : '',//收货人姓名
  1530. 'mobile' => isset($addressData['mobile']) ? $addressData['mobile'] : '',//收货人电话
  1531. 'address' => isset($addressData['address']) ? $addressData['address'] : '',//收货详细地址
  1532. 'provinceCode' => isset($addressData['provinceCode']) ? $addressData['provinceCode'] : '',//收货人省份编码
  1533. 'cityCode' => isset($addressData['cityCode']) ? $addressData['cityCode'] : '',//收货人城市编码
  1534. 'districtCode' => isset($addressData['districtCode']) ? $addressData['districtCode'] : '',//收货人区编码
  1535. /*优惠信息*/
  1536. 'preferential' => $order['preferential'],//优惠券优惠金额
  1537. 'vipDiscount' => $order['vipDiscount'],//会员卡优惠金额
  1538. 'vipDoubleDiscount' => $order['vipDoubleDiscount'],//会员卡折上折优惠金额
  1539. /*商品信息*/
  1540. 'goodsName' => $addOrderGoodsName,
  1541. 'orderType' => isset($order['orderType']) ? $order['orderType'] : StatusCode::$orderType['salesSlip'],
  1542. ];
  1543. isset($order['salesManName']) && $orderEsData['salesManName'] = $order['salesManName'];
  1544. $_id = self::createEsDocumentId($orderId);
  1545. $result = $this->objDOrder->addUpSearchIndexDocument($orderEsData, $_id);
  1546. if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  1547. //echo "es操作成功";
  1548. //return;
  1549. }
  1550. //echo "es操作失败";
  1551. }
  1552. /**
  1553. * 创建文档id
  1554. *
  1555. * @param $orderId
  1556. * @return string
  1557. */
  1558. private function createEsDocumentId($orderId)
  1559. {
  1560. return 'EnterpriseId_' . $this->onlineEnterpriseId . '_OrderId_' . $orderId;
  1561. }
  1562. /**
  1563. * Doc: (des="获取订单创建时间,用于其它业务计算分表使用")
  1564. * User: XMing
  1565. * Date: 2020/12/25
  1566. * Time: 2:16 下午
  1567. * @param $orderId
  1568. * @return ResultWrapper
  1569. * @throws \Exception
  1570. */
  1571. public function getOrderCreateTime($orderId)
  1572. {
  1573. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1574. $orderIndexRes = $this->objDOrderIndex->get_by('id', $orderId);
  1575. if ($orderIndexRes === false) {
  1576. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1577. }
  1578. if (empty($orderIndexRes)) {
  1579. return ResultWrapper::fail('未找到订单信息', ErrorCode::$paramError);
  1580. }
  1581. return ResultWrapper::success($orderIndexRes);
  1582. }
  1583. /**
  1584. * Doc: (des="获取订单详情")
  1585. * User: XMing
  1586. * Date: 2020/7/14
  1587. * Time: 6:25 下午
  1588. * @param $id
  1589. * @return ResultWrapper
  1590. * @throws \Exception
  1591. */
  1592. public function getOrderInfoById($id): ResultWrapper
  1593. {
  1594. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1595. $orderIndexRes = $this->objDOrderIndex->get_by('id', $id);
  1596. if ($orderIndexRes === false) {
  1597. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1598. }
  1599. if (empty($orderIndexRes)) {
  1600. return ResultWrapper::fail('未找到订单信息', ErrorCode::$paramError);
  1601. }
  1602. //切换分表
  1603. self::orderSubTable($this->onlineEnterpriseId, $orderIndexRes['userCenterId']);
  1604. $dbResult = $this->objDOrder->get_by('id', $id);
  1605. if ($dbResult === false) {
  1606. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1607. }
  1608. $formatData = self::format($dbResult);
  1609. if (!$formatData->isSuccess()){
  1610. return ResultWrapper::fail($formatData->getData(),$formatData->getErrorCode());
  1611. }
  1612. $dbResult = $formatData->getData();
  1613. //添加订单打印的数据
  1614. $printResult = self::printInfo($dbResult);
  1615. if (!$printResult->isSuccess()){
  1616. return ResultWrapper::fail($printResult->getData(),$printResult->getErrorCode());
  1617. }
  1618. $dbResult = $printResult->getData();
  1619. //logisticsData
  1620. $dbResult['logisticsData'] = json_decode($dbResult['logisticsData'],true);
  1621. // 查询订单退货对应退货单的状态
  1622. if($dbResult['returnStatus']){
  1623. $objMOrderReturn = new MOrderReturn($this->onlineEnterpriseId, $this->onlineUserId);
  1624. $result = $objMOrderReturn->getAuditStatusByOrderId($id);
  1625. $dbResult['returnAuditStatus'] = StatusCode::$auditStatus['auditing'];
  1626. if($result->isSuccess()){
  1627. $dbResult['returnAuditStatus'] = $result->getData();
  1628. }
  1629. }
  1630. return ResultWrapper::success($dbResult);
  1631. }
  1632. /**
  1633. * 补充打印订单字段信息
  1634. *
  1635. * @param $dbResult
  1636. * @return ResultWrapper
  1637. * @throws \Exception
  1638. */
  1639. public function printInfo($dbResult)
  1640. {
  1641. if ($dbResult['source'] == StatusCode::$source['manage']){
  1642. $dbResult['receivable'] = $dbResult['totalMoney'];//应收
  1643. }else{
  1644. $dbResult['receivable'] = $dbResult['payAmount'];//应收
  1645. }
  1646. if ($dbResult['payType'] == StatusCode::$payType['cashPay']
  1647. || $dbResult['payType'] == StatusCode::$payType['bankLoans']
  1648. ) {
  1649. //货到付款 已支付 = payAmount金额
  1650. if ($dbResult['source'] == StatusCode::$source['manage']){
  1651. $dbResult['netReceipts'] = isset($dbResult['receivedMoney']) ? $dbResult['receivedMoney'] : 0;
  1652. }else{
  1653. if ($dbResult['payStatus'] == StatusCode::$standard) {
  1654. $dbResult['netReceipts'] = $dbResult['payAmount'];//实收
  1655. } else {
  1656. $dbResult['netReceipts'] = 0;//实收
  1657. }
  1658. }
  1659. } else {
  1660. //在线支付 已支付 = payAmount金额
  1661. if ($dbResult['payStatus'] == StatusCode::$standard) {
  1662. $dbResult['netReceipts'] = $dbResult['payAmount'];//实收
  1663. } else {
  1664. $dbResult['netReceipts'] = 0;//实收
  1665. }
  1666. }
  1667. $dbResult['currentShortage'] = bcsub($dbResult['receivable'], $dbResult['netReceipts'], 2);//本单欠
  1668. $dbResult['upOwe'] = $dbResult['customerOwe'];//上欠
  1669. $dbResult['totalDeficit'] = bcadd($dbResult['currentShortage'], $dbResult['upOwe'], 2);
  1670. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  1671. $shopData = $objMShop->getShopInfo(['id' => $dbResult['shopId']]);
  1672. if (!$shopData->isSuccess()) {
  1673. return ResultWrapper::fail($shopData->getData(),$shopData->getErrorCode());
  1674. } else {
  1675. $shopData = $shopData->getData();
  1676. }
  1677. $dbResult['shopAddress'] = isset($shopData['area']) ? $shopData['area'] : [];
  1678. $dbResult['shopMobile'] = isset($shopData['mobile']) ? $shopData['mobile'] : '';
  1679. $dbResult['shopDescribe'] = isset($shopData['describe']) ? $shopData['describe'] : '';
  1680. $dbResult['partnerPhone'] = isset($shopData['mobile']) ? $shopData['mobile'] : '';//合伙人联系电弧
  1681. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  1682. $accountName = '';
  1683. if ($dbResult['payType'] == StatusCode::$payType['wxPay'] || $dbResult['payType'] == StatusCode::$payType['aliPay']){
  1684. $accountResult = $objMAccount->getDefaultAccount($dbResult['payType']);
  1685. if (!$accountResult->isSuccess()){
  1686. return ResultWrapper::fail($accountResult->getData(),$accountResult->getErrorCode());
  1687. }
  1688. $account = $accountResult->getData();
  1689. $accountName = isset($account['name']) ? $account['name'] : '';
  1690. }else{
  1691. $account = isset($dbResult['accountList']) ? array_shift($dbResult['accountList']) : [];
  1692. $accountName = isset($account['accountName']) ? $account['accountName'] : '';
  1693. }
  1694. $dbResult['accountName'] = $accountName;//收款账户
  1695. $pbjMPrintNum = new MPrintNum($this->onlineEnterpriseId);
  1696. $dbResult['printingNum'] = $pbjMPrintNum->getObjectPrintNum($dbResult['no'], $dbResult['orderType']);
  1697. return ResultWrapper::success($dbResult);
  1698. }
  1699. /**
  1700. * 检索导出(ES)
  1701. *
  1702. * @param $dsl
  1703. * @return ResultWrapper
  1704. * @throws \Exception
  1705. */
  1706. private function exportSearch($dsl)
  1707. {
  1708. $result = $this->objDOrder->getScrollSearchQueryDsl($dsl);
  1709. if (isset($result['status']) && $result['status'] == 400) {
  1710. return ResultWrapper::fail('获取数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  1711. }
  1712. if (!isset($result['hits']) && $result['hits']['total'] == 0) {
  1713. return ResultWrapper::fail('导出数据为空' . $result['error']['reason'], ErrorCode::$apiNotResult);
  1714. }
  1715. $dbResult = $result['hits']['hits'];
  1716. $list = [];
  1717. foreach ($dbResult as $key => &$value) {
  1718. $data = [];
  1719. $data = $value['_source'];
  1720. $list[] = $data;
  1721. }
  1722. self::exportOrder($list, 'es');
  1723. }
  1724. /**
  1725. * 导出方法
  1726. *
  1727. * @param $allOrderData
  1728. */
  1729. private static function export($allOrderData)
  1730. {
  1731. //导出到本地
  1732. header("Content-type:application/vnd.ms-excel");
  1733. header("Content-Disposition:filename=订单记录.csv");
  1734. header('Cache-Control: max-age=0');
  1735. $fp = fopen('php://output', 'a');
  1736. $head = ['ID', '订单编号', '下单时间', '客户名称', '收货人', '业务员', '联系电话', '订单金额', '订单状态', '收款状态', '配送方式', '订单来源', '订单审核']; //定义标题
  1737. foreach ($head as $i => $v) {
  1738. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  1739. }
  1740. fputcsv($fp, $head);
  1741. $limit = 10000;
  1742. $num = 0;//计数器
  1743. foreach ($allOrderData as $v) {
  1744. //循环数据
  1745. $num++;
  1746. if ($num == $limit) {
  1747. ob_flush();//释放内存
  1748. flush();
  1749. }
  1750. $rows['id'] = $v['id'];
  1751. $rows['no'] = $v['no'];
  1752. $rows['createTime'] = date('Y-m-d H:i:s', $v['createTime']);
  1753. $rows['customerName'] = $v['customerName'];
  1754. $rows['realName'] = $v['realName'];
  1755. $rows['salesManName'] = $v['salesManName'];
  1756. $rows['mobile'] = $v['mobile'];
  1757. $rows['payAmount'] = $v['payAmount'];
  1758. $rows['orderStatus'] = StatusCode::$orderStatus[$v['orderStatus']];
  1759. $rows['payStatus'] = StatusCode::$standard == $v['payStatus'] ? '已支付' : '未支付';
  1760. $rows['deliveryType'] = ($v['deliveryType'] != StatusCode::$deliveryType['goodsDelivery'] && $v['deliveryType'] != StatusCode::$deliveryType['selfMention']) ? '' : StatusCode::$deliveryType[$v['deliveryType']];
  1761. $rows['source'] = StatusCode::$source[$v['source']];
  1762. $rows['auditStatus'] = StatusCode::$auditStatus[$v['auditStatus']];
  1763. foreach ($rows as $kk => $vv) {
  1764. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  1765. }
  1766. fputcsv($fp, $rs);
  1767. $rows = [];
  1768. }
  1769. exit;
  1770. }
  1771. /**
  1772. * 导出列表(数据库)
  1773. *
  1774. * @param string $sql
  1775. * @return ResultWrapper
  1776. * @throws \Exception
  1777. */
  1778. public function exportAllOrder(string $sql)
  1779. {
  1780. $objDOrderIndex = new DOrderIndex();
  1781. $dbResult = $objDOrderIndex->query($sql);
  1782. if ($dbResult === false) {
  1783. return ResultWrapper::fail($objDOrderIndex->error(), ErrorCode::$dberror);
  1784. }
  1785. $allOrderData = [];
  1786. $allGroupData = [];
  1787. foreach ($dbResult as $key => $val) {
  1788. $tableNum = (int)ceil($val['userCenterId'] / $this->cutTable);
  1789. //这里感觉没有必要使用对主索引表的订单id进行分组,可以通过条件直接查询表下的数据
  1790. $allGroupData[$tableNum][] = $val['id'];
  1791. }
  1792. $fields = 'o.id,o.no,o.createTime,o.customerName,o.salesManName,o.payAmount,o.orderStatus,o.payStatus,o.source,o.deliveryType,o.auditStatus,r.realName,r.mobile';
  1793. foreach ($allGroupData as $k => $orderId) {
  1794. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  1795. $sql = 'SELECT ' . $fields . ' FROM qianniao_order_' . $this->onlineEnterpriseId . '_' . $k . ' AS o LEFT JOIN qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $k . ' AS r ON o.id=r.orderId WHERE o.id IN(' . implode(',', $orderId) . ') ORDER BY o.createTime DESC';
  1796. $dbResult = $this->objDOrder->query($sql);
  1797. if ($dbResult === false) {
  1798. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1799. }
  1800. $allOrderData = array_merge($dbResult, $allOrderData);
  1801. }
  1802. self::export($allOrderData);
  1803. }
  1804. /**
  1805. * Doc: (des="订单导出,构建查询数据")
  1806. * User: XMing
  1807. * Date: 2020/8/22
  1808. * Time: 10:25 上午
  1809. * @param array|string $data
  1810. * @param string $field
  1811. * @return ResultWrapper
  1812. */
  1813. private function buildSelectGroupDataByCondition($data, string $field)
  1814. {
  1815. switch ($field) {
  1816. case 'db':
  1817. $result = self::getAllOrderIdsBySql($data);
  1818. break;
  1819. case 'es':
  1820. $result = self::getAllOrderIdsBySearchResult($data);
  1821. break;
  1822. }
  1823. if (!$result->isSuccess()) {
  1824. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  1825. }
  1826. return ResultWrapper::success($result->getData());
  1827. }
  1828. /**
  1829. * Doc: (des="将es检索数据,进行数据分组转化为统一格式")
  1830. * [[表后缀]=>[订单id,]]
  1831. * User: XMing
  1832. * Date: 2020/8/22
  1833. * Time: 10:15 上午
  1834. * @param array $data
  1835. * @return ResultWrapper
  1836. */
  1837. private function getAllOrderIdsBySearchResult(array $data)
  1838. {
  1839. if (empty($data)) {
  1840. return ResultWrapper::success([]);
  1841. }
  1842. $groupMapRes = self::buildGroupMapByArray((array)$data);
  1843. if (!$groupMapRes->isSuccess()) {
  1844. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1845. }
  1846. return ResultWrapper::success($groupMapRes->getData());
  1847. }
  1848. /**
  1849. * Doc: (des="")
  1850. * User: XMing
  1851. * Date: 2020/8/22
  1852. * Time: 10:18 上午
  1853. * @param array $data
  1854. * @return ResultWrapper
  1855. */
  1856. private function buildGroupMapByArray(array $data)
  1857. {
  1858. if (empty($data)) {
  1859. return ResultWrapper::success([]);
  1860. }
  1861. $allGroupMap = [];
  1862. //对所有数据进行分组,[[表后缀]=>[订单id,]]
  1863. foreach ($data as $key => $val) {
  1864. $tableNum = (int)ceil($val['userCenterId'] / $this->cutTable);
  1865. //这里感觉没有必要使用对主索引表的订单id进行分组,可以通过条件直接查询表下的数据
  1866. $allGroupMap[$tableNum][] = $val['id'];
  1867. }
  1868. return ResultWrapper::success($allGroupMap);
  1869. }
  1870. /**
  1871. * Doc: (des="通过sql,进行数据分组转化为统一格式")
  1872. * [[表后缀]=>[订单id,]]
  1873. * User: XMing
  1874. * Date: 2020/8/22
  1875. * Time: 9:55 上午
  1876. * @param string $sql
  1877. * @return ResultWrapper
  1878. */
  1879. private function getAllOrderIdsBySql(string $sql)
  1880. {
  1881. if (empty($sql)) {
  1882. return ResultWrapper::success([]);
  1883. }
  1884. $list = $this->objDOrderIndex->exportQuery($sql);
  1885. if ($list === false) {
  1886. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1887. }
  1888. $list = self::getGeneratorData($list);
  1889. if (empty($list)) {
  1890. return ResultWrapper::success([]);
  1891. }
  1892. $groupMapRes = self::buildGroupMapByArray((array)$list);
  1893. if (!$groupMapRes->isSuccess()) {
  1894. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1895. }
  1896. return ResultWrapper::success($groupMapRes->getData());
  1897. }
  1898. /**
  1899. * Doc: (des="获取export查询方法返回的数据集合")
  1900. * User: XMing
  1901. * Date: 2020/8/22
  1902. * Time: 11:42 上午
  1903. * @param $object
  1904. * @return array
  1905. */
  1906. private static function getGeneratorData($object)
  1907. {
  1908. $arrayList = [];
  1909. foreach ($object as $value) {
  1910. $arrayList[] = $value;
  1911. }
  1912. return $arrayList;
  1913. }
  1914. /**
  1915. * Doc: (des="格式化导出数据,统一根据订单id格式化数据")
  1916. * User: XMing
  1917. * Date: 2020/8/22
  1918. * Time: 9:44 上午
  1919. * @param array|string $data
  1920. * @param string $source
  1921. * @return ResultWrapper
  1922. * @throws \Exception
  1923. */
  1924. private function exportOrder($data, string $source)
  1925. {
  1926. if (empty($data)) {
  1927. return ResultWrapper::success([]);
  1928. }
  1929. $groupMapRes = self::buildSelectGroupDataByCondition($data, $source);
  1930. if (!$groupMapRes->isSuccess()) {
  1931. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1932. }
  1933. $groupMap = $groupMapRes->getData();
  1934. if (empty($groupMap)) {
  1935. return ResultWrapper::fail('导出数据构建失败', ErrorCode::$paramError);
  1936. }
  1937. //查询需要导出的数据
  1938. $orderFields = '*';
  1939. $orderReceiveFields = '*';
  1940. $orderGoodsFields = '*';
  1941. $allOrderData = [];//订单集
  1942. $allOrderReceiveData = [];//订单收货地址集
  1943. $allOrderGoodsData = [];//订单商品信息
  1944. foreach ($groupMap as $k => $orderIds) {
  1945. //订单表
  1946. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  1947. $orderResult = $this->objDOrder->exportSelect(['id' => $orderIds], $orderFields, 'createTime desc');//查询订单
  1948. if ($orderResult === false) {
  1949. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1950. }
  1951. $orderResult = self::getGeneratorData($orderResult);
  1952. //订单收货表
  1953. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $k);
  1954. $orderReceiveResult = $this->objDOrderReceive->exportSelect(['orderId' => $orderIds], $orderReceiveFields, 'createTime desc');//订单收货
  1955. if ($orderReceiveResult === false) {
  1956. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  1957. }
  1958. $orderReceiveResult = self::getGeneratorData($orderReceiveResult);
  1959. //订单商品表
  1960. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $k);
  1961. $orderGoodsResult = $this->objDOrderGoods->exportSelect(['orderId' => $orderIds], $orderGoodsFields, 'createTime desc');
  1962. if ($orderGoodsResult === false) {
  1963. return ResultWrapper::fail($this->objDOrderGoods->error(), ErrorCode::$dberror);
  1964. }
  1965. $orderGoodsResult = self::getGeneratorData($orderGoodsResult);
  1966. //对数据进行合并
  1967. $allOrderData = array_merge($orderResult, $allOrderData);
  1968. $allOrderReceiveData = array_merge($orderReceiveResult, $allOrderReceiveData);
  1969. $allOrderGoodsData = array_merge($orderGoodsResult, $allOrderGoodsData);
  1970. }
  1971. $formatResult = self::formatManageOrderList($allOrderData, $allOrderReceiveData, $allOrderGoodsData);
  1972. if (!$formatResult->isSuccess()) {
  1973. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  1974. }
  1975. $exportData = $formatResult->getData();
  1976. if (empty($exportData)) {
  1977. return ResultWrapper::fail('构建导出数据为空', ErrorCode::$paramError);
  1978. }
  1979. //将数据导出
  1980. self::exportCsv($exportData);
  1981. }
  1982. /**
  1983. * Doc: (des="")
  1984. * User: XMing
  1985. * Date: 2020/8/22
  1986. * Time: 2:24 下午
  1987. * @param array $area
  1988. * @param string $address
  1989. * @return string
  1990. */
  1991. private static function createAddress($area, $address)
  1992. {
  1993. $str = '';
  1994. if (isset($area['provinceName']) && !empty($area['provinceName'])) {
  1995. $str .= $area['provinceName'];
  1996. }
  1997. if (isset($area['cityName']) && !empty($area['cityName'])) {
  1998. $str .= $area['cityName'];
  1999. }
  2000. if (isset($area['districtName']) && !empty($area['districtName'])) {
  2001. $str .= $area['districtName'];
  2002. }
  2003. $str .= $address;
  2004. return $str;
  2005. }
  2006. /**
  2007. * Doc: (des="生成规格名字")
  2008. * User: XMing
  2009. * Date: 2020/8/22
  2010. * Time: 2:47 下午
  2011. * @param array $specGroup
  2012. * @return string
  2013. */
  2014. private static function createSpecName($specGroup)
  2015. {
  2016. if(empty($specGroup)){
  2017. return "无";
  2018. }
  2019. $str = '';
  2020. foreach ($specGroup as $value) {
  2021. empty($str) && $str .= ' ';
  2022. $str .= $value['specName'] . ':';
  2023. $str .= $value['specValueName'];
  2024. }
  2025. return $str;
  2026. }
  2027. /**
  2028. * Doc: (des="将数据导出到表格")
  2029. * User: XMing
  2030. * Date: 2020/8/22
  2031. * Time: 11:09 上午
  2032. * @param array $data
  2033. */
  2034. private function exportCsv(array $data)
  2035. {
  2036. //导出到本地
  2037. header("Content-type:application/vnd.ms-excel");
  2038. header("Content-Disposition:filename=订单记录.csv");
  2039. header('Cache-Control: max-age=0');
  2040. $fp = fopen('php://output', 'a');
  2041. $head = ['ID', '订单编号', '订单金额', '优惠金额', '付款金额', '订单状态', '支付方式', '付款状态','配送方式','订单来源','审核状态','下单时间','客户名称','收货人','收货人电话','收货人地址','所属店铺', '业务员','件数','商品编码','商品名称','单位','属性','数量','销售单价(元)','销售总价'];//定义标题
  2042. foreach ($head as $i => $v) {
  2043. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  2044. }
  2045. fputcsv($fp, $head);
  2046. $limit = 10000;
  2047. $num = 0;//计数器
  2048. $rows = [];
  2049. foreach ($data as $v) {
  2050. //循环数据
  2051. $num++;
  2052. if ($num == $limit) {
  2053. ob_flush();//释放内存
  2054. flush();
  2055. }
  2056. foreach ($v['goodsData'] as $index => $item) {
  2057. self::buildExportData($rows, $v, $item, $index);
  2058. foreach ($rows as $kk => $vv) {
  2059. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  2060. }
  2061. fputcsv($fp, $rs);
  2062. $rows = [];
  2063. }
  2064. }
  2065. exit;
  2066. }
  2067. /**
  2068. * Doc: (des="")
  2069. * User: XMing
  2070. * Date: 2020/8/22
  2071. * Time: 3:28 下午
  2072. * @param array $rows
  2073. * @param array $v
  2074. * @param array $item
  2075. * @param int $index
  2076. */
  2077. private static function buildExportData(&$rows, array $v, array $item, int $index)
  2078. {
  2079. $rows['id'] = '';
  2080. $rows['no'] = '';
  2081. $rows['totalMoney'] = '';
  2082. $rows['subMoney'] = '';
  2083. $rows['payMoney'] = '';
  2084. $rows['orderMsg'] = '';
  2085. $rows['payTypeMsg'] = '';
  2086. $rows['payMsg'] = '';
  2087. $rows['deliveryMsg'] = '';
  2088. $rows['sourceMsg'] = '';
  2089. $rows['auditMsg'] = '';
  2090. $rows['createTime'] = '';
  2091. $rows['customerName'] = '';
  2092. $rows['receiveName'] = '';
  2093. $rows['receiveMobile'] = '';
  2094. $rows['receiveAddress'] = '';
  2095. $rows['shopName'] = '';
  2096. $rows['salesManName'] = '';
  2097. $rows['otherNum'] = '';
  2098. $rows['id'] = $v['id'];
  2099. $rows['no'] = $v['no'];
  2100. $rows['totalMoney'] = $v['totalMoney'];
  2101. $rows['subMoney'] = bcsub($v['payAmount'], $v['totalMoney'], 2);
  2102. $rows['payMoney'] = $v['payAmount'];
  2103. $rows['orderMsg'] = $v['orderMsg'];
  2104. $rows['payTypeMsg'] = $v['payTypeMsg'];
  2105. $rows['payMsg'] = $v['payMsg'];
  2106. $rows['deliveryMsg'] = $v['deliveryMsg'];
  2107. $rows['sourceMsg'] = $v['sourceMsg'];
  2108. $rows['auditMsg'] = $v['auditMsg'];
  2109. $rows['createTime'] = date('Y-m-d H:i:s', $v['createTime']);
  2110. $rows['customerName'] = $v['customerName'];
  2111. $rows['receiveName'] = $v['receiveData']['realName'];
  2112. $rows['receiveMobile'] = $v['receiveData']['mobile'];
  2113. $rows['receiveAddress'] = self::createAddress($v['receiveData']['area'], $v['receiveData']['address']);
  2114. $rows['shopName'] = $v['shopName'];
  2115. $rows['salesManName'] = $v['salesManName'];
  2116. $rows['goodsCode'] = $item['goodsCode'];
  2117. $rows['goodsName'] = $item['goodsName'];
  2118. $rows['unitName'] = $item['unitName'];
  2119. $rows['specName'] = self::createSpecName((isset($item['specGroup']) && !empty($item['specGroup'])) ? json_decode($item['specGroup'], true) : []);
  2120. $rows['buyNum'] = $item['buyNum'];
  2121. $rows['unitPrice'] = $item['price'];
  2122. $rows['totalPrice'] = $item['totalMoney'];
  2123. $rows['otherNum'] = $item['otherNum'];
  2124. }
  2125. /**
  2126. * 获取所有订单
  2127. *
  2128. * @param $selectParams
  2129. * @param $search
  2130. * @param bool $is_export
  2131. * @return ResultWrapper
  2132. * @throws \Exception
  2133. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2134. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2135. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2136. * @finish:已完成 orderStatus = 5 auditPass 2
  2137. * @close:已关闭 orderStatus = 6
  2138. *
  2139. * 新订单列表 {"page":1,"pageSize":10,"search":{"auditStatus":1}}
  2140. * 订单查询 {"page":1,"pageSize":10,"search":{"auditStatus":2}} 订单查询:此页面只展示新订单审核后的订单,订单状态为【待出库】,订单出库后,页面会显示出【确认收货】的按钮,订单在出库管理进行出库后,订单状态为【已出库】,客户或后台操作【确认收货】后,订单状态为【已完成】。
  2141. * 自提订单 {"page":1,"pageSize":10,"search":{"deliveryType":2}}
  2142. * 取消订单 {"page":1,"pageSize":10,"search":{"orderStatus":6}}
  2143. *
  2144. */
  2145. public function getAllOrder($selectParams, $search, $is_export = false)
  2146. {
  2147. $objDOrderIndex = new DOrderIndex();
  2148. $selectParams = array_merge($selectParams, $search);
  2149. // 组装检索sql语句
  2150. $buildSql = self::setOrderStatusSqlAttr($selectParams);
  2151. $sql = $buildSql['sql'];
  2152. if ($is_export === true) self::exportOrder($sql, 'db');//导出数据
  2153. $total = $objDOrderIndex->query($buildSql['countSql']);
  2154. if (isset($selectParams['limit']) && isset($selectParams['offset'])) {
  2155. $sql .= ' limit ' . $selectParams['offset'] . ',' . $selectParams['limit'];
  2156. }
  2157. $dbResult = $objDOrderIndex->query($sql);
  2158. if ($dbResult === false) {
  2159. return ResultWrapper::fail($objDOrderIndex->error(), ErrorCode::$dberror);
  2160. }
  2161. $allOrderData = [];//订单集
  2162. $allOrderReceiveData = [];//订单收货地址集
  2163. $allGroupData = [];
  2164. if (!empty($dbResult)) {
  2165. foreach ($dbResult as $key => $val) {
  2166. $tableNum = ceil($val['userCenterId'] / $this->cutTable);
  2167. $allGroupData[$tableNum][] = $val['id'];
  2168. }
  2169. foreach ($allGroupData as $k => $orderId) {
  2170. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  2171. $dbResult = $this->objDOrder->select(['id' => $orderId], '*', 'createTime desc');//查询订单
  2172. if ($dbResult === false) {
  2173. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2174. }
  2175. //物流信息展示
  2176. if( !empty($dbResult['logisticsData']) ){
  2177. json_decode($dbResult['logisticsData'],true);
  2178. }
  2179. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $k);
  2180. $orderReceiveResult = $this->objDOrderReceive->select(['orderId' => $orderId], '*', 'createTime desc');//订单收货
  2181. if ($orderReceiveResult === false) {
  2182. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  2183. }
  2184. $allOrderData = array_merge($dbResult, $allOrderData);//订单集
  2185. $allOrderReceiveData = array_merge($orderReceiveResult, $allOrderReceiveData);//订单收货地址集
  2186. }
  2187. }
  2188. // 格式化后台订单列表
  2189. $formatResult = self::formatManageOrderList($allOrderData, $allOrderReceiveData);
  2190. if (!$formatResult->isSuccess()) {
  2191. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  2192. }
  2193. $return = [
  2194. 'data' => $formatResult->getData(),
  2195. 'total' => isset($total[0]['total']) ? $total[0]['total'] : 0,
  2196. ];
  2197. return ResultWrapper::success($return);
  2198. }
  2199. /**
  2200. * Doc: (des="获取检索订单数据")
  2201. *订单列表搜索商品名称、商品编码、收货人、电话
  2202. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2203. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2204. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2205. * @finish:已完成 orderStatus = 5 auditPass 2
  2206. * @close:已关闭 orderStatus = 6
  2207. * @param $export
  2208. * @param $selectParams
  2209. */
  2210. public function keywordSearch($selectParams,$export = '')
  2211. {
  2212. // 组装检索sql
  2213. $whereSql = '';
  2214. if(!empty($selectParams['keywordType']) && !empty($selectParams['keyword'])){
  2215. $whereSql = self::assemblySql($selectParams['keywordType'],$selectParams['keyword']);
  2216. }
  2217. $orderTab ='qianniao_order_'.$this->onlineEnterpriseId.'_'.'1';
  2218. $orderGoodsTab ='qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.'1';
  2219. $orderReceive ='qianniao_order_receive_'.$this->onlineEnterpriseId.'_'.'1';
  2220. // 初始化表
  2221. $this->objDOrder->setTable($orderTab);
  2222. $this->objDOrder->setTable($orderGoodsTab);
  2223. $this->objDOrder->setTable($orderReceive);
  2224. $condition = '';
  2225. $limit = '';
  2226. if(!$export){
  2227. if (isset($selectParams['limit']) && isset($selectParams['offset'])) {
  2228. $limit .= ' limit ' . $selectParams['offset'] . ',' . $selectParams['limit'];
  2229. }
  2230. }
  2231. // 时间筛选
  2232. if (isset($selectParams['startTime']) && !empty($selectParams['startTime'])){
  2233. $condition .= ' AND o.createTime BETWEEN '.$selectParams['startTime'].' AND '.$selectParams['endTime'];
  2234. }
  2235. //userCenterId
  2236. if (isset($selectParams['userCenterId']) && !empty($selectParams['userCenterId'])) {
  2237. $condition .= ' and o.userCenterId = ' . $selectParams['userCenterId'];
  2238. }
  2239. //customerId
  2240. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  2241. $condition .= ' and o.customerId = ' . $selectParams['customerId'];
  2242. }
  2243. //shopId
  2244. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  2245. $condition .= ' and o.shopId = ' . $selectParams['shopId'];
  2246. }
  2247. // 付款状态 支付状态 默认4 未支付 5已支付
  2248. if (isset($selectParams['payStatus']) && !empty($selectParams['payStatus'])) {
  2249. $condition .= ' and o.payStatus = ' . $selectParams['payStatus'];
  2250. }
  2251. //支付方式
  2252. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  2253. $condition .= ' and find_in_set('.$selectParams['payType'].',o.payType) ';
  2254. }
  2255. // 客户类型
  2256. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])){
  2257. $condition .= ' AND o.customerType = '.$selectParams['customerType'];
  2258. }
  2259. // 订单来源 订单来源 默认1 ios 2android 3小程序 4后台创建
  2260. if (isset($selectParams['source']) && !empty($selectParams['source'])){
  2261. $condition .= ' AND o.source = '.$selectParams['source'];
  2262. }
  2263. //出库状态
  2264. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  2265. $condition .= ' and o.outStatus = ' . $selectParams['outStatus'];
  2266. }
  2267. //退货状态
  2268. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  2269. if (is_array($selectParams['returnStatus'])) {
  2270. $returnStatusStr = implode(',', $selectParams['returnStatus']);
  2271. $condition .= ' and o.returnStatus in(' . $returnStatusStr . ') ';
  2272. } else {
  2273. $condition .= ' and o.returnStatus = ' . $selectParams['returnStatus'];
  2274. }
  2275. }
  2276. //订单状态
  2277. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  2278. $condition = self::orderStateSql($condition, $selectParams['state']);
  2279. }
  2280. if($export){
  2281. $sql ='SELECT o.*,g.goodsCode,g.goodsName,g.unitName,g.specGroup,g.buyNum,g.price,g.otherNum,g.preferential,g.totalMoney,r.realName, r.mobile,r.provinceCode,r.cityCode,r.districtCode,r.address FROM '.$orderTab.' AS o LEFT JOIN '.$orderGoodsTab.' as g ON o.id =g.orderId LEFT JOIN '.$orderReceive.' AS r on o.id= r.orderId WHERE o.deleteStatus='.StatusCode::$standard.$whereSql.$condition.' order by o.id desc ';
  2282. $orderGoodsData = $this->objDOrder->exportQuery($sql);
  2283. if ($orderGoodsData === false) {
  2284. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2285. }
  2286. $result = self::exportOrderList($orderGoodsData);
  2287. exit;
  2288. }
  2289. $sql ='SELECT o.* FROM '.$orderTab.' AS o LEFT JOIN '.$orderGoodsTab.' as g ON o.id =g.orderId LEFT JOIN '.$orderReceive.' AS r on o.id= r.orderId WHERE o.deleteStatus='.StatusCode::$standard.$whereSql.$condition.' GROUP BY o.id order by o.createTime desc '.$limit;
  2290. $dbResult = $this->objDOrder->query($sql);
  2291. if ($dbResult === false) {
  2292. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2293. }
  2294. // 格式化后台订单列表
  2295. $formatResult = self::formatManageOrderList($dbResult,[]);
  2296. if (!$formatResult->isSuccess()) {
  2297. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  2298. }
  2299. $sqlTotal ='SELECT count( DISTINCT o.id) as total FROM '.$orderTab.' AS o LEFT JOIN '.$orderGoodsTab.' as g ON o.id =g.orderId LEFT JOIN '.$orderReceive.' AS r on o.id= r.orderId WHERE o.deleteStatus='.StatusCode::$standard.$whereSql.$condition;
  2300. $total = $this->objDOrder->query($sqlTotal);
  2301. if ($total === false) {
  2302. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2303. }
  2304. $return = [
  2305. 'data' => $formatResult->getData(),
  2306. 'total' => isset($total[0]['total']) ? $total[0]['total'] : 0,
  2307. ];
  2308. return ResultWrapper::success($return);
  2309. }
  2310. /**
  2311. * 获取检索订单数据导出
  2312. * @param $orderListData
  2313. * @return ResultWrapper
  2314. */
  2315. public function exportOrderList($orderListData)
  2316. {
  2317. //导出到本地
  2318. header("Content-type:application/vnd.ms-excel");
  2319. header("Content-Disposition:filename=订单管理.csv");
  2320. header('Cache-Control: max-age=0');
  2321. $fp = fopen('php://output', 'a');
  2322. $head = ['ID', '订单编号', '订单金额', '订单金额', '付款金额', '订单状态', '支付方式', '付款状态','配送方式','订单来源','审核状态','下单时间','客户名称','收货人','收货人电话','收货人地址','所属店铺', '业务员','件数','商品编码','商品名称','单位','属性','数量','销售单价(元)','优惠金额','销售总价'];//定义标题
  2323. foreach ($head as $i => $v) {
  2324. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  2325. }
  2326. fputcsv($fp, $head);
  2327. $limit = 10000;
  2328. $num = 0;//计数器
  2329. foreach ($orderListData as $value) {//循环数据
  2330. $orderReceiveData[]= [
  2331. 'orderId' => $value['id'],
  2332. 'provinceCode' => $value['provinceCode'],
  2333. 'cityCode' => $value['cityCode'],
  2334. 'districtCode' => $value['districtCode'],
  2335. 'allAddress' => $value['allAddress']
  2336. ];
  2337. // 格式化后台订单列表
  2338. $fromatValue = self::formatManageOrderList([$value],$orderReceiveData);
  2339. if (!$fromatValue->isSuccess()) {
  2340. echo($fromatValue->getData());
  2341. exit();
  2342. }
  2343. $fromatValue = array_pop($fromatValue->getData());
  2344. $value = array_merge($value, $fromatValue);
  2345. $num++;
  2346. if ($num == $limit) {
  2347. ob_flush();//释放内存
  2348. flush();
  2349. }
  2350. $rows['id'] = isset($value['id']) ? $value['id'] : null; // ID
  2351. $rows['no'] = isset($value['no']) ? $value['no'] : null; // 订单编号
  2352. $rows['totalMoney'] = isset($value['totalMoney']) ? $value['totalMoney'] : null; // 订单金额
  2353. $rows['subMoney'] = isset($value['payAmount']) && isset($value['totalMoney']) ? bcsub($value['payAmount'], $value['totalMoney'], 2): 0; // 订单金额
  2354. $rows['payAmount'] = isset($value['payAmount']) ? $value['payAmount'] : null; // 付款金额
  2355. $rows['orderMsg'] = isset($value['orderMsg']) ? $value['orderMsg'] : null; // 订单状态
  2356. $rows['payTypeMsg'] = isset($value['payTypeMsg']) ? $value['payTypeMsg'] : null; // 支付方式
  2357. $rows['payMsg'] = isset($value['payMsg']) ? $value['payMsg'] : null; // 付款状态
  2358. $rows['deliveryMsg'] = isset($value['deliveryMsg']) ? $value['deliveryMsg'] : null; // 配送方式
  2359. $rows['sourceMsg'] = isset($value['sourceMsg']) ? $value['sourceMsg'] : null; // 订单来源
  2360. $rows['auditMsg'] = isset($value['auditMsg']) ? $value['auditMsg'] : null; // 审核状态
  2361. $rows['createTime'] = isset( $value['createTime']) ? date('Y-m-d H:i:s', $value['createTime']) : null; // 下单时间
  2362. $rows['customerName'] = isset($value['customerName']) ? $value['customerName'] : null; // 客户名称
  2363. $rows['receiveName'] = isset($value['realName']) ? $value['realName']: null; // 收货人
  2364. $rows['receiveMobile'] = isset($value['mobile']) ? $value['mobile'] : null; // 收货人电话
  2365. $rows['receiveAddress'] = isset($value['receiveData']['allAddress']) ? $value['receiveData']['allAddress'] : null;// '收货人地址'
  2366. $rows['shopName'] = isset($value['shopName']) ? $value['shopName'] : null; // ,'所属店铺',
  2367. $rows['salesManName'] = isset($value['salesManName']) ? $value['salesManName'] : null; // '业务员'
  2368. $rows['otherNum'] = getArrayItem($value, 'otherNum', 0); //件数
  2369. $rows['goodsCode'] = getArrayItem($value, 'goodsCode'); // '商品编码'
  2370. $rows['goodsName'] = getArrayItem($value, 'goodsName'); // '商品名称
  2371. $rows['unitName'] = getArrayItem($value, 'unitName'); // 单位
  2372. $rows['specName'] = self::createSpecName((isset($value['specGroup']) && !empty($value['specGroup'])) ? json_decode($value['specGroup'], true) : []);
  2373. $rows['buyNum'] = getArrayItem($value, 'buyNum', 0);
  2374. $rows['unitPrice'] = getArrayItem($value, 'price', 0);
  2375. $rows['preferential'] = getArrayItem($value, 'preferential', 0);
  2376. $rows['totalPrice'] = getArrayItem($value, 'totalMoney', 0); // '销售单价(元)'
  2377. foreach ($rows as $kk => $vv) {
  2378. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  2379. }
  2380. fputcsv($fp, $rs);
  2381. $rows = [];
  2382. }
  2383. }
  2384. /**
  2385. * 根据订单列表 keywordType 拼装sql
  2386. * @param $keywordType
  2387. * @param $keyword
  2388. */
  2389. public function assemblySql($keywordType,$keyword)
  2390. {
  2391. $whereSql = '';
  2392. switch ($keywordType){
  2393. case 1: // 单据编号 order
  2394. if(strpos($keyword,StatusCode::$noPrefix[1]) !== false){
  2395. $orderNo = explode('-',$keyword);
  2396. if(count($orderNo)==3){
  2397. $orderNo = $orderNo[1].'-'.$orderNo[2];
  2398. }elseif(count($orderNo)==2){
  2399. $orderNo = $orderNo[1];
  2400. }else{
  2401. $orderNo = $keyword;
  2402. }
  2403. $whereSql .= ' and o.no = "'.$orderNo.'"';
  2404. }else{
  2405. $whereSql .= ' and o.no = "'.$keyword.'"';
  2406. }
  2407. break;
  2408. case 2: // 自提码 order
  2409. $whereSql .= ' and o.verifyCode ="'.$keyword.'"';
  2410. break;
  2411. case 3: // 商品名称 order_goods
  2412. $whereSql .=' and g.goodsName LIKE "%' .$keyword. '%" ';
  2413. break;
  2414. case 4: // 商品编码 order_goods
  2415. $whereSql .=' and g.goodsCode ="'.$keyword.'"';
  2416. break;
  2417. case 5: // 收货人 order_receive
  2418. $whereSql .=' and r.realName LIKE "%' .$keyword. '%" ';
  2419. break;
  2420. case 6: // 电话 order_receive
  2421. $whereSql .=' and r.mobile ="'.$keyword.'"';
  2422. break;
  2423. case 7: // 业务员 order
  2424. $whereSql .=' and o.salesManName LIKE "%' .$keyword. '%" ';
  2425. break;
  2426. case 8: // 详细地址 order_receive
  2427. $whereSql .=' and r.address LIKE "%' .$keyword. '%" ';
  2428. }
  2429. return $whereSql;
  2430. }
  2431. /**
  2432. * Doc: (des="state标示多选sql处理")
  2433. *
  2434. */
  2435. private static function orderStateSql($sql, $states)
  2436. {
  2437. if (is_array($states)) {
  2438. if (in_array('all', $states)) {
  2439. return $sql;
  2440. }
  2441. foreach ($states as $index => $state) {
  2442. $sql .= $index == 0 ? ' and (' . self::orderstate($state) : ' or ' . self::orderstate($state);
  2443. }
  2444. $sql .= ') ';
  2445. } else {
  2446. if ($states == 'all') {
  2447. return $sql;
  2448. }
  2449. $stateSql = self::orderstate($states);
  2450. if (!empty($stateSql)) {
  2451. $sql .= ' and ' . self::orderstate($states);
  2452. }
  2453. }
  2454. return $sql;
  2455. }
  2456. /**
  2457. * Doc: (des="state标示对应sql")
  2458. */
  2459. private static function orderstate($state)
  2460. {
  2461. $sql = '';
  2462. switch ($state) {
  2463. case 'waitAudit'://待审核
  2464. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditing'] . ' and o.orderStatus != ' . StatusCode::$orderStatus['close'] . ')';
  2465. break;
  2466. case 'waitOutStock'://待出库
  2467. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and (o.orderStatus = ' . StatusCode::$orderStatus['waitPay'] . ' or orderStatus = ' . StatusCode::$orderStatus['waitDelivery'] . ')) ';
  2468. break;
  2469. case 'hasOutStock'://已出库
  2470. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and o.orderStatus = ' . StatusCode::$orderStatus['waitReceive'] . ')';
  2471. break;
  2472. case 'finish'://已完成
  2473. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and o.orderStatus = ' . StatusCode::$orderStatus['finish'] . ')';
  2474. break;
  2475. case 'close'://已关闭
  2476. $sql .= ' (o.orderStatus = ' . StatusCode::$orderStatus['close'] . ')';
  2477. break;
  2478. case 'all'://全部订单
  2479. break;
  2480. }
  2481. return $sql;
  2482. }
  2483. /**
  2484. * Doc: (des="格式化后台订单列表")
  2485. * User: XMing
  2486. * Date: 2020/7/11
  2487. * Time: 5:02 下午
  2488. * @param array $orderData
  2489. * @param array $orderReceiveData
  2490. * @param array $orderGoodsData
  2491. * @return ResultWrapper
  2492. */
  2493. public function formatManageOrderList(array $orderData, array $orderReceiveData, array $orderGoodsData = [])
  2494. {
  2495. $returnData = [];
  2496. if (empty($orderData)) {
  2497. return ResultWrapper::success($returnData);
  2498. }
  2499. $receiveMap = [];
  2500. if (!empty($orderReceiveData)) {
  2501. $orderReceiveData = self::formatSysArea($orderReceiveData);// 订单收货地址集渲染
  2502. foreach ($orderReceiveData as $key => &$item) {
  2503. $receiveMap[$item['orderId']] = [
  2504. 'customerId' => getArrayItem($item, 'customerId', 0),
  2505. 'address' => getArrayItem($item, 'address'),
  2506. 'allAddress' => $item['area']['provinceName'].$item['area']['cityName'].$item['area']['districtName'].getArrayItem($item, 'address'),
  2507. 'realName' => getArrayItem($item, 'realName'),
  2508. 'mobile' => getArrayItem($item, 'mobile'),
  2509. 'area' => getArrayItem($item, 'area', [])
  2510. ];
  2511. }
  2512. unset($item);
  2513. }
  2514. $orderData = self::formatOrderStatus($orderData); // 格式化订单状态
  2515. $goodsMap = [];
  2516. if (!empty($orderGoodsData)) {
  2517. foreach ($orderGoodsData as $key => $item) {
  2518. $goodsMap[$item['orderId']][] = $item;
  2519. }
  2520. }
  2521. unset($item);
  2522. // 映射下打印次数
  2523. $allOrderNos = [];
  2524. foreach ($orderData as $key => $value){
  2525. $allOrderNos[] = $value['no'];
  2526. }
  2527. $pbjMPrintNum = new MPrintNum($this->onlineEnterpriseId);
  2528. $printNumData = $pbjMPrintNum->getObjectPrintNumByNos($allOrderNos); // 批量获取打印次数
  2529. $orderNoBindPritNum = [];
  2530. if(!empty($printNumData)){
  2531. foreach ($printNumData as $key => $value){
  2532. $orderNoBindPritNum[$value['objectNo']] = $value['printNum'];
  2533. }
  2534. }
  2535. foreach ($orderData as $key => $datum) {
  2536. $returnData[$key] = [
  2537. 'id' => $datum['id'],
  2538. 'no' => self::formatSn($datum['no']),
  2539. 'shopId' => $datum['shopId'],
  2540. 'shopName' => isset($datum['shopName']) ? $datum['shopName'] : '',
  2541. 'customerId' => $datum['customerId'],
  2542. 'customerName' => $datum['customerName'],
  2543. 'userCenterId' => $datum['userCenterId'],
  2544. 'payAmount' => $datum['payAmount'],
  2545. 'retMoney' => $datum['retMoney'],
  2546. 'totalMoney' => $datum['totalMoney'],
  2547. 'payStatus' => $datum['payStatus'],
  2548. 'auditStatus' => $datum['auditStatus'],
  2549. 'returnStatus' => $datum['returnStatus'],
  2550. 'outStatus' => $datum['outStatus'],
  2551. 'deliveryType' => $datum['deliveryType'],
  2552. 'payType' => $datum['payType'],
  2553. 'salesManName' => empty($datum['salesManName']) ? '' : $datum['salesManName'],
  2554. 'salesman' => !isset($datum['salesman']) || is_null($datum['salesman']) ? '' : $datum['salesman'],
  2555. 'salesManId' => $datum['salesManId'],
  2556. 'createTime' => $datum['createTime'],
  2557. 'source' => $datum['source'],
  2558. 'orderStatus' => $datum['orderStatus'],
  2559. 'receiveData' => isset($receiveMap[$datum['id']]) ? $receiveMap[$datum['id']] : [],
  2560. 'orderMsg' => $datum['orderMsg'],
  2561. 'payMsg' => $datum['payMsg'],
  2562. 'deliveryMsg' => $datum['deliveryMsg'],
  2563. 'payTypeMsg' => $datum['payTypeMsg'],
  2564. 'sourceMsg' => $datum['sourceMsg'],
  2565. 'auditMsg' => $datum['auditMsg'],
  2566. 'extends' => json_decode($datum['extends'],true),
  2567. 'printingNum' => getArrayItem($orderNoBindPritNum, $datum['no'], 0),
  2568. ];
  2569. if (!empty($orderGoodsData)) {
  2570. $returnData[$key]['goodsData'] = isset($goodsMap[$datum['id']]) ? $goodsMap[$datum['id']] : [];
  2571. }
  2572. }
  2573. return ResultWrapper::success($returnData);
  2574. }
  2575. private static function formatSn($no): string
  2576. {
  2577. return StatusCode::$noPrefix[StatusCode::$orderType['saleOrder']].'-'.$no;
  2578. }
  2579. /**
  2580. * Doc: (des="订单查询index表 sql生成")
  2581. * User: XMing
  2582. * Date: 2020/7/11
  2583. * Time: 11:23 上午
  2584. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2585. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2586. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2587. * @finish:已完成 orderStatus = 5 auditPass 2
  2588. * @close:已关闭 orderStatus = 6
  2589. * @param array $selectParams
  2590. * @return array
  2591. */
  2592. public function setOrderStatusSqlAttr(array $selectParams): array
  2593. {
  2594. $fields = 'id,userCenterId,no,customerId';
  2595. $countFields = ' COUNT(id) AS total ';
  2596. //订单类型
  2597. $whereSql = '';
  2598. if (isset($selectParams['orderType']) && !empty($selectParams['orderType'])) {
  2599. if (is_array($selectParams['orderType'])) {
  2600. $orderTypeStr = implode(',', $selectParams['orderType']);
  2601. $whereSql .= ' and orderType in(' . $orderTypeStr . ') ';
  2602. } else {
  2603. $whereSql .= ' and orderType = ' . $selectParams['orderType'];
  2604. }
  2605. } else {
  2606. $whereSql .= ' and orderType = ' . StatusCode::$orderType['saleOrder'];
  2607. }
  2608. if (isset($selectParams['keyword']) && !empty($selectParams['keyword'])){
  2609. if (strstr($selectParams['keyword'],StatusCode::$noPrefix['1'])){
  2610. $selectParams['keyword']= substr($selectParams['keyword'],strlen(StatusCode::$noPrefix[StatusCode::$orderType['saleOrder']])+1);
  2611. }
  2612. $keyword = '"%'.$selectParams['keyword'].'%"';
  2613. $whereSql .= ' and no LIKE '.$keyword.' or verifyCode LIKE '.$keyword;
  2614. }
  2615. if (isset($selectParams['orderType']) && $selectParams['orderType'] == StatusCode::$orderType['cashierOrder']) {
  2616. $selectParams['cashierUid'] = $this->onlineUserId;
  2617. }
  2618. if (isset($selectParams['isAll']) && $selectParams['isAll'] == StatusCode::$standard) {
  2619. unset($selectParams['cashierUid']);
  2620. }
  2621. //userCenterId
  2622. if (isset($selectParams['userCenterId']) && !empty($selectParams['userCenterId'])) {
  2623. $whereSql .= ' and userCenterId = ' . $selectParams['userCenterId'];
  2624. }
  2625. //customerId
  2626. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  2627. $whereSql .= ' and customerId = ' . $selectParams['customerId'];
  2628. }
  2629. //收银员id
  2630. if (isset($selectParams['cashierStaffId']) && !empty($selectParams['cashierStaffId'])) {
  2631. $whereSql .= ' and cashierStaffId = ' . $selectParams['cashierStaffId'];
  2632. }
  2633. //no
  2634. if (isset($selectParams['no']) && !empty($selectParams['no'])) {
  2635. $whereSql .= ' and no = "' . $selectParams['no'].'"';
  2636. }
  2637. //shopId
  2638. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  2639. $whereSql .= ' and shopId = ' . $selectParams['shopId'];
  2640. }
  2641. //收银员id
  2642. if (isset($selectParams['cashierUid']) && !empty($selectParams['cashierUid'])) {
  2643. $whereSql .= ' and cashierUid = ' . $selectParams['cashierUid'];
  2644. }
  2645. //审核状态
  2646. if (isset($selectParams['auditStatus']) && !empty($selectParams['auditStatus'])) {
  2647. $whereSql .= ' and auditStatus = ' . $selectParams['auditStatus'];
  2648. }
  2649. //出库状态
  2650. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  2651. $whereSql .= ' and outStatus = ' . $selectParams['outStatus'];
  2652. }
  2653. //退货状态
  2654. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  2655. if (is_array($selectParams['returnStatus'])) {
  2656. $returnStatusStr = implode(',', $selectParams['returnStatus']);
  2657. $whereSql .= ' and returnStatus in(' . $returnStatusStr . ') ';
  2658. } else {
  2659. $whereSql .= ' and returnStatus = ' . $selectParams['returnStatus'];
  2660. }
  2661. }
  2662. //配送方式
  2663. if (isset($selectParams['deliveryType']) && !empty($selectParams['deliveryType'])) {
  2664. $whereSql .= ' and deliveryType = ' . $selectParams['deliveryType'];
  2665. }
  2666. //支付方式
  2667. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  2668. $whereSql .= ' and find_in_set('.$selectParams['payType'].',payType) ';
  2669. }
  2670. if (isset($selectParams['startTime']) && !empty($selectParams['startTime'])){
  2671. $whereSql .= ' AND createTime BETWEEN '.$selectParams['startTime'].' AND '.$selectParams['endTime'];
  2672. }
  2673. if (isset($selectParams['source']) && !empty($selectParams['source'])){
  2674. $whereSql .= ' AND source = '.$selectParams['source'];
  2675. }
  2676. if (isset($selectParams['salesManId']) && !empty($selectParams['salesManId'])){
  2677. $whereSql .= ' AND salesManId = '.$selectParams['salesManId'];
  2678. }
  2679. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])){
  2680. $whereSql .= ' AND customerType = '.$selectParams['customerType'];
  2681. }
  2682. //订单状态
  2683. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  2684. $whereSql = self::buildStateSqlAttr($whereSql, $selectParams['state']);
  2685. }
  2686. //数据域
  2687. if (isset($selectParams['orderType']) && $selectParams['orderType'] == StatusCode::$orderType['cashierOrder'] && isset($selectParams['cashierUid']) && !empty($selectParams['cashierUid'])) {
  2688. //收银台列表
  2689. } else {
  2690. $whereSql = parent::getSalesManQueryParams($whereSql);
  2691. }
  2692. $whereSql = parent::getShopIdQueryParams($whereSql);
  2693. $whereSql .= ' order by createTime desc';
  2694. $sql = 'select ' . $fields . ' from qianniao_order_index_' . $this->onlineEnterpriseId . ' where deleteStatus = ' . StatusCode::$standard.$whereSql;
  2695. $countSql = 'select ' . $countFields . ' from qianniao_order_index_' . $this->onlineEnterpriseId . ' where deleteStatus = ' . StatusCode::$standard.$whereSql;
  2696. return [
  2697. 'sql' => $sql,
  2698. 'countSql' => $countSql
  2699. ];
  2700. }
  2701. /**
  2702. * Doc: (des="state标示多选sql处理")
  2703. * User: XMing
  2704. * Date: 2020/7/13
  2705. * Time: 9:38 上午
  2706. * @param string $sql
  2707. * @param mixed $states
  2708. * @return string
  2709. */
  2710. private static function buildStateSqlAttr(string $sql, $states)
  2711. {
  2712. if (is_array($states)) {
  2713. if (in_array('all', $states)) {
  2714. return $sql;
  2715. }
  2716. foreach ($states as $index => $state) {
  2717. $sql .= $index == 0 ? ' and (' . self::stateSql($state) : ' or ' . self::stateSql($state);
  2718. }
  2719. $sql .= ') ';
  2720. } else {
  2721. if ($states == 'all') {
  2722. return $sql;
  2723. }
  2724. $stateSql = self::stateSql($states);
  2725. if (!empty($stateSql)) {
  2726. $sql .= ' and ' . self::stateSql($states);
  2727. }
  2728. }
  2729. return $sql;
  2730. }
  2731. /**
  2732. * Doc: (des="state标示对应sql")
  2733. * User: XMing
  2734. * Date: 2020/7/13
  2735. * Time: 9:43 上午
  2736. * @param string $state
  2737. * @return string
  2738. */
  2739. private static function stateSql(string $state)
  2740. {
  2741. $sql = '';
  2742. switch ($state) {
  2743. case 'waitAudit'://待审核
  2744. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditing'] . ' and orderStatus != ' . StatusCode::$orderStatus['close'] . ')';
  2745. break;
  2746. case 'waitOutStock'://待出库
  2747. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and (orderStatus = ' . StatusCode::$orderStatus['waitPay'] . ' or orderStatus = ' . StatusCode::$orderStatus['waitDelivery'] . ')) ';
  2748. break;
  2749. case 'hasOutStock'://已出库
  2750. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and orderStatus = ' . StatusCode::$orderStatus['waitReceive'] . ')';
  2751. break;
  2752. case 'finish'://已完成
  2753. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and orderStatus = ' . StatusCode::$orderStatus['finish'] . ')';
  2754. break;
  2755. case 'close'://已关闭
  2756. $sql .= ' (orderStatus = ' . StatusCode::$orderStatus['close'] . ')';
  2757. break;
  2758. case 'all'://全部订单
  2759. break;
  2760. }
  2761. return $sql;
  2762. }
  2763. /**
  2764. * 删除订单视图
  2765. */
  2766. public function dropView()
  2767. {
  2768. $sql = 'DROP VIEW ' . $this->orderStatisticsTableName . '_' . $this->onlineEnterpriseId;
  2769. $dbResult = $this->objDOrder->query($sql);
  2770. if ($dbResult === false) {
  2771. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2772. }
  2773. return ResultWrapper::success('删除成功');
  2774. }
  2775. /**
  2776. * 判断表是否存在
  2777. * @param $tableName
  2778. */
  2779. public function existsTable($tableName)
  2780. {
  2781. $exists = $this->objDOrder->existsTable($tableName);
  2782. if (!$exists) {
  2783. //不存在删除视图
  2784. self::dropView();
  2785. }
  2786. }
  2787. /**
  2788. * 添加银行打款数据
  2789. */
  2790. public function addOrderBankData($orderBankData)
  2791. {
  2792. //切换分表
  2793. $fix = $fix = ceil($this->onlineUserId / $this->cutTable);
  2794. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  2795. foreach ($orderBankData['orderId'] as $key => $value){
  2796. //获取订单信息
  2797. $orderData = $this->objDOrder->get(['id' => $value]);
  2798. if ($orderData === false) {
  2799. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2800. }
  2801. if(empty($orderData)){
  2802. return ResultWrapper::fail('订单不存在', ErrorCode::$contentNotExists);
  2803. }
  2804. $orderData['extends'] = json_decode($orderData['extends'], true);
  2805. $orderData['extends']['bankData'] = $orderBankData['bankData'];
  2806. $orderData['extends'] = json_encode($orderData['extends']);
  2807. $dbReuslt = $this->objDOrder->update(['extends'=>$orderData['extends'],'updateTime'=>time()], $value);
  2808. if ($dbReuslt === false) {
  2809. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2810. }
  2811. }
  2812. return ResultWrapper::success($dbReuslt);
  2813. }
  2814. /**
  2815. * Doc: (des="审核订单,到出库单")
  2816. * User: XMing
  2817. * Date: 2020/7/14
  2818. * Time: 6:38 下午
  2819. * @param array $params
  2820. * @return ResultWrapper
  2821. * @throws \Exception
  2822. */
  2823. public function updateAuditStatus(array $params)
  2824. {
  2825. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  2826. $orderIndex = $this->objDOrderIndex->get(['id' => $params['id']]);
  2827. if ($orderIndex === false) {
  2828. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  2829. }
  2830. if (empty($orderIndex)) {
  2831. return ResultWrapper::fail('没有找到订单信息', ErrorCode::$paramError);
  2832. }
  2833. if ($orderIndex['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2834. return ResultWrapper::fail('当前订单已经审核通过!', ErrorCode::$paramError);
  2835. }
  2836. if ($this->isCashier === false) {
  2837. //在线支付的订单必须是已支付才能审核
  2838. if ($orderIndex['payType'] == StatusCode::$payType['wxPay'] || $orderIndex['payType'] == StatusCode::$payType['aliPay']) {
  2839. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass'] && $orderIndex['payStatus'] == StatusCode::$delete) {
  2840. return ResultWrapper::fail('订单尚未支付,不能审核', ErrorCode::$notAllowAccess);
  2841. }
  2842. }
  2843. }
  2844. //切换分表
  2845. $fix = $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  2846. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  2847. //获取订单信息
  2848. $orderData = $this->objDOrder->get(['id' => $params['id']]);
  2849. if ($orderData === false) {
  2850. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2851. }
  2852. // 银行打款支付方式审核之前需要判断是否上传凭证
  2853. if( $orderData['payType'] == StatusCode::$payType['bankLoans'] ){
  2854. $extends = json_decode($orderData['extends'],true);
  2855. if (!array_key_exists('bankData',$extends)){
  2856. return ResultWrapper::fail('该订单未上传银行打款凭证', ErrorCode::$paramError);
  2857. }
  2858. $customerData = $this->objDCustomer->get(['id'=>$orderData['customerId']]);
  2859. if ($customerData === false) {
  2860. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  2861. }
  2862. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  2863. // 银行打款上传凭证小程序订阅消息
  2864. $sendMessageData = [
  2865. 'date4' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime'])], // 提交时间
  2866. 'thing10' => [ 'value' => $customerData['name'] ], // 申请人
  2867. 'thing2' => [ 'value' => '银行打款凭证是否通过'], // 审核内容
  2868. 'date3' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 审核时间
  2869. 'phrase1' => [ 'value' => $orderData['auditStatus'] == StatusCode::$auditStatus['auditPass'] ? '审核通过':'审核未通过'], // 审核结果
  2870. ];
  2871. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  2872. $result = $objMSystemPushMessage->sendWeiXinPushMessage(4, $customerData['openId'], $sendMessageData);
  2873. if(!$result->isSuccess()){
  2874. file_put_contents('/www/wwwroot/logs/api.junhailan.com/wexinPushMessage.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  2875. }
  2876. }
  2877. }
  2878. $this->objDOrderIndex->beginTransaction();
  2879. // 生成收款单
  2880. $receivedResult = self::createReceived($orderData);
  2881. if (!$receivedResult->isSuccess()) {
  2882. $this->objDOrderIndex->rollBack();
  2883. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  2884. }
  2885. $update = [
  2886. 'auditStatus' => $params['auditStatus'],
  2887. 'updateTime' => time(),
  2888. ];
  2889. if ( $orderData['payType'] == StatusCode::$payType['bankLoans'] ){//银行打款更新payStatus,orderStatus
  2890. $update = [
  2891. 'auditStatus' => $params['auditStatus'],
  2892. 'payStatus' => StatusCode::$standard,
  2893. 'orderStatus' => StatusCode::$orderStatus['waitDelivery'],
  2894. 'updateTime' => time(),
  2895. ];
  2896. }
  2897. //操作索引表
  2898. $orderIndexUpdate = $this->objDOrderIndex->update($update, ['id' => $params['id']]);
  2899. if ($orderIndexUpdate === false) {
  2900. $this->objDOrderIndex->rollBack();
  2901. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $this->objDOrderIndex->error());
  2902. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  2903. }
  2904. //操作订单表
  2905. $orderUpdate = $this->objDOrder->update($update, $params['id']);
  2906. if ($orderUpdate === false) {
  2907. $this->objDOrderIndex->rollBack();
  2908. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $this->objDOrder->error());
  2909. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2910. }
  2911. //订单审核出库
  2912. $outId = 0;
  2913. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2914. $orderData['auditId'] = $params['auditId'];
  2915. $orderData['audit'] = $params['audit'];
  2916. $addInventoryOutResult = self::addInventoryOut($params['id'], $orderData, $orderData['userCenterId']);
  2917. if (!$addInventoryOutResult->isSuccess()) {
  2918. $this->objDOrderIndex->rollBack();
  2919. return ResultWrapper::fail($addInventoryOutResult->getData(), $addInventoryOutResult->getErrorCode());
  2920. }
  2921. $outId = $addInventoryOutResult->getData();
  2922. }
  2923. $this->objDOrderIndex->commit();
  2924. /*
  2925. //跟新es
  2926. $_id = self::createEsDocumentId($params['id']);
  2927. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  2928. self::runProcessNextOut($outId,$orderData);
  2929. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2930. return ResultWrapper::success($outId);
  2931. }
  2932. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  2933. // 订单审核通过
  2934. $sendMessageData = [
  2935. 'date4' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime'])], // 提交时间
  2936. 'thing2' => [ 'value' => '银行打款凭证是否通过'], // 审核内容
  2937. 'phrase1' => [ 'value' => $orderData['auditStatus'] == 2 ? '审核通过':'审核未通过'], // 审核结果
  2938. 'date3' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 审核时间
  2939. ];
  2940. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  2941. $result = $objMSystemPushMessage->sendWeiXinPushMessage(6, $customerData['openId'], $sendMessageData);
  2942. if(!$result->isSuccess()){
  2943. file_put_contents('/www/wwwroot/logs/api.junhailan.com/shenhe.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  2944. }
  2945. }
  2946. return ResultWrapper::success('操作成功');
  2947. }
  2948. /**
  2949. * Doc: (des="step 3: 审核出库")
  2950. * User: XMing
  2951. * Date: 2020/11/9
  2952. * Time: 9:24 上午
  2953. * @param array $order
  2954. * @param int $outId
  2955. * @return ResultWrapper
  2956. * @throws \Exception
  2957. */
  2958. private function runProcessNextOut(int $outId,array $order): ResultWrapper
  2959. {
  2960. if (empty($outId)){
  2961. return ResultWrapper::success(true);
  2962. }
  2963. if ($order['orderType'] != StatusCode::$orderType['saleOrder']){
  2964. return ResultWrapper::success(true);
  2965. }
  2966. $setResult = $this->objMProcessSetting->getProcessSettingByType(StatusCode::$processType['sales'],'out');
  2967. if (!$setResult->isSuccess()){
  2968. Logger::logs(E_USER_ERROR,'获取流程配置出错',__CLASS__,__LINE__,$setResult->getData());
  2969. return ResultWrapper::fail($setResult->getData(),$setResult->getErrorCode());
  2970. }
  2971. $set = $setResult->getData();
  2972. if (empty($set)){
  2973. Logger::logs(E_USER_ERROR,'配置为空',__CLASS__,__LINE__,'');
  2974. return ResultWrapper::success(true);
  2975. }
  2976. if (isset($set['enableStatus']) && $set['enableStatus'] == StatusCode::$standard){
  2977. Logger::logs(E_USER_ERROR,'配置',__CLASS__,__LINE__,$set);
  2978. return ResultWrapper::success(true);
  2979. }
  2980. $params = [
  2981. 'id' => $outId,
  2982. 'auditId' => $this->onlineUserId,//操作人id
  2983. 'auditName' => '自动审核',//操作人姓名
  2984. ];
  2985. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  2986. $result = $objMInventoryOut->updateInventoryOutStatus($params);
  2987. if (!$result->isSuccess()){
  2988. Logger::logs(E_USER_ERROR,'自动审核出库单出错',__CLASS__,__LINE__,$result->getData());
  2989. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  2990. }
  2991. Logger::logs(E_USER_ERROR,'自动审核出库单成功',__CLASS__,__LINE__,$outId);
  2992. return ResultWrapper::success(true);
  2993. }
  2994. /**
  2995. * Doc: (des="后台代客下单创建收款单")
  2996. * User: XMing
  2997. * Date: 2020/11/5
  2998. * Time: 5:31 下午
  2999. * @param array $orderData
  3000. * @return ResultWrapper
  3001. * @throws \Exception
  3002. */
  3003. private function createReceived(array $orderData): ResultWrapper
  3004. {
  3005. // 银行打款
  3006. if ($orderData['payType'] == StatusCode::$payType['bankLoans']){
  3007. $orderExtendsData = json_decode($orderData['extends'], true);
  3008. // 组装收款单账户数据
  3009. $accountListData[] = [
  3010. 'discountMoney' => 0,
  3011. 'money' => $orderData['payAmount'],
  3012. 'payWay' => StatusCode::$payType[4],
  3013. 'remark' => '银行打款生成收款',
  3014. 'accountId' => ($orderExtendsData['bankData']['id']) ? : 0,
  3015. 'accountName' => ($orderExtendsData['bankData']['name']) ? : '',
  3016. 'accountNumber' => ($orderExtendsData['bankData']['accountNumber']) ? : '',
  3017. 'finalMoney' => $orderData['payAmount'],
  3018. ];
  3019. $orderData['accountList'] = json_encode($accountListData);
  3020. $orderData['currentAccountName'] = ($orderExtendsData['bankData']['name']) ? : '';
  3021. }
  3022. //生成收款单
  3023. if ( ($orderData['orderType'] == StatusCode::$orderType['saleOrder'] || $orderData['orderType'] == StatusCode::$orderType['salesSlip']) &&
  3024. $orderData['source'] == StatusCode::$source['manage'] &&
  3025. !empty($orderData['accountList']) &&
  3026. !empty(floatval($orderData['receivedMoney'])) || ( $orderData['payType'] == StatusCode::$payType['bankLoans'] )//银行打款也生成收款单
  3027. ) {
  3028. $this->objDOrderIndex->beginTransaction();
  3029. //生成收款单
  3030. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->onlineUserId);
  3031. //创建收款单
  3032. $received = [
  3033. 'currentAccountName' => $orderData['currentAccountName'],
  3034. 'financeType' => '银行打款收款',
  3035. 'financeTypeId' => 2,
  3036. 'shopId' => $orderData['shopId'],
  3037. 'shopName' => $orderData['shopName'],
  3038. 'receiptTime' => time(),
  3039. 'operatorId' => $this->onlineUserId,
  3040. 'accountList' => json_decode($orderData['accountList'], true),
  3041. 'customerId' => $orderData['customerId'],
  3042. 'customerName' => $orderData['customerName'],
  3043. 'sourceNo' => $orderData['no'],
  3044. 'sourceId' => $orderData['id'],
  3045. 'originId' => $orderData['id'],
  3046. 'originNo' => $orderData['originNo'],
  3047. 'sourceNoMoney' => $orderData['receivedMoney'],
  3048. 'extends' => isset($orderExtendsData['bankData']) ? json_encode($orderExtendsData['bankData']) : '[]',
  3049. 'createTime' => time(),
  3050. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3051. 'updateTime' => time(),
  3052. ];
  3053. $receivedResult = $objMReceived->addReceived($received, true);
  3054. if (!$receivedResult->isSuccess()) {
  3055. $this->objDOrderIndex->rollBack();
  3056. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  3057. }
  3058. $up = [];
  3059. if ($orderData['receivedMoney'] >= $orderData['payAmount']) {
  3060. $up = [
  3061. 'payStatus' => StatusCode::$standard,
  3062. 'updateTime' => time(),
  3063. ];
  3064. }else{
  3065. if ($orderData['receivedMoney'] != 0){
  3066. $up = [
  3067. 'payStatus' => StatusCode::$offline,//部分收款
  3068. 'updateTime' => time(),
  3069. ];
  3070. }
  3071. }
  3072. if (!empty($up)){
  3073. $result = $this->objDOrderIndex->update($up, $orderData['id']);
  3074. if ($result === false) {
  3075. $this->objDOrderIndex->rollBack();
  3076. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3077. }
  3078. $result = $this->objDOrder->update($up, $orderData['id']);
  3079. if ($result === false) {
  3080. $this->objDOrderIndex->rollBack();
  3081. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3082. }
  3083. }
  3084. $this->objDOrderIndex->commit();
  3085. }
  3086. return ResultWrapper::success(true);
  3087. }
  3088. /**
  3089. * Doc: (des="订单审核出库,使用此方法一定要注意在上文获取当前订单的userCenterId用于下文切换分表")
  3090. * User: XMing
  3091. * Date: 2020/7/15
  3092. * Time: 9:48 上午
  3093. * @param array $orderData
  3094. * @param int $id
  3095. * @param int $thisOnlineUserId 当前订单的用户id,用来切换分表
  3096. * @return ResultWrapper
  3097. * @throws \Exception
  3098. */
  3099. private function addInventoryOut(int $id, array $orderData, int $thisOnlineUserId)
  3100. {
  3101. //查询订单商品表
  3102. $objMOrderGoods = new MOrderGoods($thisOnlineUserId, $this->onlineEnterpriseId);
  3103. $selectData = ['orderId' => $id];
  3104. $orderGoodsDataObj = $objMOrderGoods->getOrderGoodsByOrderIds($selectData);
  3105. if (!$orderGoodsDataObj->isSuccess()) {
  3106. return ResultWrapper::fail($orderGoodsDataObj->getData(), ErrorCode::$dberror);
  3107. }
  3108. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  3109. $totalResult = $objMInventoryOut->getTotalByOrderId($orderData['id']);
  3110. if (!$totalResult->isSuccess()){
  3111. return ResultWrapper::fail($totalResult->getData(),$totalResult->getErrorCode());
  3112. }
  3113. $total = (int)$totalResult->getData();
  3114. if ($total > 0){
  3115. //已经生成过出库单了
  3116. Logger::logs(E_USER_ERROR, '订单id:'.$orderData['id'].',重复生成出库单', __CLASS__, __LINE__,$orderData);
  3117. return ResultWrapper::fail('不要重复操作,避免生成成多个出库单',ErrorCode::$paramError);
  3118. }
  3119. //查询商铺id对应的仓库数据
  3120. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  3121. $modelResult = $objMShop->getShopDataByShopIds([$orderData['shopId']]);
  3122. if (!$modelResult->isSuccess()) {
  3123. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  3124. }
  3125. $shopData = $modelResult->getData();
  3126. unset($modelResult);
  3127. //获取订单收货信息
  3128. $orderReceiveDbResult = [];
  3129. if ($orderData['deliveryType'] == StatusCode::$deliveryType['goodsDelivery']) {
  3130. $fix = ceil($thisOnlineUserId / $this->cutTable);
  3131. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  3132. $orderReceiveDbResult = $this->objDOrderReceive->get(['orderId' => $id]);
  3133. if ($orderReceiveDbResult === false) {
  3134. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  3135. }
  3136. if (empty($orderReceiveDbResult)) {
  3137. return ResultWrapper::fail('订单收货地址查询失败', ErrorCode::$dberror);
  3138. }
  3139. }
  3140. $objMCustomer = new MCustomer($this->onlineEnterpriseId,$this->onlineUserId);
  3141. $customerResult = $objMCustomer->getCustomerByCustomerId($orderData['customerId']);
  3142. if (!$customerResult->isSuccess()){
  3143. return ResultWrapper::fail($customerResult->getData(),$customerResult->getErrorCode());
  3144. }
  3145. $customer = $customerResult->getData();
  3146. $orderGoodsData = $orderGoodsDataObj->getData();//订单商品数据
  3147. $saleOutData = [
  3148. 'sourceId' => $orderData['id'],
  3149. 'sourceNo' => $orderData['no'],
  3150. 'originNo' => $orderData['no'],
  3151. 'originId' => $orderData['id'],
  3152. 'shopId' => $orderData['shopId'],
  3153. 'shopName' => $orderData['shopName'],
  3154. 'amount' => $orderData['payAmount'],
  3155. 'operatorId' => $orderData['auditId'],//操作人id
  3156. 'operatorName' => $orderData['audit'],//操作人信息
  3157. 'customerId' => $orderData['customerId'],
  3158. 'customerName' => $orderData['customerName'],
  3159. 'customerCode' => createCode(StatusCode::$code['customer']['prefix'], $orderData['customerId'], StatusCode::$code['customer']['length']),
  3160. 'customerMobile' => isset($customer['mobile']) ? $customer['mobile'] : '',
  3161. 'source' => StatusCode::$orderType['saleOrder'], //订单来源(出库类型)
  3162. 'type' => StatusCode::$orderType['saleOut'],
  3163. 'deliveryType' => $orderData['deliveryType'],//配送方式
  3164. 'remark' => $orderData['remark'],
  3165. ];
  3166. $saleOutData['materielNum'] = 0;
  3167. //获取sku
  3168. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  3169. $skuIds = array_column(array_values($orderGoodsData), 'skuId');
  3170. $modelResult = $objMSku->getSkuDataBySkuIds($skuIds);
  3171. if (!$modelResult->isSuccess()) {
  3172. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  3173. }
  3174. $skuData = $modelResult->getData();
  3175. unset($modelResult);
  3176. foreach ($orderGoodsData as $key => $value) {
  3177. $saleOutData['materielNum']++;
  3178. $totalMoney = bcsub(bcsub($value['totalMoney'], $value['vipDiscount']), $value['preferential']);//销售总价 !优惠后
  3179. $saleOutData['orderGoodsData'][] = [
  3180. 'materielId' => $value['goodsBasicId'],
  3181. 'materielName' => $value['goodsName'],
  3182. 'materielCode' => createCode(StatusCode::$code['goodsBasic']['prefix'], $value['goodsBasicId'], StatusCode::$code['goodsBasic']['length']),
  3183. 'skuId' => $value['skuId'],
  3184. 'num' => $value['buyNum'],
  3185. 'otherNum' => $value['otherNum'],
  3186. 'outNum' => 0,
  3187. 'total' => $value['buyNum'],
  3188. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  3189. 'skuName' => isset($skuData[$value['skuId']]) ? $skuData[$value['skuId']]['skuName'] : '',
  3190. 'unitPrice' => $value['price'],//单价 不优惠
  3191. 'totalPrice' => $totalMoney,//销售总价 !优惠后
  3192. 'extend' => $value['extends'],
  3193. 'isEq' => $value['isEq'],
  3194. ];
  3195. }
  3196. $dbResult = $objMInventoryOut->addInventoryOut($saleOutData);
  3197. if (!$dbResult->isSuccess()) {
  3198. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $dbResult->getData());
  3199. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  3200. }
  3201. self::noticeStatistics([
  3202. 'userCenterId' => $thisOnlineUserId,
  3203. 'enterpriseId' => $this->onlineEnterpriseId,
  3204. 'customerId' => $orderData['customerId'],
  3205. 'no' => $orderData['no'],
  3206. 'noticeType' => 'audit',//审核
  3207. ], 'MOrderStatistics');
  3208. //添加日志
  3209. parent::saveLog([
  3210. 'no' => $orderData['no'],
  3211. 'actionType' => '审核通过',
  3212. 'operationData' => '',
  3213. 'userCenterId' => $this->onlineUserId,
  3214. 'enterpriseId' => $this->onlineEnterpriseId,
  3215. 'createTime' => time(),
  3216. ]);
  3217. self::sendMessage($this->onlineEnterpriseId,'NewOrder','stockOut');
  3218. return ResultWrapper::success($dbResult->getData());
  3219. }
  3220. /**
  3221. * 批量审核
  3222. * @param array $params
  3223. * @return ResultWrapper
  3224. * @throws \Exception
  3225. */
  3226. public function batchUpdateAuditStatus(array $params)
  3227. {
  3228. $auditParam = [
  3229. 'audit' => $params['audit'],
  3230. 'auditId' => $params['auditId'],
  3231. 'auditStatus' => $params['auditStatus']
  3232. ];
  3233. foreach ($params['ids'] as $id) {
  3234. $auditParam['id'] = $id;
  3235. $result = self::updateAuditStatus($auditParam);
  3236. if (!$result->isSuccess()) {
  3237. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3238. }
  3239. }
  3240. return ResultWrapper::success("审核成功");
  3241. }
  3242. /**
  3243. * Doc: (des="修改订单的状态,orderStatus")
  3244. * User: XMing
  3245. * Date: 2020/7/14
  3246. * Time: 5:25 下午
  3247. * @param $id
  3248. * @param $selectParams
  3249. * @param array $header
  3250. * @return ResultWrapper
  3251. * @throws \Exception
  3252. */
  3253. public function updateOrderStatus($id, $selectParams, array $header)
  3254. {
  3255. // 查询订单索引表数据
  3256. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  3257. $orderIndex = $this->objDOrderIndex->get(['id' => $id], 'userCenterId,payStatus,createTime,customerId,no,updateTime');
  3258. if ($orderIndex === false) {
  3259. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3260. }
  3261. if (empty($orderIndex)) {
  3262. return ResultWrapper::fail('订单信息不存在', ErrorCode::$paramError);
  3263. }
  3264. // 后台设置的审核通过不能取消订单
  3265. $objEnterpriseCache = new EnterpriseCache();
  3266. $enterSettingData = $objEnterpriseCache->getEnterpriseSetting($this->onlineEnterpriseId);
  3267. if(isset($enterSettingData['cancelOrder']) && $enterSettingData['cancelOrder'] == StatusCode::$delete && $orderIndex['auditStatus'] == StatusCode::$auditStatus['auditPass'] && $selectParams['orderStatus'] == StatusCode::$orderStatus['close']){
  3268. return ResultWrapper::fail('当前订单已经审核通过,暂不支持取消,请联系客服处理', ErrorCode::$notAllowAccess);
  3269. }
  3270. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close']
  3271. && isset($orderIndex['outStatus']) && $orderIndex['outStatus'] == StatusCode::$standard) {
  3272. return ResultWrapper::fail('已经发货订单不能取消', ErrorCode::$paramError);
  3273. }
  3274. // 切换订单分表,查询订单主单据数据
  3275. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);;
  3276. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  3277. $orderData = $this->objDOrder->get(['id' => $id]);
  3278. if($orderData === false) {
  3279. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3280. }
  3281. if(empty($orderData)){
  3282. return ResultWrapper::fail('要操作的订单不存在', ErrorCode::$contentNotExists);
  3283. }
  3284. $this->objDOrderIndex->beginTransaction();
  3285. $selectParams['cancelbeforeOrderStatus'] = $orderData["orderStatus"];
  3286. // 更新订单表
  3287. $orderData['extends'] = json_decode($orderData['extends'], true);
  3288. if( !empty($selectParams['cancelReason']) ){
  3289. $orderData['extends']['cancelReason'] = $selectParams['cancelReason'];
  3290. $orderData['extends']['cancelbeforeOrderStatus'] = $selectParams['cancelbeforeOrderStatus'];
  3291. $selectParams['successFullyTime'] = time();
  3292. }
  3293. if( !empty($selectParams['cancelRejectReason']) ){
  3294. $orderData['extends']['cancelRejectReason'] = $selectParams['cancelRejectReason'];
  3295. $selectParams['orderStatus'] = $orderData['extends']['cancelbeforeOrderStatus']; // 取消被拒恢复到取消之前的订单状态
  3296. }
  3297. // 更新索引表
  3298. $orderIndexUpdate = $this->objDOrderIndex->update([
  3299. 'orderStatus' => $selectParams['orderStatus'],
  3300. 'updateTime' => time()
  3301. ], ['id' => $id]);
  3302. if ($orderIndexUpdate === false) {
  3303. $this->objDOrderIndex->rollBack();
  3304. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3305. }
  3306. $selectParams['extends'] = json_encode($orderData['extends']);
  3307. $selectParams['updateTime'] = time();
  3308. unset($selectParams['cancelReason']);
  3309. unset($selectParams['cancelRejectReason']);
  3310. unset($selectParams['cancelbeforeOrderStatus']);
  3311. $orderUpdate = $this->objDOrder->update($selectParams, ['id' => $id]);
  3312. if ($orderUpdate === false) {
  3313. $this->objDOrderIndex->rollBack();
  3314. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3315. }
  3316. // 取消订单
  3317. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close']) {
  3318. // 解锁库存
  3319. $unlockResult = self::unlockInventory($id, $orderData);
  3320. if (!$unlockResult->isSuccess()) {
  3321. $this->objDOrderIndex->rollBack();
  3322. return ResultWrapper::fail($unlockResult->getData(), $unlockResult->getErrorCode());
  3323. }
  3324. // 已经支付订单做自动退款处理
  3325. if($orderData['payStatus'] == StatusCode::$standard){
  3326. // 生成财务退款单
  3327. $financeRefundData = [
  3328. 'originId' => getArrayItem($orderData,'id',0),
  3329. 'originNo' => getArrayItem($orderData,'no',''),
  3330. 'sourceId' => getArrayItem($orderData,'id',0),
  3331. 'sourceNo' => getArrayItem($orderData,'no',''),
  3332. 'refundTime' => time(),
  3333. 'createTime' => time(),
  3334. 'updateTime' => time(),
  3335. 'unitId' => getArrayItem($orderData,'customerId',0),
  3336. 'unitName' => getArrayItem($orderData,'customerName',0),
  3337. 'currentAccountName' => getArrayItem($orderData,'customerName',''),
  3338. 'financeType' => '订单取消退款',
  3339. 'financeTypeId' => 1,
  3340. 'payType' =>getArrayItem($orderData,'payType',''),
  3341. 'shopId' => getArrayItem($orderData,'shopId',0),
  3342. 'shopName' => getArrayItem($orderData,'shopName',0),
  3343. 'money' => $orderData['payAmount'],
  3344. 'operatorId' => $this->onlineUserId,
  3345. 'type' => StatusCode::$standard,
  3346. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3347. 'remark' => '订单取消,订单编号:'. getArrayItem($orderData,'no','').'需退款金额:'.$orderData['payAmount'],
  3348. ];
  3349. // 根据订单支付方式规划退款账户
  3350. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  3351. $extends = is_array($orderData['extends'])?$orderData['extends']: json_decode($orderData['extends'], true);
  3352. if(isset($extends['admixPayData'])){ // 组合支付
  3353. foreach ($extends['admixPayData'] as $key => $value){
  3354. $financeAccountData = $objMAccount->getDefaultAccount($value['payType']);
  3355. if(!$financeAccountData->isSuccess()){
  3356. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  3357. }
  3358. $financeAccountData = $financeAccountData->getData();
  3359. $financeRefundData['accountList'][] = [
  3360. 'accountId' => $financeAccountData['id'],
  3361. 'accountNumber' => $financeAccountData['accountNumber'],
  3362. 'accountName' => $financeAccountData['name'],
  3363. 'money' => $value['payMoney'],
  3364. ];
  3365. }
  3366. }else{
  3367. $financeAccountData = $objMAccount->getDefaultAccount($orderData['payType']);
  3368. if(!$financeAccountData->isSuccess()){
  3369. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  3370. }
  3371. $financeAccountData = $financeAccountData->getData();
  3372. $financeRefundData['accountList'] = [
  3373. [
  3374. 'accountId' => $financeAccountData['id'],
  3375. 'accountNumber' => $financeAccountData['accountNumber'],
  3376. 'accountName' => $financeAccountData['name'],
  3377. 'money' => $orderData['payAmount'],
  3378. ]
  3379. ];
  3380. }
  3381. $objMRefund = new MRefund($this->onlineEnterpriseId,$this->onlineUserId);
  3382. $result = $objMRefund->addRefund($financeRefundData);
  3383. if(!$result->isSuccess()){
  3384. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  3385. }
  3386. // 自动审核退款单
  3387. $result = $objMRefund->updateRefundStatus(['id'=>$result->getData(),'createTime'=>time()]);
  3388. if(!$result->isSuccess()){
  3389. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  3390. }
  3391. }
  3392. // 订单审核待出库时取消订单 同步删除销售出库单
  3393. if($orderData['auditStatus'] == StatusCode::$auditStatus['auditPass']){
  3394. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  3395. $inventoryOutResult = $objMInventoryOut->delInventoryOutStatus(['originId' => $orderData['id']]);
  3396. if (!$inventoryOutResult->isSuccess()) {
  3397. $this->objDOrderIndex->rollBack();
  3398. return ResultWrapper::fail($inventoryOutResult->getData(), $inventoryOutResult->getErrorCode());
  3399. }
  3400. }
  3401. $customerData = $this->objDCustomer->get(['id'=>$orderData['customerId']]);
  3402. if ($customerData === false) {
  3403. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3404. }
  3405. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  3406. // 后台取消订单小程序订阅消息
  3407. $sendMessageData = [
  3408. 'character_string13' => [ 'value' => StatusCode::$noPrefix[1] . '-' . $orderData['no']], // 订单编号
  3409. 'date10' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime']) ], // 下单时间
  3410. 'thing14' => [ 'value' => substr($orderData['shopName'],0,30)], // 门店名称
  3411. 'date2' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 取消时间
  3412. ];
  3413. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  3414. $result = $objMSystemPushMessage->sendWeiXinPushMessage(5, $customerData['openId'], $sendMessageData);
  3415. if(!$result->isSuccess()){
  3416. file_put_contents('/www/wwwroot/logs/api.junhailan.com/quxiao.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  3417. }
  3418. }
  3419. }
  3420. //订单完成
  3421. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['finish'] && !empty($header)) {
  3422. // 计算分销订单提成
  3423. $i = 1;
  3424. do {
  3425. $postData = [
  3426. 'topicName' => 'MyJob',
  3427. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  3428. 'topicMethon' => 'updateBalance',
  3429. 'topicMethonParams' => [
  3430. 'Authorization' => $header['Authorization'],
  3431. 'Token' => $header['Token'],
  3432. 'orderId' => $id,
  3433. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  3434. ],
  3435. ];
  3436. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  3437. $result = request($url, $postData);
  3438. $i++;
  3439. } while ($result['httpcode'] != 200 && $i <= 3);
  3440. // 计算用户积分 start
  3441. // 查询客户信息
  3442. $customerData = $this->objDCustomer->get($orderIndex['customerId']);
  3443. if ($customerData === false) {
  3444. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3445. }
  3446. // 查询订单商品数据
  3447. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  3448. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $fix);
  3449. $orderGoodsData = $this->objDOrderGoods->select(['deleteStatus'=>StatusCode::$standard,'orderId'=>$id]);
  3450. if ($orderGoodsData === false) {
  3451. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3452. }
  3453. // 调用计算积分方法
  3454. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  3455. $result = $objMCustomer->addCustomerIntegralByOrder(0, $customerData, $orderData, $orderGoodsData);
  3456. if(!$result->isSuccess()){
  3457. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3458. }
  3459. //调用计算提成方法
  3460. $objMStaff = new MStaff($this->onlineEnterpriseId, $this->onlineUserId);
  3461. $result = $objMStaff->addStaffRewardByOrder(0, $customerData, $orderData, $orderGoodsData);
  3462. if(!$result->isSuccess()){
  3463. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3464. }
  3465. //订单完成商户结算金额
  3466. $objMMerchantSettlement = new MMerchantSettlement($this->onlineEnterpriseId, $this->onlineUserId);
  3467. $updateMerchantSettlement = $objMMerchantSettlement->updateMerchantSettlement(['orderId'=>$orderData['id']]);
  3468. if(!$updateMerchantSettlement->isSuccess()){
  3469. return ResultWrapper::fail($updateMerchantSettlement->getData(), $updateMerchantSettlement->getErrorCode());
  3470. }
  3471. //只有小程序微信支付订单才可以计算分佣
  3472. if(!empty($orderData) && $orderData["payAmount"]>0 && $orderData["payType"]==1 && $orderData["source"]==3){
  3473. $checkData = [
  3474. "parentPath"=>$customerData["parentPath"],
  3475. "payAmount"=>$orderData["payAmount"],
  3476. ];
  3477. // PartnerTools::addTask($orderData["id"], $this->onlineEnterpriseId,$checkData);
  3478. }
  3479. }
  3480. //取消订单
  3481. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close'] && !empty($header)) {
  3482. $i = 1;
  3483. do {
  3484. $postData = [
  3485. 'topicName' => 'MyJob',
  3486. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  3487. 'topicMethon' => 'cancelSubCommission',
  3488. 'topicMethonParams' => [
  3489. 'Authorization' => $header['Authorization'],
  3490. 'Token' => $header['Token'],
  3491. 'orderId' => $id,
  3492. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  3493. ],
  3494. ];
  3495. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  3496. $result = request($url, $postData);
  3497. $i++;
  3498. } while ($result['httpcode'] != 200 && $i <= 3);
  3499. }
  3500. /*
  3501. //ES更新
  3502. $_id = self::createEsDocumentId($id);
  3503. $this->objDOrder->esupdateTypeFieldVaule(['orderStatus' => $selectParams['orderStatus']], $_id);*/
  3504. $this->objDOrderIndex->commit();
  3505. return ResultWrapper::success('操作成功');
  3506. }
  3507. /**
  3508. * Doc: (des="取消订单解锁库存")
  3509. * User: XMing
  3510. * Date: 2020/7/14
  3511. * Time: 5:54 下午
  3512. * @param int $id 订单id
  3513. * @param array $params 订单数据
  3514. * @return ResultWrapper
  3515. */
  3516. private function unlockInventory(int $id, array $params)
  3517. {
  3518. //解锁库存
  3519. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  3520. $unlockResult = $objMInventory->unlockInventory([$id], StatusCode::$orderType['saleOrder'], $params['createTime']);
  3521. if (!$unlockResult->isSuccess()) {
  3522. //暂时关闭,没发现有锁定的地方
  3523. // return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  3524. }
  3525. self::noticeStatistics([
  3526. 'userCenterId' => $this->onlineUserId,
  3527. 'enterpriseId' => $this->onlineEnterpriseId,
  3528. 'customerId' => $params['customerId'],
  3529. 'no' => $params['no'],
  3530. 'data' => $params,
  3531. 'noticeType' => 'close',//取消订单
  3532. ], 'MOrderStatistics');
  3533. //记录日志
  3534. parent::saveLog([
  3535. 'no' => $params['no'],
  3536. 'actionType' => '取消订单',
  3537. 'operationData' => '',
  3538. 'userCenterId' => $this->onlineUserId,
  3539. 'enterpriseId' => $this->onlineEnterpriseId,
  3540. 'createTime' => time(),
  3541. ]);
  3542. return ResultWrapper::success($unlockResult->getData());
  3543. }
  3544. /**
  3545. * Doc: (des="订单出库状态")
  3546. * User: XMing
  3547. * Date: 2020/12/28
  3548. * Time: 10:38 上午
  3549. * @param array $params
  3550. * @param array $where
  3551. * @param array $outInventoryMap
  3552. * @return ResultWrapper
  3553. * @throws \Exception
  3554. * @oaram $outInventoryMap
  3555. */
  3556. public function updateOutStatus(array $params,array $where,array $outInventoryMap): ResultWrapper
  3557. {
  3558. if (empty($where)) {
  3559. return ResultWrapper::fail('参数为空', ErrorCode::$paramError);
  3560. }
  3561. $orderIndex = $this->objDOrderIndex->get($where);
  3562. if ($orderIndex === false){
  3563. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  3564. }
  3565. if (empty($orderIndex)){
  3566. return ResultWrapper::fail('未获取到指定的订单信息',ErrorCode::$paramError);
  3567. }
  3568. $orderId = getArrayItem($orderIndex,'id',0);
  3569. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  3570. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  3571. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  3572. $this->objDOrderIndex->beginTransaction();
  3573. foreach ($outInventoryMap as $skuId => $outNum){
  3574. $row = $this->objDOrderGoods->get(['orderId' => $orderId, 'skuId' => $skuId, 'deleteStatus' => StatusCode::$standard]);
  3575. if ($row === false){
  3576. $this->objDOrderIndex->rollback();
  3577. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  3578. }
  3579. $update = [
  3580. 'outNum' => bcadd($row['outNum'],$outNum,2),
  3581. 'outOfNum' => bcsub($row['outOfNum'],$outNum,2),
  3582. 'updateTime' => time(),
  3583. ];
  3584. if ($update['outOfNum'] < 0){
  3585. Logger::logs(E_USER_ERROR,'企业:'.$this->onlineEnterpriseId.' 订单:'.$orderId.' 出库数量异常',__CLASS__,__LINE__,$row);
  3586. $this->objDOrderIndex->rollback();
  3587. return ResultWrapper::fail('出库数量异常',ErrorCode::$paramError);
  3588. }
  3589. $updateGoodsResult = $this->objDOrderGoods->update($update,['id' => $row['id']]);
  3590. if ($updateGoodsResult === false){
  3591. Logger::logs(E_USER_ERROR,'sql error',__CLASS__,__LINE__,$this->objDOrderGoods->error());
  3592. $this->objDOrderIndex->rollback();
  3593. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$paramError);
  3594. }
  3595. }
  3596. $outStatusResult = self::checkStockOutStatus($orderId);
  3597. if (!$outStatusResult->isSuccess()){
  3598. $this->objDOrderIndex->rollback();
  3599. return ResultWrapper::fail($outStatusResult->getData(),$outStatusResult->getErrorCode());
  3600. }
  3601. $outStatus = (int)$outStatusResult->getData();
  3602. $params['outStatus'] = $outStatus;//出库状态
  3603. $updateIndex = $this->objDOrderIndex->update($params,$orderId);
  3604. if ($updateIndex === false){
  3605. $this->objDOrderIndex->rollback();
  3606. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  3607. }
  3608. $updateOrder = $this->objDOrder->update($params,$orderId);
  3609. if ($updateOrder === false){
  3610. $this->objDOrderIndex->rollback();
  3611. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  3612. }
  3613. /*
  3614. $_id = self::createEsDocumentId($orderId);
  3615. $this->objDOrder->esupdateTypeFieldVaule($params, $_id);*/
  3616. $this->objDOrderIndex->commit();
  3617. return ResultWrapper::success($orderId);
  3618. }
  3619. /**
  3620. * Doc: (des="返回订单的出库")
  3621. * User: XMing
  3622. * Date: 2021/3/10
  3623. * Time: 10:35 上午
  3624. * @param int $orderId
  3625. * @return ResultWrapper
  3626. */
  3627. public function checkStockOutStatus(int $orderId): ResultWrapper
  3628. {
  3629. //检测是否都已经出库
  3630. $lists = $this->objDOrderGoods->select(['orderId' => $orderId,'deleteStatus' => StatusCode::$standard]);
  3631. if ($lists === false){
  3632. Logger::logs(E_USER_ERROR,'sql error',__CLASS__,__LINE__,$this->objDOrderGoods->error());
  3633. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  3634. }
  3635. if (empty($lists)){
  3636. return ResultWrapper::fail('订单商品获取失败',ErrorCode::$paramError);
  3637. }
  3638. foreach ($lists as $item){
  3639. if ($item['outOfNum'] > 0){
  3640. //还有未出库商品
  3641. return ResultWrapper::success(6);
  3642. }
  3643. }
  3644. return ResultWrapper::success(5);
  3645. }
  3646. /**
  3647. * Doc: (des="修改订单的支付状态")
  3648. * User: XMing
  3649. * Date: 2020/7/14
  3650. * Time: 5:18 下午
  3651. * @param $orderData
  3652. * @param $condition
  3653. * @param bool $isNotify
  3654. * @return ResultWrapper
  3655. * @throws \Exception
  3656. */
  3657. public function updateOrderPayData($orderData, $condition, $isNotify = false): ResultWrapper
  3658. {
  3659. $total_fel = 0;
  3660. if ($isNotify) {
  3661. $total_fel = $orderData['total_fel'];
  3662. unset($orderData['total_fel']);
  3663. }
  3664. if (isset($orderData['pay_way'])) {
  3665. $pay_way = $orderData['pay_way'];
  3666. unset($orderData['pay_way']);
  3667. }
  3668. // 查询订单数据
  3669. $orderInfoData = $this->objDOrder->select($condition);
  3670. if (empty($orderInfoData)) {
  3671. return ResultWrapper::fail('查询订单数据为空', ErrorCode::$paramError);
  3672. }
  3673. if ($orderInfoData === false) {
  3674. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3675. }
  3676. // 回调通知判断订单是否已经修改过订单状态
  3677. if ($isNotify == true && $orderInfoData[0]['payStatus'] == StatusCode::$standard) {
  3678. return ResultWrapper::fail('支付状态已经修改过了', ErrorCode::$notAllowAccess);
  3679. }
  3680. $this->objDOrder->beginTransaction();
  3681. // 如果之前是组合支付方式,修改支付方式的时候不能直接修改
  3682. if( in_array(StatusCode::$payType['balance'], explode(',', $orderInfoData[0]['payType'])) ){
  3683. $orderData['payType'] = $orderData['payType'].','.StatusCode::$payType['balance'];
  3684. $orderData['notPayMoney'] = bcsub($orderData['notPayMoney'], $orderData['total_fel'], 2);
  3685. }
  3686. $dbResult = $this->objDOrder->update($orderData, $condition);
  3687. if ($dbResult === false) {
  3688. $this->objDOrder->rollBack();
  3689. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3690. }
  3691. unset($dbResult);
  3692. if (!isset($condition['id'])) {
  3693. //查询订单id
  3694. $dbResult = $this->objDOrder->get($condition, 'id');
  3695. if ($dbResult === false) {
  3696. $this->objDOrder->rollBack();
  3697. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3698. }
  3699. if (empty($dbResult) || !isset($dbResult['id'])) {
  3700. $this->objDOrder->rollBack();
  3701. return ResultWrapper::fail('订单数据为空', ErrorCode::$dberror);
  3702. }
  3703. $condition['id'][] = $dbResult['id'];
  3704. unset($dbResult);
  3705. }
  3706. unset($orderData['notPayMoney']);
  3707. $dbResult = self::updateOrderIndex($orderData, $condition);
  3708. if (!$dbResult->isSuccess()) {
  3709. $this->objDOrder->rollBack();
  3710. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  3711. }
  3712. if (!is_array($condition['id'])){
  3713. $condition['id'] = [$condition['id']];
  3714. }
  3715. /*
  3716. foreach ($condition['id'] as $key => $value) {
  3717. $_id = self::createEsDocumentId($value);
  3718. $this->objDOrder->esupdateTypeFieldVaule($orderData, $_id);
  3719. }*/
  3720. //线上支付生成收款单$orderData['payStatus'] $condition['id'] 支付完成后回调这两个有值
  3721. if (isset($pay_way) && isset($orderData['payStatus']) && isset($condition['id'])) {
  3722. if ($orderData['payStatus'] == StatusCode::$standard) {
  3723. //拿到微信默认账户
  3724. $defaultAccountResult = $this->objMAccount->getDefaultAccount($pay_way);
  3725. if ($defaultAccountResult->isSuccess() == false) {
  3726. $this->objDOrder->rollBack();
  3727. return ResultWrapper::fail($defaultAccountResult->getData(), $defaultAccountResult->getErrorCode());
  3728. }
  3729. $defaultAccount = $defaultAccountResult->getData();
  3730. if(empty($defaultAccount)){
  3731. return ResultWrapper::fail('支付方式对应的银行账户为空', ErrorCode::$contentNotExists);
  3732. }
  3733. foreach ($orderInfoData as $orderInfo) {
  3734. // 组合支付,收款单金额重新计算
  3735. if( in_array(StatusCode::$payType['balance'], explode(',', $orderInfoData[0]['payType'])) ){
  3736. $orderInfo['extends'] = json_decode($orderInfo['extends'], true);
  3737. if( isset($orderInfo['extends']['admixPayData']) ){
  3738. foreach ($orderInfo['extends']['admixPayData'] as $key => $value){
  3739. if($value['payType'] == StatusCode::$payType['wxPay']){
  3740. $orderInfo['payAmount'] = $value['payMoney'];
  3741. }
  3742. }
  3743. }
  3744. }
  3745. //循环订单数据,拼接生成收款单
  3746. $receivedData = [
  3747. 'customerId' => $orderInfo['customerId'],
  3748. 'customerName' => $orderInfo['customerName'],
  3749. 'currentAccountName' => $orderInfo['shopName'],
  3750. 'financeType' => '线上支付收款',
  3751. 'financeTypeId' => StatusCode::$systemFinanceType['saleReceipt'],
  3752. 'shopId' => $orderInfo['shopId'],
  3753. 'shopName' => $orderInfo['shopName'],
  3754. 'receiptTime' => time(),
  3755. 'operatorId' => 0,
  3756. 'originId' => $orderInfo['id'],
  3757. 'originNo' => $orderInfo['no'],
  3758. 'sourceId' => $orderInfo['id'],
  3759. 'sourceNo' => $orderInfo['no'],
  3760. 'sourceNoMoney' => $orderInfo['payAmount'],
  3761. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3762. 'offsetMoney' => 0,
  3763. 'notOffsetMoney' => 0,
  3764. 'offsetStatus' => StatusCode::$delete,
  3765. 'createTime' => time(),
  3766. 'updateTime' => time(),
  3767. 'accountList' => [
  3768. [
  3769. "accountId" => isset($defaultAccount['id']) ? $defaultAccount['id'] : 0,
  3770. "accountNumber" => isset($defaultAccount['accountNumber']) ? $defaultAccount['accountNumber'] : '请设置默认的收款账户',
  3771. "money" => $orderInfo['payAmount'],
  3772. "discountMoney" => 0,
  3773. "finalMoney" => $orderInfo['payAmount'],
  3774. "payWay" => isset($pay_way) ? $pay_way . "支付" : '在线支付',
  3775. "remark" => "在线支付自动生成收款单"
  3776. ]
  3777. ],
  3778. ];
  3779. $result = $this->objMReceived->addReceived($receivedData, true);
  3780. if ($result->isSuccess() == false) {
  3781. $this->objDOrder->rollBack();
  3782. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3783. }
  3784. // 微信生成的收款单自动审核
  3785. if( in_array(StatusCode::$payType['wxPay'], explode(',', $orderInfoData[0]['payType'])) ){
  3786. $updateReceived = $this->objMReceived->updateReceivedStatus(['id'=>$result->getData(),'createTime'=>time()]);
  3787. if (!$updateReceived->isSuccess()) {
  3788. $this->objDOrder->rollBack();
  3789. return ResultWrapper::fail($updateReceived->getData(), $updateReceived->getErrorCode());
  3790. }
  3791. }
  3792. unset($receivedData);
  3793. unset($result);
  3794. }
  3795. }
  3796. }
  3797. if ($isNotify) {
  3798. self::runProcessNextAudit($condition['id']);
  3799. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  3800. $customer = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  3801. if (!$customer->isSuccess()) {
  3802. return ResultWrapper::fail($customer->getData(), $customer->getErrorCode());
  3803. }
  3804. $customer = $customer->getData();
  3805. parent::coupon([
  3806. 'userCenterId' => $this->onlineUserId,
  3807. 'enterpriseId' => $this->onlineEnterpriseId,
  3808. 'customerId' => isset($customer['id']) ? $customer['id'] : '',
  3809. 'payAmount' => isset($total_fel) ? $total_fel : 0,
  3810. ], 'MOnlinePayCoupon');
  3811. $objCustomerCache = new CustomerCache();
  3812. $objCustomerCache->delInterestCustomerAfterPay($customer['id'], $this->onlineEnterpriseId);
  3813. if (isset($customer['openId']) && !empty($customer['openId'])) {
  3814. /* $payment = '';
  3815. //判断支付方式
  3816. switch ($orderInfoData[0]['payType']) {
  3817. case StatusCode::$payType['wxPay']:
  3818. $payment = StatusCode::$payType[1];
  3819. break;
  3820. case StatusCode::$payType['balance']:
  3821. $payment = StatusCode::$payType[7];
  3822. break;
  3823. case StatusCode::$payType['cashPay']:
  3824. $payment = StatusCode::$payType[3];
  3825. break;
  3826. case StatusCode::$payType['bankLoans']:
  3827. $payment = StatusCode::$payType[4];
  3828. break;
  3829. }
  3830. $orderInfoData[0]['extends'] = json_decode($orderInfoData[0]['extends'], true);
  3831. if (isset($orderInfoData[0]['extends']['admixPayData'])) {
  3832. $payment = '组合支付';
  3833. }*/
  3834. // 发送小程序订阅消息
  3835. $sendMessageData = [
  3836. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfoData[0]['no']], // 订单编号
  3837. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfoData[0]['createTime'])], // 下单时间
  3838. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  3839. 'thing7' => ['value' => '微信支付'], // 支付方式
  3840. 'name8' => ['value' => substr($orderInfoData[0]['shopName'],0,30)] // 商家名称
  3841. ];
  3842. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  3843. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customer['openId'], $sendMessageData);
  3844. if (!$result->isSuccess()) {
  3845. file_put_contents('/www/wwwroot/logs/api.junhailan.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  3846. }
  3847. }
  3848. }
  3849. $this->objDOrder->commit();
  3850. $objMMerchantFlow = new MMerchantFlow($this->onlineEnterpriseId,$this->onlineUserId);
  3851. if ($isNotify == true || $orderData['payStatus'] == StatusCode::$standard){
  3852. foreach ($condition['id'] as $key => $id) {
  3853. $objMMerchantFlow->calculation($id);
  3854. }
  3855. }
  3856. return ResultWrapper::success('操作成功');
  3857. }
  3858. /**
  3859. * 更新索引表订单状态,支付状态,支付方式
  3860. * @param $orderData
  3861. * @param $params
  3862. * @return ResultWrapper
  3863. * @throws \Exception
  3864. */
  3865. private function updateOrderIndex($orderData, $params)
  3866. {
  3867. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  3868. $updateData = [];
  3869. isset($orderData['payType']) && $updateData['payType'] = $orderData['payType'];
  3870. isset($orderData['payStatus']) && $updateData['payStatus'] = $orderData['payStatus'];
  3871. isset($orderData['orderStatus']) && $updateData['orderStatus'] = $orderData['orderStatus'];
  3872. isset($orderData['outStatus']) && $updateData['outStatus'] = $orderData['outStatus'];
  3873. $where['id'] = $params['id'];
  3874. $dbResult = $this->objDOrderIndex->update($updateData, $where);
  3875. if ($dbResult === false) {
  3876. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3877. }
  3878. return ResultWrapper::success($dbResult);
  3879. }
  3880. /**
  3881. * 格式化返回数据
  3882. * @param $data
  3883. * @return array
  3884. * @throws \Exception
  3885. * @return ResultWrapper
  3886. */
  3887. private function format($data): ResultWrapper
  3888. {
  3889. // 提取所有订单id
  3890. $allOrderIds = [];
  3891. $allShopIds = [];
  3892. $allOrderNo = [];
  3893. $customerIds = [];
  3894. $allCustomerTypeIds = [];
  3895. if (isset($data['id'])) {
  3896. $dimension = $data;
  3897. unset($data);
  3898. $data[] = $dimension;
  3899. }
  3900. foreach ($data as $key => $value) {
  3901. $allOrderNo[] = $value['no'];
  3902. $allOrderIds[] = $value['id'];
  3903. $allShopIds[] = $value['shopId'];
  3904. $allCustomerTypeIds = $value['customerType'];
  3905. $customerIds[] = $value['customerId'];
  3906. $this->onlineUserId = $value['userCenterId'];
  3907. if ($value['auditStatus'] == StatusCode::$auditStatus['auditing']) {
  3908. $data[$key]['orderMsg'] = '待审核';
  3909. }
  3910. if ($value['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  3911. $data[$key]['orderMsg'] = '待出库';
  3912. if ($value['orderStatus'] == StatusCode::$orderStatus['waitReceive']) {
  3913. $data[$key]['orderMsg'] = '已出库';
  3914. if ($value['outStatus'] == 6 && $value['isRet'] != StatusCode::$standard){
  3915. $data[$key]['orderMsg'] = '部分出库';
  3916. }
  3917. }
  3918. if ($value['orderStatus'] == StatusCode::$orderStatus['finish']) {
  3919. $data[$key]['orderMsg'] = '已完成';
  3920. }
  3921. }
  3922. switch ($value['orderStatus']){
  3923. case StatusCode::$orderStatus['close']:
  3924. $data[$key]['orderMsg'] = '已关闭';
  3925. break;
  3926. case StatusCode::$orderStatus['cancelIng'];
  3927. $data[$key]['orderMsg'] = '待取消';
  3928. break;
  3929. }
  3930. if (isset($value['payType'])) {
  3931. $data[$key]['payTypeMsg'] = isset(StatusCode::$payType[$value['payType']]) ? StatusCode::$payType[$value['payType']] : '';
  3932. }
  3933. }
  3934. //获取客户类型
  3935. $customerTypeMap = [];
  3936. if (!empty($allCustomerTypeIds)) {
  3937. $objDCustomerSource = new DCustomerSource();
  3938. $customerSourceLists = $objDCustomerSource->select(['id' => $allCustomerTypeIds], 'id,name');
  3939. if ($customerSourceLists != false) {
  3940. foreach ($customerSourceLists as $val) {
  3941. $customerTypeMap[$val['id']] = $val['name'];
  3942. }
  3943. }
  3944. }
  3945. //获取店铺信息
  3946. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  3947. $shopData = $objMShop->getShopName($allShopIds);
  3948. /********************************订单商品 start****************************/
  3949. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  3950. $dbResult = $objMOrderGoods->getOrderGoodsByOrderIds(['orderId' => $allOrderIds, 'deleteStatus' => StatusCode::$standard]);
  3951. $orderGoodsData = [];//订单商品信息
  3952. if (!$dbResult->isSuccess()) {
  3953. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  3954. }
  3955. $orderGoodsData = $dbResult->getData();
  3956. unset($dbResult);
  3957. //查询sku信息
  3958. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  3959. //查询商品数据
  3960. $allGoodsIds = array_unique(array_column($orderGoodsData, 'goodsId'));
  3961. $allGoodsBasicIds = array_unique(array_column($orderGoodsData, 'goodsBasicId'));
  3962. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  3963. $goodsData = $objMGoods->getGoodsNames($allGoodsIds);
  3964. //获取商品的库存
  3965. $inventorySelectParams = [];
  3966. $objMInventory = new MInventory($this->onlineEnterpriseId, '');
  3967. foreach ($orderGoodsData as $item){
  3968. $inventorySelectParams[$item['shopId']][] = $item['skuId'];
  3969. }
  3970. $inventoryMap = [];
  3971. foreach ($inventorySelectParams as $shopId => $skuIds){
  3972. $inventoryResult = $objMInventory->getInventoryByShopIdAndSkuIds($shopId,$skuIds);
  3973. if (!$inventoryResult->isSuccess()) {
  3974. return ResultWrapper::fail($inventoryResult->getData(),$inventoryResult->getErrorCode());
  3975. }
  3976. $inventoryMap[$shopId] = $inventoryResult->getData();
  3977. }
  3978. //sku信息
  3979. $skuResult = $objMSku->getSpecNameBySkuId(array_column($orderGoodsData, 'skuId'));
  3980. if (!$skuResult->isSuccess()) {
  3981. return ResultWrapper::fail($skuResult->getData(),$skuResult->getErrorCode());
  3982. }
  3983. $allSku = $skuResult->getData();
  3984. $goods = [];
  3985. $allSkuIds = [];
  3986. foreach ($orderGoodsData as $val){
  3987. if (!in_array($val['skuId'],$allSkuIds)){
  3988. $allSkuIds[] = $val['skuId'];
  3989. }
  3990. }
  3991. foreach ($orderGoodsData as $key => &$value) {
  3992. $value['isNew'] = isset($allSku[$value['skuId']]['isNew']) ? $allSku[$value['skuId']]['isNew'] : StatusCode::$delete;
  3993. $value['barCode'] = isset($allSku[$value['skuId']]['barCode']) ? $allSku[$value['skuId']]['barCode'] : '';
  3994. $value['unitName'] = isset($allSku[$value['skuId']]['unitName']) ? $allSku[$value['skuId']]['unitName'] : '';
  3995. $value['specGroup'] = isset($allSku[$value['skuId']]['specGroup']) ? $allSku[$value['skuId']]['specGroup'] : [];
  3996. $value['images'] = isset($goodsData[$value['goodsId']]['images']) ? json_decode($goodsData[$value['goodsId']]['images'], true) : '';
  3997. $value['returnPrice'] = bcdiv(bcsub(bcsub($value['totalMoney'], $value['preferential']), $value['vipDiscount']), $value['buyNum']);
  3998. $value['isMater'] = isset($allSku[$value['skuId']]['isMaster']) ? $allSku[$value['skuId']]['isMaster'] : StatusCode::$delete;
  3999. $value['conversion'] = isset($allSku[$value['skuId']]['conversion']) ? $allSku[$value['skuId']]['conversion'] : 0;
  4000. $value['inventory'] = isset($inventoryMap[$value['shopId']][$value['skuId']]['num']) ? $inventoryMap[$value['shopId']][$value['skuId']]['num'] : 0;
  4001. // 处理订单商品表扩展字段
  4002. if( !empty($value['extends']) ){
  4003. $extends = json_decode($value['extends'], true);
  4004. if(!empty($extends)){
  4005. foreach($extends as $keys => $item){
  4006. $value[$keys] = $item;
  4007. }
  4008. }
  4009. }
  4010. $allOrderGoodsData[$value['orderId']][] = $value;
  4011. if (!isset($goods[$value['orderId']]['goodsPreferential'])) {
  4012. $goods[$value['orderId']]['goodsPreferential'] = 0;
  4013. }
  4014. $goods[$value['orderId']]['goodsPreferential'] = bcadd($goods[$value['orderId']]['goodsPreferential'], bcmul($value['preferential'], $value['buyNum']), 2);
  4015. }
  4016. unset($dbResult);
  4017. /********************************收货信息 start******************************/
  4018. $objMOrderReceive = new MOrderReceive($this->onlineUserId, $this->onlineEnterpriseId);
  4019. $dbResult = $objMOrderReceive->getOrderReceiveByOrderIds(['orderId' => $allOrderIds]);
  4020. $orderReceiveData = [];//订单收货信息
  4021. if (!$dbResult->isSuccess()) {
  4022. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  4023. }
  4024. $orderReceiveData = self::formatSysArea($dbResult->getData());
  4025. foreach ($orderReceiveData as $key => $value) {
  4026. $allOrderReceiveData[$value['orderId']] = $value;
  4027. }
  4028. unset($dbResult);
  4029. /*********************************订单操作记录*********************************/
  4030. $objMOrderLog = new MOrderLog($this->onlineEnterpriseId);
  4031. $orderLog = $objMOrderLog->getOrderLog(['no' => $allOrderNo]);
  4032. /**********************************获取基本配置*********************************/
  4033. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  4034. $setupResult = $objMBasicSetup->getBasicField('allowReturnDay');
  4035. if (!$setupResult->isSuccess()) {
  4036. return ResultWrapper::fail($setupResult->getData(),$setupResult->getErrorCode());
  4037. }
  4038. $setupResult = $setupResult->getData();
  4039. $allowReturnDay = empty($setupResult['allowReturnDay']) ? 0 : $setupResult['allowReturnDay'];
  4040. /********************************映射数据 start******************************/
  4041. $nowTime = time();
  4042. foreach ($data as $key => $value) {
  4043. $data[$key]['no'] = StatusCode::$noPrefix[1].'-'.$value['no'];
  4044. $data[$key]['extends'] = !empty($value['extends']) ? json_decode($value['extends'], true) : (object)[];
  4045. $data[$key]['goodsData'] = isset($allOrderGoodsData[$value['id']]) ? $allOrderGoodsData[$value['id']] : [];
  4046. $data[$key]['receiveData'] = isset($allOrderReceiveData[$value['id']]) ? $allOrderReceiveData[$value['id']] : [];
  4047. $data[$key]['deliveryNo'] = isset($value['deliveryNo']) ? $value['deliveryNo'] : '';
  4048. $data[$key]['payAmount'] = bcsub($value['payAmount'],$value['retMoney'],2);
  4049. $data[$key]['expressMoney'] = isset($value['expressMoney']) ? $value['expressMoney'] : '';
  4050. $data[$key]['expressName'] = isset($value['expressName']) ? $value['expressName'] : '';
  4051. $data[$key]['deliveryName'] = isset(StatusCode::$deliveryType[$value['deliveryType']]) ? StatusCode::$deliveryType[$value['deliveryType']] : '';//配送方式名称
  4052. $data[$key]['orderPreferential'] = bcsub($data[$key]['totalMoney'], bcsub($data[$key]['payAmount'], $data[$key]['expressMoney'], 2), 2);//订单优惠
  4053. $data[$key]['goodsPreferential'] = isset($goods[$value['id']]['goodsPreferential']) ? $goods[$value['id']]['goodsPreferential'] : '';//商品优惠
  4054. $data[$key]['coupon'] = '0.00';
  4055. $data[$key]['salesman'] = $value['salesManName'];
  4056. $data[$key]['shopName'] = isset($shopData[$value['shopId']]['name']) ? $shopData[$value['shopId']]['name'] : '';
  4057. $data[$key]['shopLogo'] = isset($shopData[$value['shopId']]['logo']) ? $shopData[$value['shopId']]['logo'] : '';
  4058. $data[$key]['orderLog'] = isset($orderLog[$value['no']]) ? $orderLog[$value['no']] : [];
  4059. $data[$key]['allowReturn'] = StatusCode::$standard;//允许退货
  4060. if ($allowReturnDay == 0) {
  4061. //TODO(没有设置可退货时间,默认都可以退)
  4062. $data[$key]['allowReturn'] = StatusCode::$standard;//允许退货
  4063. } else {
  4064. $expire = ($allowReturnDay * 86400) + $value['successFullyTime'];
  4065. if ($nowTime > $expire) {
  4066. $data[$key]['allowReturn'] = StatusCode::$delete;//不允许退货
  4067. }
  4068. }
  4069. $data[$key]['allowReturnDay'] = $allowReturnDay;
  4070. if ($value['source'] == StatusCode::$source['manage']){
  4071. $data[$key]['orderPreferential'] = isset($value['totalReduceMoney']) ? $value['totalReduceMoney'] : 0;
  4072. }else{
  4073. $data[$key]['orderPreferential'] = bcsub($value['totalMoney'], bcsub($value['payAmount'], $value['expressMoney'], 2), 2);//订单总优惠
  4074. }
  4075. $data[$key]['paidAmount'] = $value['payStatus'] == StatusCode::$standard ? $value['payAmount'] : '0';//已付款金额
  4076. $data[$key]['customerTypeName'] = isset($customerTypeMap[$value['customerType']]) ? $customerTypeMap[$value['customerType']] : '';
  4077. $data[$key]['cashierName'] = $value['cashierName'];
  4078. $data[$key]['customerMobile'] = $value['customerMobile'];//客户手机号码
  4079. $data[$key]['guideName'] = $value['guideName'];
  4080. $data[$key]['changeAmount'] = $value['changeSubMoney'];
  4081. $data[$key]['accountList'] = empty($value['accountList']) ? [] : json_decode($value['accountList'], true);
  4082. $data[$key]['receivedName'] = isset($allOrderReceiveData[$value['id']]['realName']) ? $allOrderReceiveData[$value['id']]['realName'] : '';//收货人
  4083. $data[$key]['receivedMobile'] = isset($allOrderReceiveData[$value['id']]['mobile']) ? $allOrderReceiveData[$value['id']]['mobile'] : '';//收货电话
  4084. $data[$key]['reservoir'] = !empty($value['reservoir']) ? json_decode($value['reservoir'],true) : [];
  4085. //$data[$key]['selfRuleData'] = empty($value['selfRuleData']) ? (object)[] : json_decode($value['selfRuleData'],true);
  4086. }
  4087. $data = array_shift($data);
  4088. if ($this->isFront === false) {
  4089. $data['expressData'] = (object)[];
  4090. if ($data['deliveryType'] == StatusCode::$deliveryType['goodsDelivery'] && $data['deliveryNo']) {
  4091. $expressResult = self::getExpressInfoByOrderId($data['id']);
  4092. if ($expressResult->isSuccess()) {
  4093. $data['expressData'] = $expressResult->getData();
  4094. }
  4095. }
  4096. }
  4097. return ResultWrapper::success($data);
  4098. }
  4099. /**
  4100. * 地区
  4101. * @param $data
  4102. * @return mixed
  4103. */
  4104. public function formatSysArea($data)
  4105. {
  4106. if (empty($data)) {
  4107. return $data;
  4108. }
  4109. $objMSysAreaChina = new MSysAreaChina();
  4110. foreach ($data as $key => $val) {
  4111. if (isset($val['provinceCode']) && isset($val['cityCode']) && isset($val['districtCode'])) {
  4112. $areaName = $objMSysAreaChina->getNameByCode([
  4113. $val['provinceCode'],
  4114. $val['cityCode'],
  4115. $val['districtCode']
  4116. ]);
  4117. $data[$key]['area']['provinceName'] = isset($areaName[$val['provinceCode']]) ? $areaName[$val['provinceCode']] : '';
  4118. $data[$key]['area']['cityName'] = isset($areaName[$val['cityCode']]) ? $areaName[$val['cityCode']] : '';
  4119. $data[$key]['area']['districtName'] = isset($areaName[$val['districtCode']]) ? $areaName[$val['districtCode']] : '';
  4120. }
  4121. }
  4122. return $data;
  4123. }
  4124. /**
  4125. * 查询订单
  4126. * 全部 {"page": 1,"pageSize": 10,"orderStatus": 0}
  4127. * 待付款 {"page": 1,"pageSize": 10,"orderStatus": 2}
  4128. * 待发货 {"page": 1,"pageSize": 10,"orderStatus": 3}
  4129. * 待收货 {"page": 1,"pageSize": 10,"orderStatus": 4}
  4130. * @param $selectParams
  4131. * @return ResultWrapper
  4132. * @throws \Exception
  4133. */
  4134. public function getOrderSelect($selectParams)
  4135. {
  4136. $limit = $selectParams['limit'];
  4137. unset($selectParams['limit']);
  4138. $offset = $selectParams['offset'];
  4139. unset($selectParams['offset']);
  4140. unset($selectParams['page']);
  4141. unset($selectParams['pageSize']);
  4142. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  4143. $customerId = $objMCustomer->getCustomerIdByUserCenterId($this->onlineUserId);
  4144. if (empty($customerId)) {
  4145. return ResultWrapper::fail('没有找到客户信息', ErrorCode::$paramError);
  4146. }
  4147. $selectParams['customerId'] = $customerId;
  4148. $selectParams['deleteStatus'] = StatusCode::$standard;
  4149. $dbResult = $this->objDOrder->select($selectParams, 'id,payType,outerTradeNo,payStatus,outStatus,verifyCode,totalMoney,payAmount,notPayMoney,shopId,no,orderStatus,createTime,deliveryType,auditStatus,isRet', 'createTime DESC,updateTime DESC', $limit, $offset);
  4150. if ($dbResult === false) {
  4151. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4152. }
  4153. $total = $this->objDOrder->count($selectParams);
  4154. $return = [
  4155. 'data' => self::formatAndGoods($dbResult),
  4156. 'total' => ($total) ? intval($total) : 0,
  4157. ];
  4158. return ResultWrapper::success($return);
  4159. }
  4160. /**
  4161. * 格式化商品数据
  4162. *
  4163. * @param $data
  4164. * @return mixed
  4165. * @throws \Exception
  4166. */
  4167. private function formatAndGoods($data)
  4168. {
  4169. $allOrderIds = [];
  4170. $allShopIds = [];
  4171. foreach ($data as $key => $value) {
  4172. $allShopIds[] = $value['shopId'];
  4173. $allOrderIds[] = $value['id'];
  4174. }
  4175. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  4176. $selectParams = [
  4177. 'orderId' => $allOrderIds,
  4178. 'deleteStatus' => StatusCode::$standard,
  4179. ];
  4180. $dbResult = $objMOrderGoods->getOrderGoodsByOrderIds($selectParams);
  4181. $orderGoodsData = [];//订单商品信息
  4182. if ($dbResult->isSuccess()) {
  4183. $orderGoodsData = $dbResult->getData();
  4184. }
  4185. $allGoodsIds = array_unique(array_column($orderGoodsData, 'goodsId'));
  4186. unset($dbResult);
  4187. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  4188. $goodsData = $objMGoods->getGoodsNames($allGoodsIds);
  4189. if (empty($goodsData)) {
  4190. return $data;
  4191. }
  4192. $allOrderGoodsData = [];
  4193. foreach ($orderGoodsData as $key => &$value) {
  4194. $value['extends'] = !empty($value['extends']) ? json_decode($value['extends'], true) : [];
  4195. $value['images'] = isset($goodsData[$value['goodsId']]['images']) ? json_decode($goodsData[$value['goodsId']]['images'], true) : '';
  4196. // 如果是抄码商品,订单商品购买数量按照件算
  4197. if( $value['isEq'] == StatusCode::$standard){
  4198. $value['buyNum'] = isset($value['extends']['u_1_buy']) ? $value['extends']['u_1_buy'] : $value['buyNum'];
  4199. }
  4200. $allOrderGoodsData[$value['orderId']][] = $value;
  4201. }
  4202. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  4203. $shopData = $objMShop->getShopName($allShopIds);
  4204. foreach ($data as $key => $val) {
  4205. $data[$key]['deliveryTypeMsg'] = isset(StatusCode::$deliveryType[$val['deliveryType']]) ? StatusCode::$deliveryType[$val['deliveryType']] : '';
  4206. $data[$key]['goodsNum'] = isset($allOrderGoodsData[$val['id']]) ? array_sum(array_column($allOrderGoodsData[$val['id']], 'buyNum')) : '';
  4207. $data[$key]['shopName'] = isset($shopData[$val['shopId']]['name']) ? $shopData[$val['shopId']]['name'] : '';
  4208. $data[$key]['shopLogo'] = isset($shopData[$val['shopId']]['logo']) ? $shopData[$val['shopId']]['logo'] : '';
  4209. $data[$key]['goodsData'] = isset($allOrderGoodsData[$val['id']]) ? array_values($allOrderGoodsData[$val['id']]) : '';
  4210. }
  4211. return $data;
  4212. }
  4213. /**
  4214. * Doc: (des="订单检索条件")
  4215. * User: XMing
  4216. * Date: 2020/7/11
  4217. * Time: 9:48 上午
  4218. * @param $selectParams
  4219. * @param bool $is_export
  4220. * @return ResultWrapper
  4221. * @throws \Exception
  4222. */
  4223. public function search($selectParams, $is_export = false)
  4224. {
  4225. $defaultDSL = [
  4226. 'sort' => [
  4227. 'createTime' => [
  4228. 'order' => 'desc'
  4229. ],
  4230. ],
  4231. ];
  4232. if ($is_export === false) {
  4233. $defaultDSL['from'] = $selectParams['offset'];
  4234. $defaultDSL['size'] = $selectParams['limit'];
  4235. }
  4236. $dsl = [];
  4237. $dsl['query']['bool']['must'][] = [
  4238. 'term' => ['enterpriseId' => $this->onlineEnterpriseId],
  4239. ];
  4240. //订单编号,收货人,商品名称
  4241. if (!empty($selectParams['keyword'])) {
  4242. $dsl['query']['bool']['must'][] = [
  4243. 'multi_match' => [
  4244. 'fields' => ['no', 'verifyCode', 'mobile', 'goodsName', 'salesManName', 'customerName', 'remark'],
  4245. 'query' => $selectParams['keyword'],
  4246. //'fuzziness' => 'AUTO',
  4247. "type" => "best_fields",
  4248. "tie_breaker" => 0.3,
  4249. "minimum_should_match" => "100%"
  4250. ],
  4251. ];
  4252. }
  4253. //销售单/订单
  4254. if (isset($selectParams['orderType']) && !empty($selectParams['orderType'])) {
  4255. $dsl['query']['bool']['filter'][] =
  4256. ['term' => ['orderType' => $selectParams['orderType']]];
  4257. }
  4258. //订单状态
  4259. if (isset($selectParams['orderStatus']) && !empty($selectParams['orderStatus'])) {
  4260. $dsl['query']['bool']['filter'][] =
  4261. ['term' => ['orderStatus' => $selectParams['orderStatus']]];
  4262. }
  4263. //出库状态
  4264. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  4265. $dsl['query']['bool']['filter'][] =
  4266. ['term' => ['outStatus' => $selectParams['outStatus']]];
  4267. }
  4268. //退货状态
  4269. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  4270. $dsl['query']['bool']['filter'][] =
  4271. ['term' => ['returnStatus' => $selectParams['returnStatus']]];
  4272. }
  4273. //配送方式
  4274. if (isset($selectParams['deliveryType']) && !empty($selectParams['deliveryType'])) {
  4275. $dsl['query']['bool']['filter'][] =
  4276. ['term' => ['deliveryType' => $selectParams['deliveryType']]];
  4277. }
  4278. //支付状态
  4279. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  4280. $dsl['query']['bool']['filter'][] =
  4281. ['term' => ['payType' => $selectParams['payType']]];
  4282. }
  4283. //店铺id
  4284. parent::getAccessShopIds();
  4285. if (parent::$shopIds) {
  4286. $dsl['query']['bool']['filter'][] = [
  4287. 'terms' => ['shopId' => parent::$shopIds]
  4288. ];
  4289. }
  4290. //省code
  4291. if (isset($selectParams['provinceCode']) && !empty($selectParams['provinceCode'])) {
  4292. $dsl['query']['bool']['filter'][] =
  4293. ['term' => ['provinceCode' => $selectParams['provinceCode']]];
  4294. }
  4295. //市code
  4296. if (isset($selectParams['cityCode']) && !empty($selectParams['cityCode'])) {
  4297. $dsl['query']['bool']['filter'][] =
  4298. ['term' => ['cityCode' => $selectParams['cityCode']]];
  4299. }
  4300. //区code
  4301. if (isset($selectParams['districtCode']) && !empty($selectParams['districtCode'])) {
  4302. $dsl['query']['bool']['filter'][] =
  4303. ['term' => ['districtCode' => $selectParams['districtCode']]];
  4304. }
  4305. if (!empty($selectParams['start']) && !empty($selectParams['end'])) {
  4306. $dsl['query']['bool']['must'][] = [
  4307. 'range' => [
  4308. 'createTime' => [
  4309. 'gte' => $selectParams['start'],
  4310. 'lte' => $selectParams['end'],
  4311. ]
  4312. ]
  4313. ];
  4314. } else {
  4315. if (isset($selectParams['start']) && !empty($selectParams['start'])) {
  4316. $dsl['query']['bool']['must'][] = [
  4317. 'range' => [
  4318. 'createTime' => [
  4319. 'gte' => $selectParams['start'],
  4320. ]
  4321. ]
  4322. ];
  4323. }
  4324. if (isset($selectParams['end']) && !empty($selectParams['end'])) {
  4325. $dsl['query']['bool']['must'][] = [
  4326. 'range' => [
  4327. 'createTime' => [
  4328. 'lte' => $selectParams['end'],
  4329. ]
  4330. ]
  4331. ];
  4332. }
  4333. }
  4334. //店铺id
  4335. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  4336. $dsl['query']['bool']['filter'][] =
  4337. ['term' => ['shopId' => $selectParams['shopId']]];
  4338. }
  4339. //客户id
  4340. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  4341. $dsl['query']['bool']['filter'][] =
  4342. ['term' => ['customerId' => $selectParams['customerId']]];
  4343. }
  4344. //客户类型
  4345. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])) {
  4346. $dsl['query']['bool']['filter'][] =
  4347. ['term' => ['customerType' => $selectParams['customerType']]];
  4348. }
  4349. $flag = true;
  4350. //业务员id
  4351. if (isset($selectParams['salesManId']) && !empty($selectParams['salesManId'])) {
  4352. $dsl['query']['bool']['filter'][] =
  4353. ['term' => ['salesManId' => $selectParams['salesManId']]];
  4354. }
  4355. //销售员id
  4356. parent::getAccessSalesManIds();
  4357. if (!empty(parent::$salesManIds) && empty($selectParams['salesManId'])) {
  4358. $dsl['query']['bool']['filter'][] = [
  4359. 'terms' => ['salesManId' => parent::$salesManIds]
  4360. ];
  4361. }
  4362. if (!empty(parent::$salesManIds) && !empty($selectParams['salesManId'])) {
  4363. if (!in_array($selectParams['salesManId'], parent::$salesManIds)) {
  4364. $flag = false;
  4365. }
  4366. }
  4367. //订单来源
  4368. if (isset($selectParams['source']) && !empty($selectParams['source'])) {
  4369. $dsl['query']['bool']['filter'][] =
  4370. ['term' => ['source' => $selectParams['source']]];
  4371. }
  4372. //按照标示进行检索,等级最高
  4373. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  4374. $dsl = self::setOrderStatusDslAttr($dsl, $selectParams['state']);
  4375. }
  4376. $dsl = array_merge($defaultDSL, $dsl);
  4377. //导出
  4378. if ($is_export === true) self::exportSearch($dsl);
  4379. //V($dsl);
  4380. $result = $flag ? $this->objDOrder->getSearchQueryDsl($dsl) : [];
  4381. if (isset($result['status']) && $result['status'] == 400) {
  4382. //return ResultWrapper::fail('获取数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  4383. return ResultWrapper::success([
  4384. 'data' => [],
  4385. 'total' => 0
  4386. ]);
  4387. }
  4388. if (!isset($result['hits']) || $result['hits']['total'] == 0) {
  4389. return ResultWrapper::success([
  4390. 'data' => [],
  4391. 'total' => 0
  4392. ]);
  4393. }
  4394. $total = $result['hits']['total'];
  4395. $dbResult = $result['hits']['hits'];
  4396. $list = [];
  4397. foreach ($dbResult as $key => &$value) {
  4398. $data = [];
  4399. $data = $value['_source'];
  4400. //$data['id'] = $value['_id'];
  4401. $data['receiveData'] = [
  4402. 'realName' => $data['realName'],
  4403. 'mobile' => $data['mobile']
  4404. ];
  4405. unset($data['realName']);
  4406. unset($data['mobile']);
  4407. $list[] = $data;
  4408. }
  4409. $buildData = self::shiftEsReceiveData($list);
  4410. $formatResult = self::formatManageOrderList($buildData['allOrderData'], $buildData['allOrderReceiveData']);
  4411. if (!$formatResult->isSuccess()) {
  4412. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  4413. }
  4414. $return = [
  4415. 'data' => $formatResult->getData(),
  4416. 'total' => ($total) ? intval($total) : 0,
  4417. ];
  4418. return ResultWrapper::success($return);
  4419. }
  4420. /**
  4421. * Doc: (des="将es中查询出来的数据,统一转化为标准格式进行格式化")
  4422. * User: XMing
  4423. * Date: 2020/7/11
  4424. * Time: 6:13 下午
  4425. * @param $data
  4426. * @return array
  4427. */
  4428. private static function shiftEsReceiveData($data)
  4429. {
  4430. $orderData = [];
  4431. $orderReceiveData = [];
  4432. foreach ($data as $item) {
  4433. $orderData[] = $item;
  4434. $orderReceiveData[] = [
  4435. 'orderId' => $item['id'],
  4436. 'customerId' => $item['customerId'],
  4437. 'address' => $item['address'],
  4438. 'realName' => $item['receiveData']['realName'],
  4439. 'mobile' => $item['receiveData']['mobile'],
  4440. 'provinceCode' => $item['provinceCode'],
  4441. 'cityCode' => $item['cityCode'],
  4442. 'districtCode' => $item['districtCode']
  4443. ];
  4444. }
  4445. return [
  4446. 'allOrderData' => $orderData,
  4447. 'allOrderReceiveData' => $orderReceiveData
  4448. ];
  4449. }
  4450. /**
  4451. * 格式化订单状态
  4452. * @param $data
  4453. * @return mixed
  4454. */
  4455. private static function formatOrderStatus($data)
  4456. {
  4457. if (empty($data)) return $data;
  4458. foreach ($data as $key => $value) {
  4459. if ($value['auditStatus'] == StatusCode::$auditStatus['auditing']) {
  4460. $data[$key]['orderMsg'] = '待审核';
  4461. }
  4462. if ($value['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  4463. $data[$key]['orderMsg'] = '待出库';
  4464. if ($value['orderStatus'] == StatusCode::$orderStatus['waitReceive']) {
  4465. $data[$key]['orderMsg'] = '已出库';
  4466. if ($value['outStatus'] == 6 && $value['isRet'] != StatusCode::$standard){
  4467. $data[$key]['orderMsg'] = '部分出库';
  4468. }
  4469. }
  4470. if ($value['orderStatus'] == StatusCode::$orderStatus['finish']) {
  4471. $data[$key]['orderMsg'] = '已完成';
  4472. }
  4473. }
  4474. switch ($value['orderStatus']){
  4475. case StatusCode::$orderStatus['close']:
  4476. $data[$key]['orderMsg'] = '已关闭';
  4477. break;
  4478. case StatusCode::$orderStatus['cancelIng'];
  4479. $data[$key]['orderMsg'] = '待取消';
  4480. break;
  4481. // case StatusCode::$orderStatus['waitReceive'];
  4482. // $data[$key]['orderMsg'] = '待收货';
  4483. // break;
  4484. }
  4485. if (isset($value['payStatus'])) {
  4486. $data[$key]['payMsg'] = $value['payStatus'] == StatusCode::$standard ? '已支付' : '未支付';
  4487. }
  4488. if (isset($value['deliveryType'])) {
  4489. $data[$key]['deliveryMsg'] = isset(StatusCode::$deliveryType[$value['deliveryType']]) ? StatusCode::$deliveryType[$value['deliveryType']] : '';
  4490. }
  4491. if (isset($value['payType'])) {
  4492. $payTypeMsg = '';
  4493. if( isset(StatusCode::$payType[$value['payType']]) ){
  4494. $payTypeMsg = StatusCode::$payType[$value['payType']];
  4495. }else{// 组合支付渲染金额
  4496. if($value['extends']){
  4497. $admixPayData = json_decode($value['extends'],true);
  4498. $payTypeMsg = '组合支付(';
  4499. if(!empty($admixPayData)){
  4500. foreach ($admixPayData['admixPayData'] as $admixKey => $admixValue){
  4501. $payTypeMsg .= $admixValue['title'].'支付'.$admixValue['payMoney'].',';
  4502. }
  4503. }
  4504. $payTypeMsg .= ")";
  4505. }
  4506. }
  4507. $data[$key]['payTypeMsg'] = $payTypeMsg;
  4508. //$data[$key]['payTypeMsg'] = isset(StatusCode::$payType[$value['payType']]) ? StatusCode::$payType[$value['payType']] : '组合支付';
  4509. }
  4510. if (isset($value['source'])) {
  4511. $data[$key]['sourceMsg'] = isset(StatusCode::$source[$value['source']]) ? StatusCode::$source[$value['source']] : '';
  4512. }
  4513. if (isset($value['auditStatus'])) {
  4514. $data[$key]['auditMsg'] = isset(StatusCode::$auditStatus[$value['auditStatus']]) ? StatusCode::$auditStatus[$value['auditStatus']] : '';
  4515. }
  4516. }
  4517. return $data;
  4518. }
  4519. /**
  4520. * Doc: (des="订单标示的dsl拼接")
  4521. * User: XMing
  4522. * Date: 2020/7/11
  4523. * Time: 9:15 上午
  4524. * @param array $dsl
  4525. *
  4526. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  4527. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  4528. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  4529. * @finish:已完成 orderStatus = 5 auditPass 2
  4530. * @close:已关闭 orderStatus = 6
  4531. * @param string $states
  4532. * @return array|mixed
  4533. */
  4534. public static function setOrderStatusDslAttr(array $dsl, $states)
  4535. {
  4536. if (is_array($states)) {
  4537. $allAuditStatus = [];
  4538. $allOrderStatus = [];
  4539. foreach ($states as $state) {
  4540. $auditStatus = self::auditStatusAttrDsl($state);
  4541. $orderStatus = self::orderStatusAttrDsl($state);
  4542. $allAuditStatus = array_merge($auditStatus, $allAuditStatus);
  4543. $allOrderStatus = array_merge($orderStatus, $allOrderStatus);
  4544. }
  4545. } else {
  4546. $allAuditStatus = self::auditStatusAttrDsl($states);
  4547. $allOrderStatus = self::orderStatusAttrDsl($states);
  4548. }
  4549. if (!empty($allAuditStatus)) {
  4550. $dsl['query']['bool']['filter'][] = [
  4551. 'terms' => [
  4552. 'auditStatus' => $allAuditStatus
  4553. ]
  4554. ];
  4555. }
  4556. if (!empty($allOrderStatus)) {
  4557. $dsl['query']['bool']['filter'][] = [
  4558. 'terms' => [
  4559. 'orderStatus' => $allOrderStatus
  4560. ]
  4561. ];
  4562. }
  4563. return $dsl;
  4564. }
  4565. /**
  4566. * Doc: (des="state对应审核状态映射")
  4567. * User: XMing
  4568. * Date: 2020/7/13
  4569. * Time: 10:36 上午
  4570. * @param string $state
  4571. * @return array|mixed
  4572. */
  4573. public static function auditStatusAttrDsl(string $state)
  4574. {
  4575. $map = [
  4576. 'waitAudit' => [StatusCode::$auditStatus['auditing']],
  4577. 'waitOutStock' => [StatusCode::$auditStatus['auditPass']],
  4578. 'hasOutStock' => [StatusCode::$auditStatus['auditPass']],
  4579. 'finish' => [StatusCode::$auditStatus['auditPass']],
  4580. 'close' => [],
  4581. 'all' => []
  4582. ];
  4583. return isset($map[$state]) ? $map[$state] : [];
  4584. }
  4585. /**
  4586. * Doc: (des="state对应订单状态映射")
  4587. * User: XMing
  4588. * Date: 2020/7/13
  4589. * Time: 10:43 上午
  4590. * @param string $state
  4591. * @return array|mixed
  4592. */
  4593. public static function orderStatusAttrDsl(string $state)
  4594. {
  4595. $map = [
  4596. 'waitAudit' => [StatusCode::$orderStatus['waitPay'], StatusCode::$orderStatus['waitDelivery']],
  4597. 'waitOutStock' => [StatusCode::$orderStatus['waitPay'], StatusCode::$orderStatus['waitDelivery']],
  4598. 'hasOutStock' => [StatusCode::$orderStatus['waitReceive']],
  4599. 'finish' => [StatusCode::$orderStatus['finish']],
  4600. 'close' => [StatusCode::$orderStatus['close']],
  4601. 'all' => []
  4602. ];
  4603. return isset($map[$state]) ? $map[$state] : [];
  4604. }
  4605. /**
  4606. * 再次支付
  4607. *
  4608. * @param $params
  4609. * @param $ip
  4610. * @return ResultWrapper
  4611. * @throws \Exception
  4612. */
  4613. public function payOrder($params, $ip)
  4614. {
  4615. // file_put_contents('/www/wwwroot/logs/api.junhailan.com/pay_params.log', date('Y-m-d H:i:s') . '再次支付订单数据:' . var_export($params, true) . PHP_EOL, FILE_APPEND);
  4616. //order表切表
  4617. $fix = 1;
  4618. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  4619. $this->objDOrderIndex->setTable('qianniao_order_index_'.$this->onlineEnterpriseId);
  4620. $status = $this->objDOrder->beginTransaction();
  4621. //再次支付更新extend值
  4622. $extend = [];
  4623. // 处理混合支付数据
  4624. if( !empty($params['admixPayData']) ){
  4625. $extend['admixPayData'] = $params['admixPayData'];
  4626. }
  4627. // 处理银行打款数据
  4628. if( !empty($params['bankData']) ){
  4629. $extend['bankData'] = $params['bankData'];
  4630. }
  4631. $extend = json_encode($extend);
  4632. //再次付款更新extend(付款信息)
  4633. $updateExtend = $this->objDOrder->update(['extends'=>$extend],['no' => $params['no']]);
  4634. if ($updateExtend === false) {
  4635. $this->objDOrderIndex->rollBack();
  4636. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4637. }
  4638. if($status){
  4639. $this->objDOrder->commit();
  4640. }
  4641. $orderData = $this->objDOrder->get(['no' => $params['no']]);
  4642. if ($orderData === false) {
  4643. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4644. }
  4645. if (empty($orderData)) {
  4646. return ResultWrapper::fail('没有找到订单', ErrorCode::$paramError);
  4647. }
  4648. $params['payType'] = explode(',', $params['payType']);
  4649. $this->objDOrder->beginTransaction();
  4650. //再次支付时订单支付方式改为了货到付款
  4651. //if ($params['payType'] == StatusCode::$payType['cashPay']) {
  4652. if ( in_array(StatusCode::$payType['cashPay'], $params['payType']) || in_array(StatusCode::$payType['bankLoans'],$params['payType'])) {
  4653. //修改订单的支付方式
  4654. if(in_array(StatusCode::$payType['cashPay'], $params['payType'])){//货到付款 订单状态为待发货
  4655. $update = [
  4656. 'payType' => StatusCode::$payType['cashPay'],
  4657. 'orderStatus' => StatusCode::$orderStatus['waitDelivery']
  4658. ];
  4659. } else{//银行打款 订单状态为代发货
  4660. $update = [
  4661. 'payType' => StatusCode::$payType['bankLoans'],
  4662. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  4663. 'payStatus' => StatusCode::$delete
  4664. ];
  4665. }
  4666. $dbResult = $this->objDOrder->update($update, ['no' => $params['no']]);
  4667. if ($dbResult === false) {
  4668. $this->objDOrderIndex->rollBack();
  4669. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4670. }
  4671. unset($dbResult);
  4672. //修改索引表支付方式
  4673. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  4674. $dbResult = $this->objDOrderIndex->update($update, ['id' => $orderData['id']]);
  4675. if ($dbResult === false) {
  4676. $this->objDOrderIndex->rollBack();
  4677. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  4678. }
  4679. /*
  4680. //修改ES,支付方式
  4681. $_id = self::createEsDocumentId($orderData['id']);
  4682. $this->objDOrder->esupdateTypeFieldVaule(['payType' => StatusCode::$payType['cashPay']], $_id);*/
  4683. $this->objDOrder->commit();
  4684. //订单是否自动审核
  4685. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  4686. //获取基本配置
  4687. $setupResult = $objMBasicSetup->getBasicField('autoAuditOrder');
  4688. $autoAuditOrder = [];
  4689. if ($setupResult->isSuccess()) {
  4690. $autoAuditOrder = $setupResult->getData();//自动审核配置数据
  4691. $autoAuditOrder = isset($autoAuditOrder['autoAuditOrder']) ? $autoAuditOrder['autoAuditOrder'] : [];
  4692. }
  4693. //货到付款是否开启了自动审核
  4694. $autoAudit = isset($autoAuditOrder['cashPay']) ? $autoAuditOrder['cashPay'] : StatusCode::$delete;
  4695. if ($autoAudit == StatusCode::$standard) {
  4696. //开启了自动审核,审核订单
  4697. $auditResult = self::updateAuditStatus([
  4698. 'id' => $orderData['id'],
  4699. 'audit' => '自动审核',
  4700. 'auditId' => $this->onlineUserId,
  4701. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  4702. ]);
  4703. }
  4704. return ResultWrapper::success($dbResult);
  4705. }
  4706. //获取客户信息
  4707. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  4708. $customerData = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  4709. if (!$customerData->isSuccess()) {
  4710. return ResultWrapper::fail($customerData->getData(), $customerData->getErrorCode());
  4711. }
  4712. $customerData = $customerData->getData();
  4713. $payType = $params['payType'];
  4714. rsort($payType);
  4715. $payment = [];
  4716. $payParams = '';
  4717. $payStatus = StatusCode::$partion;
  4718. $orderStatus = StatusCode::$orderStatus['waitPay'];
  4719. if( in_array(StatusCode::$payType['bankLoans'],$payType) ){
  4720. $payStatus = StatusCode::$delete;
  4721. $orderStatus = StatusCode::$orderStatus['waitPay'];
  4722. }
  4723. foreach($payType as $k => $v){
  4724. // 除了余额支付其他方式都要获取支付配置
  4725. if($v != StatusCode::$payType['balance']){
  4726. $objMPaymentSetting = new MPaymentSetting($this->onlineUserId, $this->onlineEnterpriseId);
  4727. $result = $objMPaymentSetting->getPayData($v);
  4728. if (!$result->isSuccess() || empty($result->getData())) {
  4729. return ResultWrapper::fail('获取微信配置错误', ErrorCode::$configEroor);
  4730. }
  4731. $payment = $result->getData();
  4732. }
  4733. switch (true){
  4734. case in_array(StatusCode::$payType['balance'], $payType):
  4735. //余额支付
  4736. //$objMCustomer = new MCustomer($this->onlineEnterpriseId,$this->onlineUserId);
  4737. //减少余额()
  4738. $status = $this->objDOrderIndex->beginTransaction();
  4739. //新增会员流水记录
  4740. $memberBalanceDetailData = [
  4741. 'customerId' => $orderData['customerId'],
  4742. 'type' => StatusCode::$delete,
  4743. 'userCenterId' => $this->onlineUserId,
  4744. 'purpose' => '创建订单消费',
  4745. 'orderIds' =>implode(',',[$orderData['id']]),
  4746. 'remark' => '订单id'.implode(',',[$orderData['id']]),
  4747. 'financeType' => '会员余额消费'
  4748. ];
  4749. // 组合支付方式
  4750. if( !empty($params['admixPayData']) ) {
  4751. foreach ($params['admixPayData'] as $key => $value) {
  4752. if ($value['payType'] == StatusCode::$payType['balance']) {
  4753. // 本次混合支付余额支付金额
  4754. $memberBalanceDetailData['money'] = $value['payMoney'];
  4755. // 总金额 - 余额支付金额 = 剩余需要搭配支付金额
  4756. $orderData['payAmount'] = bcsub($orderData['payAmount'], $value['payMoney'], 2);
  4757. }
  4758. }
  4759. }else{
  4760. $payStatus = StatusCode::$standard;
  4761. $orderStatus = StatusCode::$orderStatus['waitDelivery'];
  4762. $memberBalanceDetailData['money'] = $orderData['payAmount'];
  4763. }
  4764. $objMMemberBalanceDetail = new MMemberBalanceDetail($this->onlineEnterpriseId,$this->onlineUserId);
  4765. $memberBalanceDbResult = $objMMemberBalanceDetail->addMemberBalanceDetail($memberBalanceDetailData);
  4766. if (!$memberBalanceDbResult->isSuccess()) {
  4767. $this->objDOrderIndex->rollBack();
  4768. return ResultWrapper::fail($memberBalanceDbResult->getData(), $memberBalanceDbResult->getErrorCode());
  4769. }
  4770. //扣除失败->订单未支付
  4771. if ($memberBalanceDbResult->isSuccess()){
  4772. $time = time();
  4773. //扣除成功->订单支付成功\
  4774. foreach ([$orderData['id']] as $orderId){
  4775. $updateIndexResult = $this->objDOrderIndex->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'updateTime' => $time],$orderId);
  4776. if ($updateIndexResult === false){
  4777. $this->objDOrderIndex->rollBack();
  4778. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  4779. }
  4780. $updateIndex = $this->objDOrder->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'payTime'=> $time,'updateTime' => $time,'payAmount'=>$memberBalanceDetailData['money']],$orderId);
  4781. if ($updateIndex === false){
  4782. $this->objDOrderIndex->rollBack();
  4783. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  4784. }
  4785. }
  4786. }
  4787. $status && $this->objDOrderIndex->commit();
  4788. $payParams = ResultWrapper::success([]);
  4789. break;
  4790. case in_array(StatusCode::$payType['aliPay'], $payType):
  4791. //ali
  4792. /*********读取支付宝支付参数(原配置)*********/
  4793. /**$aliPayConfigData = Factory::config()->get('alipay');
  4794. * if (empty($aliPayConfigData)) {
  4795. * return ResultWrapper::fail('支付宝配置错误', ErrorCode::$configEroor);
  4796. * }*/
  4797. $payOrderData = [
  4798. 'subject' => '千鸟云商',
  4799. 'out_trade_no' => $orderData['no'],
  4800. 'total_amount' => $orderData['payAmount'],
  4801. 'passback_params' => $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', [$orderData['id']]),
  4802. ];
  4803. $aliPayConfigData = [
  4804. 'appid' => $payment['appid'],
  4805. 'rsaPrivateKey' => $payment['rsaPrivateKey'],
  4806. 'alipayrsaPublicKey' => $payment['alipayrsaPublicKey'],
  4807. ];
  4808. $objAliPay = new aliPay($aliPayConfigData['appid'], $aliPayConfigData['rsaPrivateKey'], $aliPayConfigData['alipayrsaPublicKey']);
  4809. $payParams = $objAliPay->appPay($payOrderData);
  4810. break;
  4811. case in_array(StatusCode::$payType['wxPay'], $payType):
  4812. //wx
  4813. /********************生成小程序唤起支付用到的参数(原配置)*****/
  4814. /**$weixinConfigData = Factory::config()->get('weixin');
  4815. * if (empty($weixinConfigData)) {
  4816. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  4817. * }*/
  4818. // 获取当前登录企业的小程序配置
  4819. $objSystemCache = new SystemCache();
  4820. $miniprogramSetting = $objSystemCache->getAppIdByEnterpriseId($this->onlineEnterpriseId);
  4821. if (empty($miniprogramSetting)) {
  4822. return ResultWrapper::fail('后台小程序配置项为空', ErrorCode::$configEroor);
  4823. }
  4824. $miniprogramSetting = json_decode($miniprogramSetting, true);//获取小程序appid
  4825. // 获取配置文件微信公众号
  4826. /**$weixinConfigData = Factory::config()->get('weixin');
  4827. * if (empty($weixinConfigData)) {
  4828. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  4829. * }*/
  4830. switch ($params['source']) {
  4831. case StatusCode::$source['ByteProgram'];
  4832. //$appid = $weixinConfigData['offiaccount']['appid'];
  4833. $appid = $miniprogramSetting['appid'];
  4834. $paySource = 'byteDanceH5';
  4835. break;
  4836. case StatusCode::$source['miniProgram'];
  4837. $appid = $miniprogramSetting['appid'];
  4838. $paySource = 'miniProgram';
  4839. break;
  4840. default :
  4841. $appid = $payment['mobileAppid'];
  4842. $paySource = 'APP';
  4843. break;
  4844. }
  4845. $weixinConfigData = [
  4846. 'mch_id' => $payment['mchId'],
  4847. 'apiPartnerKey' => $payment['apiPartnerKey'],
  4848. 'appid' => $appid
  4849. ];
  4850. $attach = $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', [$orderData['id']]);
  4851. //$objPay = new Pay($appid, $weixinConfigData['pay']['mch_id'], $weixinConfigData['pay']['apiPartnerKey']);//old
  4852. $objPay = new Pay($appid, $weixinConfigData['mch_id'], $weixinConfigData['apiPartnerKey']);
  4853. $payParams = $objPay->unifiedorder($orderData['no'],$orderData['payAmount'], $ip, $paySource, '千鸟云商', $customerData['openId'], $attach);
  4854. break;
  4855. case in_array(StatusCode::$payType['byte'],$payType):
  4856. //字节跳动
  4857. $mweb_url = '';
  4858. //读取缓存配置
  4859. //$objSystemCache->getByteDanceSetting($this->onlineEnterpriseId);
  4860. // 获取配置文件字节小程序
  4861. $byteDanceConfigData = Factory::config()->getAppoint('byteDance', 'pay');
  4862. if (empty($byteDanceConfigData)) {
  4863. return ResultWrapper::fail('字节跳动配置错误', ErrorCode::$configEroor);
  4864. }
  4865. $objbytePay = new bytePay($byteDanceConfigData['appid'], $byteDanceConfigData['merchant_id'], $byteDanceConfigData['app_secret']);
  4866. unset($payParams);
  4867. $payParams = $objbytePay->pay($orderData['no'],$orderData['payAmount'], '千鸟云商', $ip, $mweb_url);
  4868. break;
  4869. case in_array(StatusCode::$payType['bankLoans'], $payType):
  4870. $payParams = ResultWrapper::success([$orderData['id']]);
  4871. break;
  4872. default:
  4873. //TODO
  4874. return ResultWrapper::fail('暂未开放的支付方式',ErrorCode::$paramError);
  4875. break;
  4876. }
  4877. unset($payType[$k]);
  4878. if (!$payParams->isSuccess()) {
  4879. return ResultWrapper::fail($payParams->getData(), $payParams->getErrorCode());
  4880. }
  4881. }
  4882. return ResultWrapper::success($payParams->getData());
  4883. }
  4884. /**
  4885. * 增加打印次数
  4886. * @param $id
  4887. * @return ResultWrapper
  4888. */
  4889. public function printIncr($id)
  4890. {
  4891. $dbResult = $this->objDOrder->set_inc('printingNum', ['id' => $id]);
  4892. if ($dbResult === false) {
  4893. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4894. }
  4895. return ResultWrapper::success($dbResult);
  4896. }
  4897. /**
  4898. * todo(保存编辑(废弃))
  4899. *
  4900. * @param $params
  4901. * @return ResultWrapper
  4902. * @throws \Exception
  4903. */
  4904. public function saveEdit($params)
  4905. {
  4906. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  4907. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  4908. $objMShippingAddress = new MShippingAddress($this->onlineEnterpriseId);
  4909. $objMOrderReceive = new MOrderReceive($this->onlineUserId, $this->onlineEnterpriseId);
  4910. $order = $this->objDOrder->get(['id' => $params['orderId']]);
  4911. if ($order === false) {
  4912. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4913. }
  4914. if (empty($order)) {
  4915. return ResultWrapper::fail('订单不存在', ErrorCode::$paramError);
  4916. }
  4917. if (!isset($order['auditStatus'])
  4918. || $order['auditStatus'] == StatusCode::$auditStatus['auditPass']
  4919. || $order['payStatus'] == StatusCode::$standard
  4920. ) {
  4921. return ResultWrapper::fail('订单不能编辑', ErrorCode::$paramError);
  4922. }
  4923. //根据地址id获取地址信息
  4924. $dbResult = $objMShippingAddress->getShippingAddressInfo($params['receiveAddressId']);
  4925. if (!$dbResult->isSuccess()) {
  4926. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4927. }
  4928. $addressData = $dbResult->getData();
  4929. if (empty($addressData)) {
  4930. return ResultWrapper::fail('收货地址信息不存在', ErrorCode::$dberror);
  4931. }
  4932. //锁定库存 查询商铺对应的仓库
  4933. $objMWarehouse = new MWarehouse($this->onlineEnterpriseId);
  4934. $warehouseData = $objMWarehouse->getWarehouseInfo(['shopId' => $params['goodsData']['goodsData'][0]['shopId']]);
  4935. if (!$warehouseData->isSuccess()) {
  4936. return ResultWrapper::fail($params['goodsData']['goodsData'][0]['shopId'] . $warehouseData->getData(), $warehouseData->getErrorCode());
  4937. }
  4938. $warehouse = $warehouseData->getData();
  4939. $commonData = $params['goodsData'];
  4940. $this->objDOrder->beginTransaction();
  4941. //先解锁库存
  4942. // $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  4943. // $unlockResult = $objMInventory->unlockInventory([$order['id']], StatusCode::$orderType['saleOrder'], $order['createTime']);
  4944. // if (!$unlockResult->isSuccess()) {
  4945. // $this->objDOrder->rollBack();
  4946. // return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  4947. // }
  4948. $dbResult = $this->objDOrderIndex->update(['deliveryType' => $params['deliveryType']], ['id' => $params['orderId']]);
  4949. if ($dbResult === false) {
  4950. $this->objDOrder->rollBack();
  4951. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  4952. }
  4953. //修改Order表中的数据
  4954. $dbResult = $this->objDOrder->update([
  4955. 'totalMoney' => $commonData['totalMoney'],
  4956. 'payAmount' => $commonData['payMoney'],
  4957. 'deliveryType' => $params['deliveryType'],
  4958. 'buyTotal' => array_sum(array_column($commonData['goodsData'], 'buyNum'))
  4959. ], ['id' => $params['orderId']]);
  4960. if ($dbResult === false) {
  4961. $this->objDOrder->rollBack();
  4962. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4963. }
  4964. unset($dbResult);
  4965. //修改OrderGoods表中的数据
  4966. if (!empty($params['delOrderGoodsIds'])) {
  4967. $dbResult = $objMOrderGoods->updateDetails(['deleteStatus' => StatusCode::$delete], ['id' => $params['delOrderGoodsIds']]);
  4968. if (!$dbResult->isSuccess()) {
  4969. $this->objDOrder->rollBack();
  4970. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4971. }
  4972. unset($dbResult);
  4973. }
  4974. //查询当前订单商品,进行比对
  4975. $dbResult = $objMOrderGoods->getDetails([
  4976. 'orderId' => $params['orderId'],
  4977. 'deleteStatus' => StatusCode::$standard,
  4978. ]);
  4979. if (!$dbResult->isSuccess()) {
  4980. $this->objDOrder->rollBack();
  4981. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4982. }
  4983. $oldGoodsData = $dbResult->getData();
  4984. $hash = [];
  4985. foreach ($oldGoodsData as $goods) {
  4986. $hash[] = md5($goods['goodsId'] . $goods['skuId']);
  4987. }
  4988. $lockInventoryData = [];
  4989. foreach ($commonData['goodsData'] as $value) {
  4990. foreach ($value['shopGoodsData'] as $key => $val) {
  4991. $rowHash = md5($val['goodsId'] . $val['skuId']);
  4992. if (in_array($rowHash, $hash)) {
  4993. //update
  4994. $dbResult = $objMOrderGoods->updateDetails(
  4995. [
  4996. 'buyNum' => $val['buyNum'],
  4997. 'price' => $val['price'],
  4998. 'originPrice' => $val['originPrice'],
  4999. 'totalMoney' => $val['totalMoney'],
  5000. ],
  5001. ['orderId' => $params['orderId'], 'goodsId' => $val['goodsId'], 'skuId' => $val['skuId']]
  5002. );
  5003. if (!$dbResult->isSuccess()) {
  5004. $this->objDOrder->rollBack();
  5005. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  5006. }
  5007. } else {
  5008. //insert
  5009. $dbResult = $objMOrderGoods->addOrderGoods([
  5010. 'no' => $order['no'],
  5011. 'orderId' => $params['orderId'],
  5012. 'goodsId' => $val['goodsId'],
  5013. 'goodsName' => $val['goodsName'],
  5014. 'shopId' => $val['shopId'],//商铺id
  5015. 'shopName' => $val['shopName'],//商铺名称
  5016. 'originPrice' => $val['originPrice'],
  5017. 'price' => $val['price'],
  5018. 'buyNum' => $val['buyNum'],
  5019. 'totalMoney' => $val['totalMoney'],
  5020. 'skuId' => $val['skuId'],
  5021. 'goodsBasicId' => $val['goodsBasicId'],
  5022. 'goodsCode' => $val['goodsCode'],
  5023. 'deliverNum' => $val['buyNum'],//发货数量=购买数量
  5024. 'unitName' => $val['unitName'],//单位名称
  5025. 'conversion' => $val['conversion'],//换算比率
  5026. 'preferential' => $val['preferential'],//优惠券优惠金额
  5027. 'vipDiscount' => $val['vipDiscount'],//会员卡优惠金额
  5028. ]);
  5029. if (!$dbResult->isSuccess()) {
  5030. $this->objDOrder->rollBack();
  5031. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  5032. }
  5033. }
  5034. //锁定库存数据
  5035. $lockInventoryData[] = [
  5036. 'warehouseId' => $warehouse['id'],
  5037. 'materielId' => $val['goodsBasicId'],
  5038. 'lockingNum' => empty((float)($val['conversion'])) ? $val['buyNum'] : bcdiv($val['buyNum'], $val['conversion']),
  5039. 'originId' => $params['orderId'],
  5040. 'originNo' => $order['no'],
  5041. 'source' => StatusCode::$orderType['saleOrder'],
  5042. 'sourceNo' => $order['no'],
  5043. 'operatorId' => $order['customerId'],
  5044. 'operatorName' => $order['customerName'],
  5045. 'skuId' => $val['skuId'],
  5046. ];
  5047. }
  5048. }
  5049. //锁定库存
  5050. // $lockInventoryResult = $objMInventory->updateLockInventory($lockInventoryData);
  5051. // if (!$lockInventoryResult->isSuccess()) {
  5052. // $this->objDOrder->rollBack();
  5053. // return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  5054. // }
  5055. //修改收货人
  5056. $dbResult = $objMOrderReceive->updateReceive(
  5057. [
  5058. 'customerCode' => $addressData['customerCode'],//客户编码
  5059. 'realName' => $addressData['name'],//收货人姓名
  5060. 'mobile' => $addressData['mobile'],//收货人电话
  5061. 'address' => $addressData['address'],//收货人详细地址
  5062. 'provinceCode' => $addressData['provinceCode'],
  5063. 'cityCode' => $addressData['cityCode'],
  5064. 'districtCode' => $addressData['districtCode'],
  5065. ],
  5066. [
  5067. 'orderId' => $params['orderId']
  5068. ]
  5069. );
  5070. if (!$dbResult->isSuccess()) {
  5071. $this->objDOrder->rollBack();
  5072. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  5073. }
  5074. $this->objDOrder->commit();
  5075. /*
  5076. $_id = self::createEsDocumentId($params['orderId']);
  5077. $this->objDOrder->esupdateTypeFieldVaule([
  5078. 'totalMoney' => $commonData['totalMoney'],
  5079. 'payAmount' => $commonData['payMoney'],
  5080. 'buyTotal' => array_sum(array_column($commonData['goodsData'], 'buyNum')),//购买总数
  5081. 'deliveryType' => $params['deliveryType'],
  5082. 'realName' => $addressData['name'],//收货人姓名
  5083. 'mobile' => $addressData['mobile'],//收货人电话
  5084. 'address' => $addressData['address'],//收货详细地址
  5085. 'provinceCode' => $addressData['provinceCode'],//收货人省份编码
  5086. 'cityCode' => $addressData['cityCode'],//收货人城市编码
  5087. 'districtCode' => $addressData['districtCode'],//收货人区编码
  5088. ], $_id);
  5089. //修改es中的数据*/
  5090. return ResultWrapper::success('操作成功');
  5091. }
  5092. /**
  5093. * 订单编辑(现在只能编辑订单支付金额)
  5094. * @param $params
  5095. * @return ResultWrapper
  5096. */
  5097. public function orderEdit($params)
  5098. {
  5099. $order = $this->objDOrder->get(['id' => $params['orderId']]);
  5100. if ($order === false) {
  5101. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5102. }
  5103. if (empty($order)) {
  5104. return ResultWrapper::fail('订单不存在', ErrorCode::$paramError);
  5105. }
  5106. if (!isset($order['auditStatus'])
  5107. || $order['auditStatus'] == StatusCode::$auditStatus['auditPass']
  5108. || $order['payStatus'] == StatusCode::$standard
  5109. ) {
  5110. return ResultWrapper::fail('订单不能编辑', ErrorCode::$paramError);
  5111. }
  5112. //修改payAmount,将payAmount复制到字段originPayAmount
  5113. $update = [
  5114. 'payAmount' => sprintf("%.2f", $params['editAmount']),
  5115. 'originPayAmount' => $order['payAmount'],//原付款金额
  5116. ];
  5117. $dbResult = $this->objDOrder->update($update, ['id' => $params['orderId']]);
  5118. if ($dbResult === false) {
  5119. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5120. }
  5121. /*
  5122. //修改es中的数据
  5123. $_id = self::createEsDocumentId($params['orderId']);
  5124. $this->objDOrder->esupdateTypeFieldVaule([
  5125. 'payAmount' => $update['payAmount'],
  5126. 'originPayAmount' => $update['originPayAmount'],//原付款金额
  5127. ], $_id);*/
  5128. return ResultWrapper::success('操作成功');
  5129. }
  5130. /**
  5131. * Doc: (des="")
  5132. * User: XMing
  5133. * Date: 2020/9/2
  5134. * Time: 9:16 上午
  5135. * @param array $params
  5136. * @return ResultWrapper
  5137. *
  5138. * @throws \Exception
  5139. */
  5140. public function cashierOrder(array $params)
  5141. {
  5142. $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
  5143. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  5144. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  5145. $objMCart = new MCart($this->onlineUserId, $this->onlineEnterpriseId);
  5146. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  5147. $objDStaff = new DStaff();
  5148. $objStockCache = new Stock($this->onlineEnterpriseId);
  5149. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  5150. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5151. $goodsCommonData = $params['goodsData'];
  5152. //锁定库存 查询商铺对应的仓库
  5153. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  5154. $modelResult = $objMShop->getShopDataByShopIds(array_column($goodsCommonData['goodsData'], 'shopId'));
  5155. if (!$modelResult->isSuccess()) {
  5156. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  5157. }
  5158. $shopData = $modelResult->getData();
  5159. if (empty($shopData)) {
  5160. return ResultWrapper::fail('获取店铺数据失败', ErrorCode::$paramError);
  5161. }
  5162. //获取收银员信息
  5163. $allUids = [$this->loginUserCenterId];
  5164. if (isset($params['guideUids']) && !empty($params['guideUids'])) {
  5165. $ids = explode(',', $params['guideUids']);
  5166. $allUids = array_merge($allUids, $ids);
  5167. }
  5168. $userMap = [];
  5169. if (!empty($allUids)) {
  5170. $staffList = $objDStaff->select(['userCenterId' => $allUids], 'userCenterId,staffName');
  5171. if ($staffList === false) {
  5172. return ResultWrapper::fail($objDStaff->error(), ErrorCode::$dberror);
  5173. }
  5174. foreach ($staffList as $value) {
  5175. $userMap[$value['userCenterId']] = $value['staffName'];
  5176. }
  5177. }
  5178. $params['cashierName'] = isset($userMap[$this->loginUserCenterId]) ? $userMap[$this->loginUserCenterId] : '超级管理员';
  5179. $nameStr = '';
  5180. if (!empty($ids)) {
  5181. foreach ($ids as $uid) {
  5182. if (!empty($nameStr)) {
  5183. $nameStr .= ',';
  5184. }
  5185. $nameStr .= isset($userMap[$uid]) ? $userMap[$uid] : '';
  5186. }
  5187. }
  5188. $params['guideName'] = $nameStr;
  5189. $params['customerMobile'] = '';
  5190. //获取客户信息
  5191. $customerOwe = 0;
  5192. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  5193. $customerData = [
  5194. 'id' => StatusCode::$noneCustomer,
  5195. 'name' => '匿名客户'
  5196. ];
  5197. } else {
  5198. $customerDataResult = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  5199. if (!$customerDataResult->isSuccess()) {
  5200. return ResultWrapper::fail($customerDataResult->getData(), $customerDataResult->getErrorCode());
  5201. }
  5202. $customerData = $customerDataResult->getData();
  5203. //获取客户当前欠款
  5204. if (isset($customerData['id'])) {
  5205. $customerOwe = $objMCustomerBalance->getCustomerBalance($customerData['id']);
  5206. }
  5207. //获取客户手机号
  5208. $objDUserCenter = new DUserCenter();
  5209. $userInfo = $objDUserCenter->get(['id' => $this->onlineUserId], 'mobile');
  5210. if ($userInfo === false) {
  5211. return ResultWrapper::fail($objDUserCenter->error(), ErrorCode::$dberror);
  5212. }
  5213. $params['customerMobile'] = isset($userInfo['mobile']) ? $userInfo['mobile'] : '';
  5214. }
  5215. // 生成一个临时三方流水号,用来支持多个子订单作为一个订单支付,支付成功之后更新为对应的实际外部支付流水号
  5216. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['cashierOrder'], $this->onlineUserId);
  5217. $lockInventoryData = [];//锁定库存物料
  5218. $goodsSaleData = [];//销售数据
  5219. $allSn = [];//所有单号
  5220. $allOrderIds = [];//所有订单
  5221. $mapDetails = [];//订单商品
  5222. $createTime = time();
  5223. $allCartIds = [];
  5224. $shopName = '';
  5225. $shopId = 0;//目前只有一个
  5226. $this->objDOrder->beginTransaction();
  5227. foreach ($goodsCommonData['goodsData'] as $key => $val) {
  5228. $sn = createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  5229. //将数据写入索引表
  5230. $shopId = $val['shopId'];
  5231. $orderIndexData = [
  5232. 'shopId' => $val['shopId'],
  5233. 'userCenterId' => $params['userCenterId'],
  5234. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  5235. 'createTime' => time(),
  5236. 'updateTime' => time(),
  5237. 'deleteStatus' => StatusCode::$standard,
  5238. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5239. 'payStatus' => StatusCode::$delete,
  5240. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  5241. 'outStatus' => StatusCode::$delete,
  5242. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  5243. 'deliveryType' => $params['deliveryType'],
  5244. 'payType' => $params['payType'],
  5245. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  5246. 'no' => $sn,
  5247. 'orderType' => StatusCode::$orderType['cashierOrder'],
  5248. 'selfRuleId' => 0,
  5249. 'cashierUid' => $this->loginUserCenterId,
  5250. 'guideUids' => $params['guideUids']
  5251. ];
  5252. //1. 先写索引表
  5253. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5254. $orderId = $this->objDOrderIndex->insert($orderIndexData);
  5255. if ($orderId === false) {
  5256. $this->objDOrder->rollBack();
  5257. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5258. }
  5259. //3。上门自提订单,生成核销码
  5260. $verifyCode = self::createVerifyCode($orderId);
  5261. //兼容以前代码
  5262. $updateRes = $this->objDOrderIndex->update(['verifyCode' => $verifyCode], ['id' => $orderId]);
  5263. if ($updateRes === false) {
  5264. $this->objDOrder->rollBack();
  5265. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5266. }
  5267. //订单数据
  5268. $shopName = $val['shopName'];//现在就一个店铺
  5269. $masterOrder = [
  5270. 'id' => $orderId,//订单id
  5271. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  5272. 'userCenterId' => $params['userCenterId'],
  5273. 'shopId' => $val['shopId'],
  5274. 'shopName' => $val['shopName'],
  5275. 'no' => $sn,
  5276. 'outerTradeNo' => $tmpOuterTradeNo,
  5277. 'totalMoney' => $goodsCommonData['totalMoney'],
  5278. 'payAmount' => $goodsCommonData['payMoney'],
  5279. 'customerName' => isset($customerData['name']) ? $customerData['name'] : '',
  5280. 'remark' => $params['remark'],
  5281. 'deliveryType' => $params['deliveryType'],//配送方式
  5282. 'payType' => $params['payType'],//支付方式
  5283. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  5284. 'salesManName' => isset($customerData['salesManName']) ? $customerData['salesManName'] : '',
  5285. 'customerType' => isset($customerData['type']) ? $customerData['type'] : 0,
  5286. 'buyTotal' => array_sum(array_column($val['shopGoodsData'], 'buyNum')),
  5287. 'source' => $params['source'],//来源
  5288. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  5289. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  5290. 'outStatus' => StatusCode::$delete,
  5291. 'createTime' => time(),
  5292. 'updateTime' => time(),
  5293. 'customerOwe' => $customerOwe,//客户当前欠款
  5294. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5295. 'preferential' => $goodsCommonData['preferential'],//优惠券优惠金额
  5296. 'vipDiscount' => isset($goodsCommonData['vipDiscount']) ? $goodsCommonData['vipDiscount'] : 0,//会员卡优惠金额
  5297. 'vipDoubleDiscount' => isset($goodsCommonData['vipDoubleDiscount']) ? $goodsCommonData['vipDoubleDiscount'] : 0,//会员卡折上折优惠金额
  5298. 'originPayAmount' => $goodsCommonData['payMoney'],//原支付金额,
  5299. 'orderType' => StatusCode::$orderType['cashierOrder'],
  5300. 'verifyCode' => $verifyCode,
  5301. 'expressMoney' => isset($goodsCommonData['expressMoney']) ? $goodsCommonData['expressMoney'] : 0,
  5302. 'cashierUid' => $this->loginUserCenterId,
  5303. 'guideUids' => $params['guideUids'],
  5304. 'cashierName' => $params['cashierName'],
  5305. 'guideName' => $params['guideName'],
  5306. 'remMoney' => isset($goodsCommonData['rem_money']) ? $goodsCommonData['rem_money'] : 0,
  5307. 'changeSubMoney' => isset($goodsCommonData['subPrice']) ? $goodsCommonData['subPrice'] : 0,
  5308. 'isNoneUser' => $this->onlineUserId == StatusCode::$noneUserCenter ? StatusCode::$standard : StatusCode::$delete,
  5309. 'customerMobile' => $params['customerMobile'],
  5310. 'serialNum' => $objStockCache->createSerialSn(0,'Order'),
  5311. 'operatorName' => isset($params['operatorName']) ? $params['operatorName'] : '',
  5312. 'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : 0,
  5313. ];
  5314. $allOrderIds[] = $orderId;
  5315. //2。订单表
  5316. $orderId = $this->objDOrder->insert($masterOrder);
  5317. if ($orderId === false) {
  5318. $this->objDOrder->rollBack();
  5319. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5320. }
  5321. $masterOrder['goodsName'] = '';
  5322. foreach ($val['shopGoodsData'] as $k => &$v) {
  5323. $addOrderGoods = [
  5324. 'no' => $sn,
  5325. 'orderId' => $orderId,
  5326. 'goodsId' => $v['goodsId'],
  5327. 'goodsName' => $v['goodsName'],
  5328. 'shopId' => $val['shopId'],//商铺id
  5329. 'shopName' => $val['shopName'],//商铺名称
  5330. 'originPrice' => $v['originPrice'],
  5331. 'price' => $v['price'],
  5332. 'buyNum' => $v['buyNum'],
  5333. 'totalMoney' => $v['totalMoney'],
  5334. 'skuId' => $v['skuId'],
  5335. 'goodsBasicId' => $v['goodsBasicId'],
  5336. 'goodsCode' => $v['goodsCode'],
  5337. 'deliverNum' => $v['buyNum'],//发货数量=购买数量
  5338. 'unitName' => $v['unitName'],//单位名称
  5339. 'conversion' => $v['conversion'],//换算比率
  5340. 'preferential' => $v['preferential'],//优惠券优惠金额
  5341. 'vipDiscount' => $v['vipDiscount'],//会员卡优惠金额
  5342. 'categoryPath' => isset($v['categoryPath']) ? $v['categoryPath'] : '',//分类路径
  5343. 'brandId' => isset($v['brandId']) ? $v['brandId'] : 0,//品牌id
  5344. 'specGroup' => isset($v['specGroup']) && !empty($v['specGroup']) ? json_encode($v['specGroup']) : NULL,
  5345. 'goodsImages' => isset($v['goodsImages']) && is_string($v['goodsImages']) ? $v['goodsImages'] : '',
  5346. 'barCode' => isset($v['barCode']) ? $v['barCode'] : '',
  5347. 'storageCode' => isset($v['storageCode']) ? $v['storageCode'] : '',
  5348. 'categoryName' => isset($v['categoryName']) ? $v['categoryName'] : '',
  5349. 'brandName' => isset($v['brandName']) ? $v['brandName'] : '',
  5350. 'expressMoney' => isset($v['expressMoney']) ? $v['expressMoney'] : 0,
  5351. 'outNum' => 0,//已出库数量
  5352. 'outOfNum' => getArrayItem($v, 'buyNum', 0),//未出库数量
  5353. 'isEq' => getArrayItem($v,'isEq',StatusCode::$delete),
  5354. 'extends' => json_encode(getArrayItem($v, 'extends', null)),
  5355. ];
  5356. $lockInventoryData[] = [
  5357. 'warehouseId' => $shopData[$v['shopId']]['warehouseId'],
  5358. 'materielId' => $v['goodsBasicId'],
  5359. 'materielCode' => $v['goodsCode'],
  5360. 'lockingNum' => $v['buyNum'],
  5361. 'originId' => $orderId,
  5362. 'originNo' => $sn,
  5363. 'source' => StatusCode::$orderType['saleOrder'],
  5364. 'sourceNo' => $sn,
  5365. 'operatorId' => $masterOrder['customerId'],
  5366. 'operatorName' => $masterOrder['customerName'],
  5367. 'skuId' => $v['skuId'],
  5368. ];
  5369. $goodsSaleData [] = [
  5370. 'goodsId' => $addOrderGoods['goodsId'],
  5371. 'skuId' => $addOrderGoods['skuId'],
  5372. 'buyNum' => $addOrderGoods['buyNum'],
  5373. ];
  5374. //活动商品数据
  5375. if ($this->isFront) {
  5376. if (isset($v['activityId']) && $v['activityId'] != 0) {
  5377. $activityData[] = [
  5378. 'goodsId' => $v['goodsId'],
  5379. 'skuId' => $v['skuId'],
  5380. 'activityId' => $v['activityId'],
  5381. 'buyNum' => $v['buyNum']
  5382. ];
  5383. }
  5384. }
  5385. $masterOrder['goodsName'] .= $v['goodsName'] . ' ';
  5386. $result = $objMOrderGoods->addOrderGoods($addOrderGoods);
  5387. if (!$result->isSuccess()) {
  5388. $this->objDOrder->rollBack();
  5389. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5390. }
  5391. $allCartIds[] = $v['cartId'];
  5392. }
  5393. //存入ES
  5394. $masterOrder['verifyCode'] = isset($verifyCode) ? $verifyCode : '';
  5395. self::updateEsData($orderId, $masterOrder, [], $masterOrder['goodsName']);
  5396. $allSn[] = $sn;//所有订单号
  5397. }
  5398. $this->objDOrder->commit();
  5399. $this->objDOrder->beginTransaction();
  5400. //删除购物车内已生成订单商品
  5401. $objMCashierCart = new MCashierCart($this->onlineUserId, $this->onlineEnterpriseId, $this->loginUserCenterId);
  5402. $result = $objMCashierCart->delCart($allCartIds, true);
  5403. if (!$result->isSuccess()) {
  5404. $this->objDOrder->rollBack();
  5405. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5406. }
  5407. //将优惠券改为已使用
  5408. if (isset($goodsCommonData['useCoupon']) && !empty($goodsCommonData['useCoupon'])) {
  5409. $result = $objMUserCoupon->updateIsUse(['id' => $goodsCommonData['useCoupon']['id']], ['isUse' => StatusCode::$delete, 'useTime' => time()]);
  5410. if (!$result->isSuccess()) {
  5411. $this->objDOrder->rollBack();
  5412. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5413. }
  5414. }
  5415. //锁定库存商品数量
  5416. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  5417. $lockInventoryResult = $objMInventory->updateLockInventory($shopId,$lockInventoryData);
  5418. if (!$lockInventoryResult->isSuccess()) {
  5419. $this->objDOrder->rollBack();
  5420. return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  5421. }
  5422. //增加销量
  5423. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  5424. if (!empty($goodsSaleData)) {
  5425. foreach ($goodsSaleData as $value) {
  5426. $res = $objMGoods->updateSalesNum($value['goodsId'], $value['skuId'], $value['buyNum']);
  5427. if ($res === false) {
  5428. Logger::logs(E_USER_ERROR, '错误', __CLASS__, __LINE__, '商品增加销量失败');
  5429. }
  5430. }
  5431. }
  5432. //file_put_contents('/www/wwwroot/logs/api.junhailan.com/MSaleOrder_error.log', date('Y-m-d H:i:s') . '数据:' . var_export($mapDetails, true) . PHP_EOL, FILE_APPEND);
  5433. $this->objSaleOrder->setGoodsDetails($mapDetails);
  5434. //统计订单信息
  5435. self::noticeStatistics([
  5436. 'userCenterId' => $params['userCenterId'],
  5437. 'enterpriseId' => $this->onlineEnterpriseId,
  5438. 'customerId' => $params['customerId'],
  5439. 'no' => $allSn,
  5440. 'noticeType' => 'create',
  5441. ], 'MOrderStatistics');
  5442. //写日志
  5443. foreach ($allSn as $sn) {
  5444. parent::saveLog([
  5445. 'no' => $sn,
  5446. 'actionType' => '创建订单',//创建订单
  5447. 'operationData' => '',
  5448. 'userCenterId' => $params['userCenterId'],
  5449. 'enterpriseId' => $this->onlineEnterpriseId,
  5450. 'createTime' => time(),
  5451. ]);
  5452. }
  5453. //自动审核订单
  5454. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  5455. foreach ($allOrderIds as $key => $id) {
  5456. //自动审核订单
  5457. $auditResult = self::updateAuditStatus([
  5458. 'id' => $id,
  5459. 'audit' => '自动审核',
  5460. 'auditId' => $this->onlineUserId,
  5461. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  5462. ]);
  5463. if (!$auditResult->isSuccess()) {
  5464. $this->objDOrder->rollBack();
  5465. return ResultWrapper::fail($auditResult->getData(), $auditResult->getErrorCode());
  5466. }
  5467. $outId = $auditResult->getData();//出库单id
  5468. //自动出库
  5469. $dbResult = $objMInventoryOut->updateInventoryOutStatus(['id' => $outId, 'auditId' => $this->loginUserCenterId, 'auditName' => '销售自动审核']);
  5470. if (!$dbResult->isSuccess()) {
  5471. $this->objDOrder->rollBack();
  5472. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5473. }
  5474. }
  5475. //确认收款
  5476. $dbResult = self::updateOrderPayData(['payStatus' => StatusCode::$standard, 'payTime' => time()], ['id' => $allOrderIds]);
  5477. if (!$dbResult->isSuccess()) {
  5478. $this->objDOrder->rollBack();
  5479. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5480. }
  5481. //确认收货
  5482. foreach ($allOrderIds as $orderId) {
  5483. $dbResult = self::updateOrderStatus($orderId, ['orderStatus' => StatusCode::$orderStatus['finish']], []);
  5484. if (!$dbResult->isSuccess()) {
  5485. $this->objDOrder->rollBack();
  5486. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5487. }
  5488. $objMCashier = new MCashier($this->onlineUserId, $this->onlineEnterpriseId);
  5489. $cashierResult = $objMCashier->calculatePushMoney($orderId);
  5490. if (!$cashierResult->isSuccess()) {
  5491. Logger::logs(E_USER_ERROR, '订单提成计算失败', __CLASS__, __LINE__, $cashierResult->getData());
  5492. }
  5493. }
  5494. //创建收款单
  5495. $received = [
  5496. 'currentAccountName' => $params['currentAccountName'],
  5497. 'financeType' => '销售收款',
  5498. 'financeTypeId' => 2,
  5499. 'shopId' => $shopId,
  5500. 'shopName' => $shopName,
  5501. 'receiptTime' => time(),
  5502. 'operatorId' => $this->loginUserCenterId,
  5503. 'accountList' => $params['accountList'],
  5504. 'customerId' => $customerData['id'],
  5505. 'customerName' => $customerData['name'],
  5506. 'sourceNo' => $sn,
  5507. 'sourceNoMoney' => $goodsCommonData['payMoney'],
  5508. 'createTime' => time(),
  5509. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5510. 'updateTime' => time(),
  5511. ];
  5512. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->loginUserCenterId);
  5513. $receivedResult = $objMReceived->addReceived($received, true);
  5514. if (!$receivedResult->isSuccess()) {
  5515. $this->objDOrder->rollBack();
  5516. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  5517. }
  5518. $this->objDOrder->commit();
  5519. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  5520. $objDCashierCustomerPrice = new DCashierCustomerPrice();
  5521. $objDCashierCustomerPrice->setTable('qianniao_cashier_customer_price_' . $this->onlineEnterpriseId);
  5522. $objDCashierCustomerPrice->delete(['cashierUid' => $this->loginUserCenterId, 'customerUid' => StatusCode::$noneUserCenter]);
  5523. }
  5524. return ResultWrapper::success($orderId);
  5525. }
  5526. /**
  5527. * 订单打印小票
  5528. */
  5529. public function printOrder()
  5530. {
  5531. $data = [];
  5532. $goodsDetails = $this->objSaleOrder->getGoodsDetails();
  5533. foreach ($goodsDetails as $value) {
  5534. $data[$value['goodsId']]['title'] = $value['goodsName'];
  5535. $data[$value['goodsId']]['skuData'][] = [
  5536. 'skuName' => isset($value['specName']) ? $value['specName'] : '',
  5537. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  5538. 'unitPrice' => isset($value['unitPrice']) ? $value['unitPrice'] : 0.00,
  5539. 'num' => isset($value['buyNum']) ? $value['buyNum'] : 0,
  5540. 'amountPrice' => isset($value['totalMoney']) ? $value['totalMoney'] : 0
  5541. ];
  5542. }
  5543. $printData = [
  5544. 'createTime' => $this->objSaleOrder->getCreateTime(),
  5545. 'shopName' => $this->objSaleOrder->getShopName(),
  5546. 'title' => $this->objSaleOrder->getReceiptTitle(),
  5547. 'codeName' => $this->objSaleOrder->getCodeName(),
  5548. 'code' => $this->objSaleOrder->getNo(),
  5549. 'userName' => $this->objSaleOrder->getCustomerName(),
  5550. 'mobile' => $this->objSaleOrder->getCustomerMobile(),
  5551. 'preferential' => $this->objSaleOrder->getPreferentialAmount(), //优惠金额
  5552. 'totalMoney' => $this->objSaleOrder->getTotalAmount(),
  5553. 'payAmount' => $this->objSaleOrder->getPayAmount(),
  5554. 'address' => $this->objSaleOrder->getAddress(),
  5555. 'details' => $data
  5556. ];
  5557. $formatPrint = parent::formatMsg($printData);
  5558. $objCloudPrint = new CloudPrint();
  5559. $objCloudPrint->sendMsg($formatPrint, $this->onlineEnterpriseId);
  5560. }
  5561. /**
  5562. * 将所有商品库存转换为主单位sku
  5563. * @param $data
  5564. * @return array|ResultWrapper
  5565. * @throws \Exception
  5566. */
  5567. public function formatMerge($data)
  5568. {
  5569. //将相同的商品合并到一起并启用到主单位的
  5570. $allMapping = [];
  5571. if (empty($data)) return $data;
  5572. $allMapping = [];
  5573. $all = [];
  5574. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  5575. $res = $objMSku->getMaterSkuId(['goodsId' => array_values(array_unique(array_column($data, 'goodsBasicId'))), 'isMaster' => StatusCode::$standard, 'deleteStatus' => StatusCode::$standard]);
  5576. if (!$res->isSuccess()) {
  5577. return ResultWrapper::fail($res->getData(), ErrorCode::$dberror);
  5578. }
  5579. $skuData = $res->getData();
  5580. foreach ($data as &$goods) {
  5581. $goods['masterSkuId'] = $skuData[$goods['goodsBasicId']];
  5582. $allMapping[$goods['goodsId']][] = [
  5583. 'buyNum' => $goods['conversion'] == 0 ? $goods['buyNum'] : bcdiv($goods['buyNum'], $goods['conversion'], 2),
  5584. 'skuId' => $goods['skuId'],
  5585. 'conversion' => $goods['conversion'],
  5586. 'goodsId' => $goods['goodsId'],
  5587. 'masterSkuId' => $goods['masterSkuId']
  5588. ];
  5589. }
  5590. unset($goods);
  5591. foreach ($allMapping as $key => $goods) {
  5592. $all[] = [
  5593. 'buyNum' => array_sum(array_column($allMapping[$key], 'buyNum')),
  5594. 'goodsId' => $goods[0]['goodsId'],
  5595. 'skuId' => $goods[0]['masterSkuId'],//都换算成主单位的
  5596. ];
  5597. }
  5598. return ResultWrapper::success($all);
  5599. }
  5600. /**
  5601. * 确认收款检测出库状态
  5602. * @param $id
  5603. * @return ResultWrapper
  5604. */
  5605. public function checkOutOrderStatus($id)
  5606. {
  5607. $dbResult = $this->objDOrder->get_field('outStatus', ['id' => $id]);
  5608. if ($dbResult === false) {
  5609. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5610. }
  5611. if (empty($dbResult)) {
  5612. return ResultWrapper::fail('没有找到订单信息', ErrorCode::$paramError);
  5613. }
  5614. if ($dbResult == StatusCode::$delete) {
  5615. return ResultWrapper::fail('订单未出库暂时不能确认收款', ErrorCode::$paramError);
  5616. }
  5617. return ResultWrapper::success($dbResult);
  5618. }
  5619. /**
  5620. * 销售订单毛利明细
  5621. * @param $params
  5622. * @return ResultWrapper
  5623. * @throws \Exception
  5624. */
  5625. public function getOrderProfit($params,$export = 0)
  5626. {
  5627. $limit = $params['limit'];
  5628. unset($params['limit']);
  5629. $offset = $params['offset'];
  5630. unset($params['offset']);
  5631. if($export){
  5632. $limit = 999;
  5633. $offset = 0;
  5634. }
  5635. $modelResult = self::formatOrderTableName($params);
  5636. if (!$modelResult->isSuccess()) {
  5637. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  5638. }
  5639. $tables = $modelResult->getData();
  5640. if (empty($tables)) {
  5641. return ResultWrapper::fail('表后缀计算失败', ErrorCode::$paramError);
  5642. }
  5643. $whereSql = ' where o.shopId = ' . $params['shopId'] . ' and g.goodsId = ' . $params['goodsId'] . ' and o.createTime between ' . $params['start'] . ' and ' . $params['end'];
  5644. if (isset($params['customerId']) && !empty($params['customerId'])) {
  5645. $whereSql .= ' and customerId = ' . $params['customerId'];
  5646. }
  5647. $field = 'o.id as orderId,o.no,o.customerId,o.customerName,o.createTime,o.shopId,o.shopName,o.orderStatus,o.outStatus,o.orderType,g.goodsId,g.goodsCode,g.goodsName,g.price,g.buyNum,(g.preferential + g.vipDiscount) as discount, g.outCostPrice,g.goodsBasicId,g.skuId,g.totalMoney';
  5648. $sql = '';
  5649. foreach ($tables as $value) {
  5650. !empty($sql) && $sql = $sql . ' union all ';
  5651. $orderTableName = 'qianniao_order_' . $this->onlineEnterpriseId . '_' . $value;
  5652. $orderGoodsTableName = 'qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $value;
  5653. $sql = '(select ' . $field . ' from ' . $orderGoodsTableName . ' g left join ' . $orderTableName . ' o on o.id = g.orderId ' . $whereSql . ')';
  5654. }
  5655. $twoField = 'orderId,no,customerId,customerName,createTime,shopId,shopName,orderStatus,outStatus,orderType,goodsId,goodsCode,goodsName,price,buyNum,discount,outCostPrice,goodsBasicId,skuId,totalMoney';
  5656. $sql = 'select ' . $twoField . ' from (' . $sql . ') as details ';
  5657. $selectSql = $sql . 'order by createTime desc limit ' . $offset . ',' . $limit;
  5658. $dbResult = $this->objDOrder->query($selectSql);
  5659. if ($dbResult === false) {
  5660. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$paramError);
  5661. }
  5662. //提取客户数据
  5663. if (empty($dbResult)) {
  5664. return ResultWrapper::fail('查询结果为空', ErrorCode::$dberror);
  5665. }
  5666. $customerData = [];
  5667. foreach ($dbResult as &$value) {
  5668. if (!isset($customerData[$value['customerId']])) {
  5669. $customerData[$value['customerId']] = [
  5670. 'id' => $value['customerId'],
  5671. 'name' => $value['customerName'],
  5672. ];
  5673. }
  5674. //销售成本
  5675. $value['saleCostAmount'] = bcmul($value['buyNum'], $value['outCostPrice'], 4);
  5676. //销售毛利
  5677. $value['saleProfitAmount'] = bcsub($value['totalMoney'], $value['saleCostAmount'], 8);
  5678. //毛利率
  5679. $value['saleProfitRate'] = "0.00";
  5680. if ($value['saleProfitAmount'] > 0 && $value['saleCostAmount'] > 0) {
  5681. $value['saleProfitRate'] = bcmul(bcdiv($value['saleProfitAmount'], $value['totalMoney'], 8), 100, 4);
  5682. }
  5683. }
  5684. unset($value);
  5685. if($export){
  5686. self::exportOrderProfit($dbResult);
  5687. exit;
  5688. }
  5689. $countSql = 'select count(orderId) as count from ( ' . $sql . ' ) as selectDetails';
  5690. $totalDbResult = $this->objDOrder->query($countSql);
  5691. if ($totalDbResult === false) {
  5692. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5693. }
  5694. $total = array_shift($totalDbResult)['count'];
  5695. $return['data']['customerData'] = array_values($customerData);
  5696. $return['data']['data'] = $dbResult;
  5697. $return['total'] = ($total) ? intval($total) : 0;
  5698. return ResultWrapper::success($return);
  5699. }
  5700. /**
  5701. * 计算表名后缀
  5702. * @param $params
  5703. * @return ResultWrapper
  5704. * @throws \Exception
  5705. */
  5706. public function formatOrderTableName($params)
  5707. {
  5708. $whereSql = '';
  5709. if (isset($params['shopId']) && !empty($params['shopId'])) {
  5710. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5711. $whereSql .= ' shopId = ' . $params['shopId'];
  5712. }
  5713. if (isset($params['customerId']) && !empty($params['customerId'])) {
  5714. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5715. $whereSql .= ' customerId = ' . $params['customerId'];
  5716. }
  5717. if (isset($params['start']) && !empty($params['start']) && isset($params['end']) && !empty($params['end'])) {
  5718. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5719. $whereSql .= ' createTime between ' . $params['start'] . ' and ' . $params['end'];
  5720. }
  5721. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5722. $indexSql = 'select userCenterId from ' . $this->objDOrderIndex->get_Table() . $whereSql;
  5723. $dbResult = $this->objDOrderIndex->query($indexSql);
  5724. if ($dbResult === false) {
  5725. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$paramError);
  5726. }
  5727. if (empty($dbResult)) {
  5728. return ResultWrapper::success([]);
  5729. }
  5730. $tables = [];
  5731. foreach ($dbResult as $value) {
  5732. //格式化数据 根据userCenterId 计算所有goods表名
  5733. $num = (int)ceil($value['userCenterId'] / $this->cutTable);
  5734. $tableName = 'qianniao_order_' . $this->onlineEnterpriseId . '_' . $num;
  5735. $existsTable = $this->objDOrder->existsTable($tableName);
  5736. if ($existsTable && !in_array($num, $tables)) {
  5737. $tables[] = $num;
  5738. }
  5739. }
  5740. return ResultWrapper::success($tables);
  5741. }
  5742. /************************************************统计项 start******************************************************/
  5743. /**
  5744. * @param $key
  5745. * @param $shopId
  5746. * @return ResultWrapper
  5747. */
  5748. public function businessOverview($key, $shopId)
  5749. {
  5750. $result = $this->objOverviewCache->getBusinessOverview($this->onlineEnterpriseId, $key, $shopId);
  5751. return $result;
  5752. }
  5753. /**
  5754. * 客单价
  5755. * @param $key
  5756. * @param $shopId
  5757. * @return int|string
  5758. */
  5759. public function customerAverageMoney($key, $shopId)
  5760. {
  5761. $objCustomerCache = new CustomerCache();
  5762. $orderConfirmedMoney = $this->objOverviewCache->getBusinessOverview($this->onlineEnterpriseId, 'orderConfirmedMoney', $shopId);//营业额
  5763. $customerNum = array_sum($objCustomerCache->getTodayCustomerOrderInfo($this->onlineEnterpriseId, null, $shopId));
  5764. if ($orderConfirmedMoney == 0 || $customerNum == 0) return 0;
  5765. return bcdiv($orderConfirmedMoney, $customerNum, 2);
  5766. }
  5767. /**
  5768. * 后置操作
  5769. */
  5770. public function __destruct()
  5771. {
  5772. // TODO: Implement __destruct() method.
  5773. if ($this->isEnablePrint) self::printOrder();
  5774. }
  5775. /**
  5776. * 今日下单客户数量
  5777. * @param $shopId
  5778. * @return int
  5779. */
  5780. public function getTodayCustomerOrderNum($shopId = null)
  5781. {
  5782. $todayStart = date('Y-m-d 00:00:00', time());
  5783. $todayEnd = date('Y-m-d 23:59:59', time());
  5784. $fields = 'id';
  5785. $sql = 'SELECT ' . $fields . ' FROM qianniao_order_index_' . $this->onlineEnterpriseId . '
  5786. WHERE auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' AND
  5787. createTime BETWEEN ' . strtotime($todayStart) . ' AND ' . strtotime($todayEnd);
  5788. if (!empty($shopId)) {
  5789. $sql .= ' and shopId = ' . $shopId;
  5790. }
  5791. $sql .= ' GROUP BY customerId';
  5792. $result = $this->objDOrder->query($sql);
  5793. if ($result === false) {
  5794. Logger::logs(E_USER_ERROR, '查询错误', __CLASS__, __LINE__, $this->objDOrder->error());
  5795. return 0;
  5796. }
  5797. return count((array)$result);
  5798. }
  5799. /**
  5800. * 今日客单价
  5801. * @param null $shopId
  5802. * @return int|string|null
  5803. */
  5804. public function getTodayOrder($shopId = null)
  5805. {
  5806. $todayStart = date('Y-m-d 00:00:00', time());
  5807. $todayEnd = date('Y-m-d 23:59:59', time());
  5808. $fields = 'userCenterId';
  5809. if (!empty($shopId)) {
  5810. $shopId = ' and shopId = ' . $shopId;
  5811. }else{
  5812. $shopId = '';
  5813. }
  5814. $sql = 'select count(distinct '.$fields.') as num ,sum(payAmount) as money from qianniao_order_'. $this->onlineEnterpriseId .'_1' .
  5815. ' where auditStatus = ' . StatusCode::$auditStatus['auditPass'] .'
  5816. and createTime BETWEEN '.strtotime($todayStart). ' and '. strtotime($todayEnd).$shopId;
  5817. $result = $this->objDOrder->query($sql);
  5818. if ($result === false) {
  5819. return 0;
  5820. }
  5821. $num = $result[0]['num'];
  5822. $money = $result[0]['money'];
  5823. if (empty($money) || empty($num)) {
  5824. return 0;
  5825. }
  5826. return bcdiv($money, $num, 2);
  5827. }
  5828. /**
  5829. * Doc: (des="订单分配业务员")
  5830. * User: XMing
  5831. * Date: 2020/8/26
  5832. * Time: 3:39 下午
  5833. * @param array $params
  5834. * @return ResultWrapper
  5835. * @throws \Exception
  5836. */
  5837. public function setSalesMan(array $params)
  5838. {
  5839. //在索引表中查询订单
  5840. $orderIndex = $this->objDOrderIndex->get(['id' => $params['orderId']]);
  5841. if ($orderIndex === false) {
  5842. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5843. }
  5844. if (empty($orderIndex)) {
  5845. return ResultWrapper::fail('未查询到指定订单', ErrorCode::$paramError);
  5846. }
  5847. if (!empty($orderIndex['salesManId'])) {
  5848. return ResultWrapper::fail('已分配过业务员', ErrorCode::$paramError);
  5849. }
  5850. $dbResult = $this->objDCustomer->get(['id' => $orderIndex['customerId']]);
  5851. if ($dbResult === false) {
  5852. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  5853. }
  5854. $customerInfo = $dbResult;
  5855. if (empty($customerInfo)) {
  5856. return ResultWrapper::fail('未查询到指定客户', ErrorCode::$dberror);
  5857. }
  5858. if($params['ifSalesMan'] == StatusCode::$delete){
  5859. if ( !empty($customerInfo['salesManId']) && $customerInfo['salesManId'] != $params['salesManId'] ) {
  5860. return ResultWrapper::fail('客户只能分配当前 -'.$customerInfo['salesManName'].' -业务员', ErrorCode::$paramError);
  5861. }
  5862. $salesManId = $params['salesManId'];
  5863. $salesManName = $params['salesManName'];
  5864. }else{
  5865. $salesManId = $customerInfo['salesManId'];
  5866. $salesManName = $customerInfo['salesManName'];
  5867. }
  5868. //更新数据
  5869. $time = time();
  5870. $beginStatus = $this->objDOrderIndex->beginTransaction();
  5871. //给客户分配业务员
  5872. if($params['ifSalesMan'] == StatusCode::$delete){
  5873. $dbResult = $this->objDCustomer->update(['salesManId' => $salesManId, 'salesManName' => $salesManName], ['id' => $orderIndex['customerId']]);
  5874. if ($dbResult === false) {
  5875. $this->objDOrderIndex->rollBack();
  5876. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  5877. }
  5878. }
  5879. //更新订单表
  5880. //只更新该订单
  5881. $dbResult = $this->objDOrderIndex->update(['salesManId' => $salesManId, 'updateTime' => $time], ['id' => $params['orderId']]);
  5882. if($dbResult === false){
  5883. $this->objDOrderIndex->rollBack();
  5884. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5885. }
  5886. $updateData = ['salesManId' => $salesManId, 'salesManName' => $salesManName, 'updateTime' => $time];
  5887. $dbResult = $this->objDOrder->update($updateData, ['id' => $params['orderId']]);
  5888. if($dbResult === false){
  5889. $this->objDOrderIndex->rollBack();
  5890. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5891. }
  5892. /* //获取此客户未分配业务员的订单
  5893. $orderIndexLists = $this->objDOrderIndex->select(['salesManId' => 0, 'customerId' => $orderIndex['customerId']]);
  5894. if ($orderIndexLists === false) {
  5895. $this->objDOrderIndex->rollBack();
  5896. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5897. }
  5898. if (empty($orderIndexLists)) {
  5899. $this->objDOrderIndex->rollBack();
  5900. return ResultWrapper::fail('未查询到需要更新的数据', ErrorCode::$paramError);
  5901. }
  5902. //计算数据的分表
  5903. $updateData = ['salesManId' => $params['salesManId'], 'salesManName' => $params['salesManName'], 'updateTime' => $time];
  5904. $allGroupData = [];
  5905. $allOrderIds = [];
  5906. foreach ($orderIndexLists as $key => $val) {
  5907. $tableNum = ceil($val['userCenterId'] / $this->cutTable);
  5908. $allGroupData[$tableNum][] = $val['id'];
  5909. $allOrderIds[] = $val['id'];
  5910. }
  5911. //更新订单索引表
  5912. $updateOrderIndex = $this->objDOrderIndex->update(['salesManId' => $params['salesManId'], 'updateTime' => $time], ['id' => $allOrderIds]);
  5913. if ($updateOrderIndex === false) {
  5914. $this->objDOrderIndex->rollBack();
  5915. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5916. }
  5917. //在对应分表中更新数据
  5918. foreach ($allGroupData as $k => $orderIds) {
  5919. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  5920. $updateOrder = $this->objDOrder->update($updateData, ['id' => $orderIds]);
  5921. if ($updateOrder === false) {
  5922. $this->objDOrderIndex->rollBack();
  5923. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5924. }
  5925. }*/
  5926. /*
  5927. //修改es
  5928. foreach ($allOrderIds as $orderId) {
  5929. $_id = self::createEsDocumentId($orderId);
  5930. $this->objDOrder->esupdateTypeFieldVaule($updateData, $_id);
  5931. }*/
  5932. $beginStatus && $this->objDOrderIndex->commit();
  5933. return ResultWrapper::success('操作成功');
  5934. }
  5935. /**
  5936. * Doc: (des="")
  5937. * User: XMing
  5938. * Date: 2020/9/4
  5939. * Time: 12:21 下午
  5940. * @param string $verifyCode
  5941. * @return ResultWrapper
  5942. * @throws \Exception
  5943. */
  5944. public function getOrderByVerifyCode(string $verifyCode)
  5945. {
  5946. $orderId = $this->objDOrderIndex->get_field('id', ['verifyCode' => $verifyCode]);
  5947. if ($orderId === false) {
  5948. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5949. }
  5950. if (empty($orderId)) {
  5951. return ResultWrapper::fail('核销码已失效或不存在', ErrorCode::$paramError);
  5952. }
  5953. $orderInfoResult = self::getOrderInfoById($orderId);
  5954. if (!$orderInfoResult->isSuccess()) {
  5955. return ResultWrapper::fail($orderInfoResult->getData(), $orderInfoResult->getErrorCode());
  5956. }
  5957. return ResultWrapper::success($orderInfoResult->getData());
  5958. }
  5959. /**
  5960. * Doc: (des="核销订单")
  5961. * User: XMing
  5962. * Date: 2020/9/4
  5963. * Time: 2:34 下午
  5964. * @param int $id
  5965. * @param array $header
  5966. * @return ResultWrapper
  5967. * @throws \Exception
  5968. */
  5969. public function verification(int $id, $header)
  5970. {
  5971. $orderInfo = $this->objDOrderIndex->get(['id' => $id]);
  5972. if ($orderInfo === false) {
  5973. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5974. }
  5975. if (empty($orderInfo)) {
  5976. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  5977. }
  5978. if ($orderInfo['orderStatus'] == StatusCode::$orderStatus['close']) {
  5979. return ResultWrapper::fail('订单已取消', ErrorCode::$paramError);
  5980. }
  5981. if ($orderInfo['orderStatus'] == StatusCode::$orderStatus['finish']) {
  5982. return ResultWrapper::fail('订单已经核销过了', ErrorCode::$paramError);
  5983. }
  5984. if ($orderInfo['auditStatus'] != StatusCode::$auditStatus['auditPass']) {
  5985. return ResultWrapper::fail('订单尚未审核', ErrorCode::$paramError);
  5986. }
  5987. if ($orderInfo['outStatus'] != StatusCode::$standard) {
  5988. return ResultWrapper::fail('订单还没有出库,不能进行核销操作', ErrorCode::$paramError);
  5989. }
  5990. $orderResult = self::updateOrderStatus($id, ['orderStatus' => StatusCode::$standard], $header);
  5991. if (!$orderResult->isSuccess()) {
  5992. return ResultWrapper::fail($orderResult->getData(), $orderResult->getErrorCode());
  5993. }
  5994. return ResultWrapper::success($orderResult->getData());
  5995. }
  5996. /**
  5997. * Doc: (des="")
  5998. * User: XMing
  5999. * Date: 2020/9/8
  6000. * Time: 7:14 下午
  6001. * @param int $id
  6002. * @return ResultWrapper
  6003. */
  6004. public function getExpressInfoByOrderId(int $id)
  6005. {
  6006. $orderIndex = $this->objDOrderIndex->get(['id' => $id]);
  6007. if ($orderIndex === false) {
  6008. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6009. }
  6010. if (empty($orderIndex)) {
  6011. return ResultWrapper::fail('为获取到指定订单', ErrorCode::$paramError);
  6012. }
  6013. if (empty($orderIndex['deliveryNo']) || empty($orderIndex['expressId'])) {
  6014. return ResultWrapper::success([]);
  6015. }
  6016. $objDExpressCode = new DExpressCode();
  6017. $expressCode = $objDExpressCode->get(['id' => $orderIndex['expressId']]);
  6018. if ($expressCode === false) {
  6019. return ResultWrapper::fail($objDExpressCode->error(), ErrorCode::$dberror);
  6020. }
  6021. if (empty($expressCode)) {
  6022. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  6023. }
  6024. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  6025. $basicSetupResult = $objMBasicSetup->getBasicField('logistics_form');
  6026. if (!$basicSetupResult->isSuccess()) {
  6027. return ResultWrapper::fail($basicSetupResult->getData(), $basicSetupResult->getErrorCode());
  6028. }
  6029. $basicSetup = $basicSetupResult->getData();
  6030. $basicSetup = isset($basicSetup['logistics_form']) ? $basicSetup['logistics_form'] : [];
  6031. if (!isset($basicSetup['express_type']) || empty($basicSetup['express_type'])) {
  6032. return ResultWrapper::fail('未配置物流接口', ErrorCode::$paramError);
  6033. }
  6034. $map = [];
  6035. $return = [
  6036. 'list' => [],
  6037. 'stateMsg' => '',
  6038. 'nu' => $orderIndex['deliveryNo'],
  6039. 'expressName' => $expressCode['name']
  6040. ];
  6041. switch ($basicSetup['express_type']) {
  6042. case 'express_hundred':
  6043. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6044. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  6045. $mobile = $this->objDOrderReceive->get_field('mobile', ['orderId' => $orderIndex['id']]);
  6046. if ($mobile === false) {
  6047. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  6048. }
  6049. if (!isset($basicSetup['express_hundred'])) {
  6050. return ResultWrapper::fail('快递100未进行配置', ErrorCode::$paramError);
  6051. }
  6052. $express_hundred = $basicSetup['express_hundred'];
  6053. if (!isset($express_hundred['customerCode']) || empty($express_hundred['customerCode']) ||
  6054. !isset($express_hundred['accessKey']) || empty($express_hundred['accessKey'])) {
  6055. return ResultWrapper::fail('快递100配置有误', ErrorCode::$paramError);
  6056. }
  6057. /*$kuaidi100Config = Factory::config()->get('kuaidi100');
  6058. if(empty($kuaidi100Config) || !isset($kuaidi100Config['customer']) || !isset($kuaidi100Config['key']) ){
  6059. return ResultWrapper::fail('快递100配置有误',ErrorCode::$paramError);
  6060. }*/
  6061. //$objQuery = new Query($kuaidi100Config['customer'], $kuaidi100Config['key']);
  6062. /*$kuaidiData = [
  6063. 'com' => 'yunda',
  6064. 'num' => '3103922659603',
  6065. 'phone' => 17600105150,
  6066. ];*/
  6067. $objQuery = new Query($express_hundred['customerCode'], $express_hundred['accessKey']);
  6068. $kuaidiData = [
  6069. 'com' => $expressCode['kuaidi100'],
  6070. 'num' => $orderIndex['deliveryNo'],
  6071. 'phone' => $mobile,
  6072. ];
  6073. $result = $objQuery->pollQuery($kuaidiData);
  6074. if (!$result->isSuccess()) {
  6075. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  6076. }
  6077. $resultData = $result->getData();
  6078. $list = isset($resultData['data']) ? $resultData['data'] : [];
  6079. $return['stateMsg'] = $objQuery->getState(isset($resultData['state']) ? $resultData['state'] : 0);
  6080. $map = self::formatExpressList($list, 'express_hundred');
  6081. break;
  6082. case 'express_bird':
  6083. if (!isset($basicSetup['express_bird'])) {
  6084. return ResultWrapper::fail('快递鸟未进行配置', ErrorCode::$paramError);
  6085. }
  6086. $express_bird = $basicSetup['express_bird'];
  6087. if (!isset($express_bird['userId']) || empty($express_bird['userId']) ||
  6088. !isset($express_bird['apiKey']) || empty($express_bird['apiKey'])) {
  6089. return ResultWrapper::fail('快递鸟配置有误', ErrorCode::$paramError);
  6090. }
  6091. /*$kdniaoConfig = Factory::config()->get('kdniao');
  6092. if(empty($kdniaoConfig) || !isset($kdniaoConfig['EBusinessID']) || !isset($kdniaoConfig['key']) ){
  6093. return ResultWrapper::fail('快递鸟配置错误', ErrorCode::$configEroor);
  6094. }*/
  6095. //$objQuery = new KDNiaoQuery($kdniaoConfig['EBusinessID'], $kdniaoConfig['key']);
  6096. /*$kuaidiData = [
  6097. 'com' => 'HTKY',
  6098. 'num' => '557021498255630',
  6099. ];*/
  6100. $objQuery = new KDNiaoQuery($express_bird['userId'], $express_bird['apiKey']);
  6101. $kuaidiData = [
  6102. 'com' => $expressCode['kdniao'],
  6103. 'num' => $orderIndex['deliveryNo'],
  6104. ];
  6105. $result = $objQuery->EbusinessOrderHandle($kuaidiData);
  6106. if (!$result->isSuccess()) {
  6107. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  6108. }
  6109. $resultData = $result->getData();
  6110. $list = isset($resultData['Traces']) ? $resultData['Traces'] : [];
  6111. $return['stateMsg'] = $objQuery->getState(isset($resultData['State']) ? $resultData['State'] : 0);
  6112. $map = self::formatExpressList($list, 'express_bird');
  6113. break;
  6114. }
  6115. $return['list'] = $map;
  6116. return ResultWrapper::success($return);
  6117. }
  6118. /**
  6119. * Doc: (des="修改订单的发货信息")
  6120. * User: XMing
  6121. * Date: 2020/9/9
  6122. * Time: 11:12 上午
  6123. * @param string $no
  6124. * @param array $params
  6125. * @param int $orderId
  6126. * @return ResultWrapper
  6127. * @throws \Exception
  6128. */
  6129. public function editOrderExpress(string $no, array $params, int $orderId = 0)
  6130. {
  6131. if (empty($orderId)) {
  6132. $orderIndex = $this->objDOrderIndex->get(['no' => $no]);
  6133. } else {
  6134. $orderIndex = $this->objDOrderIndex->get(['id' => $orderId]);
  6135. }
  6136. if ($orderIndex === false) {
  6137. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6138. }
  6139. if (empty($orderIndex)) {
  6140. return ResultWrapper::fail('未获取到指定订单信息' . $no, ErrorCode::$paramError);
  6141. }
  6142. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6143. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  6144. $this->objDOrderIndex->beginTransaction();
  6145. if (isset($params['deliveryType']) && $params['deliveryType'] == StatusCode::$deliveryType['logistics']){
  6146. $update = [
  6147. 'logisticsData' => json_encode($params['logisticsData']),
  6148. 'updateTime' => time(),
  6149. ];
  6150. }else{
  6151. $update = [
  6152. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  6153. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  6154. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  6155. 'updateTime' => time(),
  6156. ];
  6157. $updateIndex = $this->objDOrderIndex->update($update, ['id' => $orderIndex['id']]);
  6158. if ($updateIndex === false) {
  6159. $this->objDOrderIndex->rollBack();
  6160. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6161. }
  6162. }
  6163. $updateOrder = $this->objDOrder->update($update, ['id' => $orderIndex['id']]);
  6164. if ($updateOrder === false) {
  6165. $this->objDOrderIndex->rollBack();
  6166. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6167. }
  6168. //记录司机id
  6169. $driverId = isset($params['logisticsData']['id']) ? $params['logisticsData']['id'] : '';
  6170. $updatedriverId = $this->objDOrder->update(['driverId'=>$driverId],['id' => $orderIndex['id']]);
  6171. if ($updatedriverId === false) {
  6172. $this->objDOrderIndex->rollBack();
  6173. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6174. }
  6175. /*
  6176. $_id = self::createEsDocumentId($orderIndex['id']);
  6177. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  6178. $this->objDOrderIndex->commit();
  6179. return ResultWrapper::success(true);
  6180. }
  6181. /**
  6182. * Doc: (des="")
  6183. * User: XMing
  6184. * Date: 2020/9/8
  6185. * Time: 8:47 下午
  6186. * @param array $list
  6187. * @param string $type
  6188. * @return array
  6189. */
  6190. private function formatExpressList(array $list, string $type)
  6191. {
  6192. $map = [];
  6193. switch ($type) {
  6194. case 'express_hundred':
  6195. foreach ($list as $value) {
  6196. $map[] = [
  6197. 'context' => $value['context'],
  6198. 'time' => $value['time']
  6199. ];
  6200. }
  6201. break;
  6202. case 'express_bird':
  6203. foreach ($list as $value) {
  6204. $map[] = [
  6205. 'context' => $value['AcceptStation'],
  6206. 'time' => $value['AcceptTime']
  6207. ];
  6208. }
  6209. $map = array_reverse($map);
  6210. break;
  6211. }
  6212. return $map;
  6213. }
  6214. /**
  6215. * Doc: (des="")
  6216. * User: XMing
  6217. * Date: 2020/10/12
  6218. * Time: 5:31 下午
  6219. * @param array $params
  6220. * @return ResultWrapper
  6221. * @throws \Exception
  6222. */
  6223. public function create(array $params)
  6224. {
  6225. $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
  6226. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  6227. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  6228. $objMCart = new MCart($this->onlineUserId, $this->onlineEnterpriseId);
  6229. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  6230. $objDStaff = new DStaff();
  6231. $objStockCache = new Stock($this->onlineEnterpriseId);
  6232. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  6233. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  6234. $goodsCommonData = $params['goodsData'];
  6235. //锁定库存 查询商铺对应的仓库
  6236. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  6237. $modelResult = $objMShop->getShopDataByShopIds(array_column($goodsCommonData['goodsData'], 'shopId'));
  6238. if (!$modelResult->isSuccess()) {
  6239. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  6240. }
  6241. $shopData = $modelResult->getData();
  6242. if (empty($shopData)) {
  6243. return ResultWrapper::fail('获取店铺数据失败', ErrorCode::$paramError);
  6244. }
  6245. $paramsResult = self::getIdsCashierMap($params);
  6246. if (!$paramsResult->isSuccess()) {
  6247. return ResultWrapper::fail($paramsResult->getData(), $paramsResult->getErrorCode());
  6248. }
  6249. $params = $paramsResult->getData();
  6250. //获取客户信息
  6251. $customerOwe = 0;
  6252. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  6253. $customerData = [
  6254. 'id' => StatusCode::$noneCustomer,
  6255. 'name' => '匿名客户'
  6256. ];
  6257. } else {
  6258. $customerDataResult = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  6259. if (!$customerDataResult->isSuccess()) {
  6260. return ResultWrapper::fail($customerDataResult->getData(), $customerDataResult->getErrorCode());
  6261. }
  6262. $customerData = $customerDataResult->getData();
  6263. //获取客户当前欠款
  6264. if (isset($customerData['id'])) {
  6265. $customerOwe = $objMCustomerBalance->getCustomerBalance($customerData['id']);
  6266. }
  6267. //获取客户手机号
  6268. $objDUserCenter = new DUserCenter();
  6269. $userInfo = $objDUserCenter->get(['id' => $this->onlineUserId], 'mobile');
  6270. if ($userInfo === false) {
  6271. return ResultWrapper::fail($objDUserCenter->error(), ErrorCode::$dberror);
  6272. }
  6273. $params['customerMobile'] = isset($userInfo['mobile']) ? $userInfo['mobile'] : '';
  6274. }
  6275. // 生成一个临时三方流水号,用来支持多个子订单作为一个订单支付,支付成功之后更新为对应的实际外部支付流水号
  6276. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['cashierOrder'], $this->onlineUserId);
  6277. $lockInventoryData = [];//锁定库存物料
  6278. $goodsSaleData = [];//销售数据
  6279. $allSn = [];//所有单号
  6280. $allOrderIds = [];//所有订单
  6281. $mapDetails = [];//订单商品
  6282. $createTime = time();
  6283. $allCartIds = [];
  6284. $shopName = '';
  6285. $shopId = 0;//目前只有一个
  6286. $this->objDOrder->beginTransaction();
  6287. foreach ($goodsCommonData['goodsData'] as $key => $val) {
  6288. $sn = createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  6289. //将数据写入索引表
  6290. $shopId = $val['shopId'];
  6291. $orderIndexData = [
  6292. 'shopId' => $val['shopId'],
  6293. 'userCenterId' => $params['userCenterId'],
  6294. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  6295. 'createTime' => time(),
  6296. 'updateTime' => time(),
  6297. 'deleteStatus' => StatusCode::$standard,
  6298. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6299. 'payStatus' => StatusCode::$delete,
  6300. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  6301. 'outStatus' => StatusCode::$delete,
  6302. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  6303. 'deliveryType' => $params['deliveryType'],
  6304. 'payType' => $params['payType'],
  6305. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  6306. 'no' => $sn,
  6307. 'orderType' => StatusCode::$orderType['cashierOrder'],
  6308. 'selfRuleId' => 0,
  6309. 'cashierUid' => $this->loginUserCenterId,
  6310. 'guideUids' => isset($params['guideUids']) ? $params['guideUids'] : '',
  6311. ];
  6312. //1. 先写索引表
  6313. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  6314. $orderId = $this->objDOrderIndex->insert($orderIndexData);
  6315. if ($orderId === false) {
  6316. $this->objDOrder->rollBack();
  6317. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  6318. }
  6319. //3。上门自提订单,生成核销码
  6320. $verifyCode = self::createVerifyCode($orderId);
  6321. //兼容以前代码
  6322. $updateRes = $this->objDOrderIndex->update(['verifyCode' => $verifyCode], ['id' => $orderId]);
  6323. if ($updateRes === false) {
  6324. $this->objDOrder->rollBack();
  6325. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  6326. }
  6327. //订单数据
  6328. $shopName = $val['shopName'];//现在就一个店铺
  6329. $masterOrder = [
  6330. 'id' => $orderId,//订单id
  6331. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  6332. 'userCenterId' => $params['userCenterId'],
  6333. 'shopId' => $val['shopId'],
  6334. 'shopName' => $val['shopName'],
  6335. 'no' => $sn,
  6336. 'outerTradeNo' => $tmpOuterTradeNo,
  6337. 'totalMoney' => $goodsCommonData['totalMoney'],
  6338. 'payAmount' => $goodsCommonData['payMoney'],
  6339. 'customerName' => isset($customerData['name']) ? $customerData['name'] : '',
  6340. 'remark' => $params['remark'],
  6341. 'deliveryType' => $params['deliveryType'],//配送方式
  6342. 'payType' => $params['payType'],//支付方式
  6343. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  6344. 'salesManName' => isset($customerData['salesManName']) ? $customerData['salesManName'] : '',
  6345. 'customerType' => isset($customerData['type']) ? $customerData['type'] : 0,
  6346. 'buyTotal' => array_sum(array_column($val['shopGoodsData'], 'buyNum')),
  6347. 'source' => $params['source'],//来源
  6348. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  6349. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  6350. 'outStatus' => StatusCode::$delete,
  6351. 'createTime' => time(),
  6352. 'updateTime' => time(),
  6353. 'customerOwe' => $customerOwe,//客户当前欠款
  6354. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6355. 'preferential' => $goodsCommonData['preferential'],//优惠券优惠金额
  6356. 'vipDiscount' => isset($goodsCommonData['vipDiscount']) ? $goodsCommonData['vipDiscount'] : 0,//会员卡优惠金额
  6357. 'vipDoubleDiscount' => isset($goodsCommonData['vipDoubleDiscount']) ? $goodsCommonData['vipDoubleDiscount'] : 0,//会员卡折上折优惠金额
  6358. 'originPayAmount' => $goodsCommonData['payMoney'],//原支付金额,
  6359. 'orderType' => StatusCode::$orderType['cashierOrder'],
  6360. 'verifyCode' => $verifyCode,
  6361. 'expressMoney' => isset($goodsCommonData['expressMoney']) ? $goodsCommonData['expressMoney'] : 0,
  6362. 'cashierUid' => $this->loginUserCenterId,
  6363. 'guideUids' => isset($params['guideUids']) ? $params['guideUids'] : '',
  6364. 'cashierName' => $params['cashierName'],
  6365. 'guideName' => $params['guideName'],
  6366. 'remMoney' => isset($goodsCommonData['rem_money']) ? $goodsCommonData['rem_money'] : 0,
  6367. 'changeSubMoney' => isset($goodsCommonData['subPrice']) ? $goodsCommonData['subPrice'] : 0,
  6368. 'isNoneUser' => $this->onlineUserId == StatusCode::$noneUserCenter ? StatusCode::$standard : StatusCode::$delete,
  6369. 'customerMobile' => $params['customerMobile'],
  6370. 'serialNum' => $objStockCache->createSerialSn(0,'Order'),
  6371. 'operatorName' => isset($params['operatorName']) ? $params['operatorName'] : '',
  6372. 'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : 0,
  6373. ];
  6374. $allOrderIds[] = $orderId;
  6375. //2。订单表
  6376. $orderId = $this->objDOrder->insert($masterOrder);
  6377. if ($orderId === false) {
  6378. $this->objDOrder->rollBack();
  6379. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6380. }
  6381. $masterOrder['goodsName'] = '';
  6382. foreach ($val['shopGoodsData'] as $k => &$v) {
  6383. $addOrderGoods = [
  6384. 'no' => $sn,
  6385. 'orderId' => $orderId,
  6386. 'goodsId' => $v['goodsId'],
  6387. 'goodsName' => $v['goodsName'],
  6388. 'shopId' => $val['shopId'],//商铺id
  6389. 'shopName' => $val['shopName'],//商铺名称
  6390. 'originPrice' => $v['originPrice'],
  6391. 'price' => $v['price'],
  6392. 'buyNum' => $v['buyNum'],
  6393. 'totalMoney' => $v['totalMoney'],
  6394. 'skuId' => $v['skuId'],
  6395. 'goodsBasicId' => $v['goodsBasicId'],
  6396. 'goodsCode' => $v['goodsCode'],
  6397. 'deliverNum' => $v['buyNum'],//发货数量=购买数量
  6398. 'unitName' => $v['unitName'],//单位名称
  6399. 'conversion' => $v['conversion'],//换算比率
  6400. 'preferential' => $v['preferential'],//优惠券优惠金额
  6401. 'vipDiscount' => $v['vipDiscount'],//会员卡优惠金额
  6402. 'categoryPath' => isset($v['categoryPath']) ? $v['categoryPath'] : '',//分类路径
  6403. 'brandId' => isset($v['brandId']) ? $v['brandId'] : 0,//品牌id
  6404. 'specGroup' => isset($v['specGroup']) && !empty($v['specGroup']) ? json_encode($v['specGroup']) : NULL,
  6405. 'goodsImages' => isset($v['goodsImages']) && is_string($v['goodsImages']) ? $v['goodsImages'] : '',
  6406. 'barCode' => isset($v['barCode']) ? $v['barCode'] : '',
  6407. 'storageCode' => isset($v['storageCode']) ? $v['storageCode'] : '',
  6408. 'categoryName' => isset($v['categoryName']) ? $v['categoryName'] : '',
  6409. 'brandName' => isset($v['brandName']) ? $v['brandName'] : '',
  6410. 'expressMoney' => isset($v['expressMoney']) ? $v['expressMoney'] : 0,
  6411. ];
  6412. $lockInventoryData[] = [
  6413. 'warehouseId' => $shopData[$v['shopId']]['warehouseId'],
  6414. 'materielId' => $v['goodsBasicId'],
  6415. 'materielCode' => $v['goodsCode'],
  6416. 'lockingNum' => $v['buyNum'],
  6417. 'originId' => $orderId,
  6418. 'originNo' => $sn,
  6419. 'source' => StatusCode::$orderType['saleOrder'],
  6420. 'sourceNo' => $sn,
  6421. 'operatorId' => $masterOrder['customerId'],
  6422. 'operatorName' => $masterOrder['customerName'],
  6423. 'skuId' => $v['skuId'],
  6424. ];
  6425. $goodsSaleData [] = [
  6426. 'goodsId' => $addOrderGoods['goodsId'],
  6427. 'skuId' => $addOrderGoods['skuId'],
  6428. 'buyNum' => $addOrderGoods['buyNum'],
  6429. ];
  6430. //活动商品数据
  6431. if ($this->isFront) {
  6432. if (isset($v['activityId']) && $v['activityId'] != 0) {
  6433. $activityData[] = [
  6434. 'goodsId' => $v['goodsId'],
  6435. 'skuId' => $v['skuId'],
  6436. 'activityId' => $v['activityId'],
  6437. 'buyNum' => $v['buyNum']
  6438. ];
  6439. }
  6440. }
  6441. $masterOrder['goodsName'] .= $v['goodsName'] . ' ';
  6442. $result = $objMOrderGoods->addOrderGoods($addOrderGoods);
  6443. if (!$result->isSuccess()) {
  6444. $this->objDOrder->rollBack();
  6445. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6446. }
  6447. $allCartIds[] = $v['cartId'];
  6448. }
  6449. //存入ES
  6450. $masterOrder['verifyCode'] = isset($verifyCode) ? $verifyCode : '';
  6451. self::updateEsData($orderId, $masterOrder, [], $masterOrder['goodsName']);
  6452. $allSn[] = $sn;//所有订单号
  6453. }
  6454. //将优惠券改为已使用
  6455. if (isset($goodsCommonData['useCoupon']) && !empty($goodsCommonData['useCoupon'])) {
  6456. $result = $objMUserCoupon->updateIsUse(['id' => $goodsCommonData['useCoupon']['id']], ['isUse' => StatusCode::$delete, 'useTime' => time()]);
  6457. if (!$result->isSuccess()) {
  6458. $this->objDOrder->rollBack();
  6459. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6460. }
  6461. }
  6462. //锁定库存商品数量
  6463. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  6464. $lockInventoryResult = $objMInventory->updateLockInventory($lockInventoryData);
  6465. if (!$lockInventoryResult->isSuccess()) {
  6466. $this->objDOrder->rollBack();
  6467. return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  6468. }
  6469. //增加销量
  6470. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  6471. if (!empty($goodsSaleData)) {
  6472. foreach ($goodsSaleData as $value) {
  6473. $res = $objMGoods->updateSalesNum($value['goodsId'], $value['skuId'], $value['buyNum']);
  6474. if ($res === false) {
  6475. Logger::logs(E_USER_ERROR, '错误', __CLASS__, __LINE__, '商品增加销量失败');
  6476. }
  6477. }
  6478. }
  6479. //file_put_contents('/www/wwwroot/logs/api.junhailan.com/MSaleOrder_error.log', date('Y-m-d H:i:s') . '数据:' . var_export($mapDetails, true) . PHP_EOL, FILE_APPEND);
  6480. $this->objSaleOrder->setGoodsDetails($mapDetails);
  6481. //统计订单信息
  6482. self::noticeStatistics([
  6483. 'userCenterId' => $params['userCenterId'],
  6484. 'enterpriseId' => $this->onlineEnterpriseId,
  6485. 'customerId' => $params['customerId'],
  6486. 'no' => $allSn,
  6487. 'noticeType' => 'create',
  6488. ], 'MOrderStatistics');
  6489. //写日志
  6490. foreach ($allSn as $sn) {
  6491. parent::saveLog([
  6492. 'no' => $sn,
  6493. 'actionType' => '创建订单',//创建订单
  6494. 'operationData' => '',
  6495. 'userCenterId' => $params['userCenterId'],
  6496. 'enterpriseId' => $this->onlineEnterpriseId,
  6497. 'createTime' => time(),
  6498. ]);
  6499. }
  6500. $this->objDOrder->commit();
  6501. return ResultWrapper::success(['orderId' => $orderId, 'shopName' => $shopName, 'out_trade_no' => $tmpOuterTradeNo, 'total_fee' => $goodsCommonData['payMoney']]);
  6502. }
  6503. /**
  6504. * Doc: (des="订单确认收款")
  6505. * User: XMing
  6506. * Date: 2020/10/12
  6507. * Time: 4:11 下午
  6508. * @param array $params
  6509. * @return ResultWrapper
  6510. * @throws \Exception
  6511. */
  6512. public function confirm(array $params)
  6513. {
  6514. $orderIndex = $this->objDOrderIndex->get(['id' => $params['orderId']]);
  6515. if ($orderIndex === false) {
  6516. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6517. }
  6518. if (empty($orderIndex)) {
  6519. return ResultWrapper::fail('获取订单信息失败', ErrorCode::$paramError);
  6520. }
  6521. if ($orderIndex['payStatus'] != StatusCode::$delete) {
  6522. return ResultWrapper::fail('订单已付款', ErrorCode::$paramError);
  6523. }
  6524. $fix = $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);;
  6525. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  6526. $orderData = $this->objDOrder->get(['id' => $params['orderId']]);
  6527. if ($orderData === false) {
  6528. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6529. }
  6530. if (empty($orderData)) {
  6531. return ResultWrapper::fail('获取订单信息失败', ErrorCode::$paramError);
  6532. }
  6533. $paramsResult = self::getIdsCashierMap($params);
  6534. if (!$paramsResult->isSuccess()) {
  6535. return ResultWrapper::fail($paramsResult->getData(), $paramsResult->getErrorCode());
  6536. }
  6537. $params = $paramsResult->getData();
  6538. $this->objDOrderIndex->beginTransaction();
  6539. //修稿订单信息
  6540. $update = [
  6541. 'payType' => $params['payType'],
  6542. 'updateTime' => time(),
  6543. 'cashierUid' => $this->loginUserCenterId,
  6544. 'guideUids' => $params['guideUids'],
  6545. ];
  6546. $updateIndex = $this->objDOrderIndex->update($update, ['id' => $params['orderId']]);
  6547. if ($updateIndex === false) {
  6548. $this->objDOrderIndex->rollBack();
  6549. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6550. }
  6551. $update['guideName'] = $params['guideName'];
  6552. $updateOrder = $this->objDOrder->update($update, ['id' => $params['orderId']]);
  6553. if ($updateOrder === false) {
  6554. $this->objDOrderIndex->rollBack();
  6555. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6556. }
  6557. /*
  6558. //更新es
  6559. $_id = self::createEsDocumentId($params['orderId']);
  6560. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  6561. //清空此收银员的购物车
  6562. $objMCashierCart = new MCashierCart($this->onlineUserId, $this->onlineEnterpriseId, $this->loginUserCenterId);
  6563. $result = $objMCashierCart->clearCart();
  6564. if (!$result->isSuccess()) {
  6565. $this->objDOrderIndex->rollBack();
  6566. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6567. }
  6568. //自动审核订单
  6569. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  6570. $auditResult = self::updateAuditStatus([
  6571. 'id' => $params['orderId'],
  6572. 'audit' => '自动审核',
  6573. 'auditId' => $this->onlineUserId,
  6574. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  6575. ]);
  6576. if (!$auditResult->isSuccess()) {
  6577. $this->objDOrderIndex->rollBack();
  6578. return ResultWrapper::fail($auditResult->getData(), $auditResult->getErrorCode());
  6579. }
  6580. $outId = $auditResult->getData();//出库单id
  6581. //自动出库
  6582. $dbResult = $objMInventoryOut->updateInventoryOutStatus(['id' => $outId, 'auditId' => $this->loginUserCenterId, 'auditName' => '销售自动审核']);
  6583. if (!$dbResult->isSuccess()) {
  6584. $this->objDOrderIndex->rollBack();
  6585. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6586. }
  6587. //确认收款
  6588. $dbResult = self::updateOrderPayData(['payStatus' => StatusCode::$standard, 'payTime' => time()], ['id' => [$params['orderId']]]);
  6589. if (!$dbResult->isSuccess()) {
  6590. $this->objDOrderIndex->rollBack();
  6591. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6592. }
  6593. //确认收货
  6594. $dbResult = self::updateOrderStatus($params['orderId'], ['orderStatus' => StatusCode::$orderStatus['finish']], []);
  6595. if (!$dbResult->isSuccess()) {
  6596. $this->objDOrder->rollBack();
  6597. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6598. }
  6599. $objMCashier = new MCashier($this->onlineUserId, $this->onlineEnterpriseId);
  6600. $cashierResult = $objMCashier->calculatePushMoney($params['orderId']);
  6601. if (!$cashierResult->isSuccess()) {
  6602. Logger::logs(E_USER_ERROR, '订单提成计算失败', __CLASS__, __LINE__, $cashierResult->getData());
  6603. }
  6604. //创建收款单
  6605. $received = [
  6606. 'currentAccountName' => $params['currentAccountName'],
  6607. 'financeType' => '销售收款',
  6608. 'financeTypeId' => 2,
  6609. 'shopId' => $orderData['shopId'],
  6610. 'shopName' => $orderData['shopName'],
  6611. 'receiptTime' => time(),
  6612. 'operatorId' => $this->loginUserCenterId,
  6613. 'accountList' => $params['accountList'],
  6614. 'customerId' => $orderData['customerId'],
  6615. 'customerName' => $orderData['customerName'],
  6616. 'sourceNo' => $orderData['no'],
  6617. 'sourceNoMoney' => $orderData['payAmount'],
  6618. 'createTime' => time(),
  6619. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6620. 'updateTime' => time(),
  6621. ];
  6622. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->loginUserCenterId);
  6623. $receivedResult = $objMReceived->addReceived($received, true);
  6624. if (!$receivedResult->isSuccess()) {
  6625. $this->objDOrderIndex->rollBack();
  6626. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  6627. }
  6628. $this->objDOrderIndex->commit();
  6629. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  6630. $objDCashierCustomerPrice = new DCashierCustomerPrice();
  6631. $objDCashierCustomerPrice->setTable('qianniao_cashier_customer_price_' . $this->onlineEnterpriseId);
  6632. $objDCashierCustomerPrice->delete(['cashierUid' => $this->loginUserCenterId, 'customerUid' => StatusCode::$noneUserCenter]);
  6633. }
  6634. return ResultWrapper::success(true);
  6635. }
  6636. /**
  6637. * Doc: (des="获取收银员工信息")
  6638. * User: XMing
  6639. * Date: 2020/10/12
  6640. * Time: 5:50 下午
  6641. * @param array $params
  6642. * @return ResultWrapper
  6643. * @throws \Exception
  6644. */
  6645. private function getIdsCashierMap(array $params)
  6646. {
  6647. $objDStaff = new DStaff();
  6648. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  6649. //获取收银员信息
  6650. $allUids = [$this->loginUserCenterId];
  6651. if (isset($params['guideUids']) && !empty($params['guideUids'])) {
  6652. $ids = explode(',', $params['guideUids']);
  6653. $allUids = array_merge($allUids, $ids);
  6654. }
  6655. $userMap = [];
  6656. if (!empty($allUids)) {
  6657. $staffList = $objDStaff->select(['userCenterId' => $allUids], 'userCenterId,staffName');
  6658. if ($staffList === false) {
  6659. return ResultWrapper::fail($objDStaff->error(), ErrorCode::$dberror);
  6660. }
  6661. foreach ($staffList as $value) {
  6662. $userMap[$value['userCenterId']] = $value['staffName'];
  6663. }
  6664. }
  6665. $params['cashierName'] = isset($userMap[$this->loginUserCenterId]) ? $userMap[$this->loginUserCenterId] : '超级管理员';
  6666. $nameStr = '';
  6667. if (!empty($ids)) {
  6668. foreach ($ids as $uid) {
  6669. if (!empty($nameStr)) {
  6670. $nameStr .= ',';
  6671. }
  6672. $nameStr .= isset($userMap[$uid]) ? $userMap[$uid] : '';
  6673. }
  6674. }
  6675. $params['guideName'] = $nameStr;
  6676. $params['customerMobile'] = '';
  6677. return ResultWrapper::success($params);
  6678. }
  6679. public function fix_ex()
  6680. {
  6681. $_id = self::createEsDocumentId(144);
  6682. $this->objDOrder->esupdateTypeFieldVaule(['salesManId' => 1, 'salesManName' => '杨明霞', 'updateTime' => time()], $_id);
  6683. }
  6684. /**
  6685. * 查询索引表信息
  6686. */
  6687. public function getOrderIndexData($where)
  6688. {
  6689. $dbResult = $this->objDOrderIndex->get($where);
  6690. if ($dbResult === false) {
  6691. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6692. }
  6693. return ResultWrapper::success($dbResult);
  6694. }
  6695. /**
  6696. * Doc: (des="根据订单id获取订单信息")
  6697. * User: XMing
  6698. * Date: 2020/12/7
  6699. * Time: 4:05 下午
  6700. * @param int $id
  6701. * @return ResultWrapper
  6702. * @throws \Exception
  6703. */
  6704. public function getOrderByOrderId(int $id): ResultWrapper
  6705. {
  6706. $orderIndex = $this->objDOrderIndex->get($id);
  6707. if ($orderIndex === false){
  6708. return ResultWrapper::fail($this->objDOrderIndex->error,ErrorCode::$dberror);
  6709. }
  6710. if (empty($orderIndex)){
  6711. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6712. }
  6713. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6714. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6715. $order = $this->objDOrder->get($id);
  6716. if ($order === false){
  6717. return ResultWrapper::fail($this->objDOrder->error,ErrorCode::$paramError);
  6718. }
  6719. if (empty($order)){
  6720. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6721. }
  6722. return ResultWrapper::success($order);
  6723. }
  6724. /**
  6725. * Doc: (des="")
  6726. * User: XMing
  6727. * Date: 2020/12/8
  6728. * Time: 10:43 上午
  6729. * @param int $id
  6730. * @return ResultWrapper
  6731. * @throws \Exception
  6732. */
  6733. public function updateSettel(int $id): ResultWrapper
  6734. {
  6735. $orderIndex = $this->objDOrderIndex->get($id);
  6736. if ($orderIndex === false){
  6737. return ResultWrapper::fail($this->objDOrderIndex->error,ErrorCode::$dberror);
  6738. }
  6739. if (empty($orderIndex)){
  6740. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6741. }
  6742. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6743. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6744. $order = $this->objDOrder->update(['isSettel' => StatusCode::$standard],$id);
  6745. if ($order === false){
  6746. return ResultWrapper::fail($this->objDOrder->error,ErrorCode::$paramError);
  6747. }
  6748. return ResultWrapper::success(true);
  6749. }
  6750. /**
  6751. * Doc: (des="")
  6752. * User: XMing
  6753. * Date: 2021/2/4
  6754. * Time: 12:06 下午
  6755. * @param array $selectParams
  6756. * @return ResultWrapper
  6757. */
  6758. public function getStatistics(array $selectParams):ResultWrapper
  6759. {
  6760. //默认今日的
  6761. $todayStart = strtotime(date('Y-m-d 00:00:00', time()));
  6762. $todayEnd = strtotime(date('Y-m-d 23:59:59', time()));
  6763. if (isset($selectParams['start']) && !empty($selectParams['start'])){
  6764. $todayStart = $selectParams['start'];
  6765. }
  6766. if (isset($selectParams['end']) && !empty($selectParams['end'])){
  6767. $todayEnd = $selectParams['end'];
  6768. }
  6769. $sql = "SELECT SUM(order_view.returnTotalPrice) as returnTotalPrice,order_view.goodsId,order_view.outCostPrice,SUM(order_view.totalMoney) as totalMoney,order_view.specGroup,order_view.unitName,order_view.skuId,order_view.title,SUM(order_view.num) as rnum,SUM(order_view.o_num) as onum ,SUM(order_view.otherNum) AS otherNum, order_view.goodsBasicId FROM
  6770. (
  6771. SELECT g.goodsId,g.specGroup,g.unitName,g.goodsName as title,g.skuId,@c:=0 as num,@a:=1 as isOrder,g.buyNum as o_num,g.totalMoney,(g.outCostPrice * g.buyNum) as outCostPrice,@d:=0 as returnTotalPrice ,JSON_EXTRACT(g.extends,'$.u_1_buy') AS otherNum,g.goodsBasicId AS goodsBasicId FROM qianniao_order_".$this->onlineEnterpriseId.'_1 as o
  6772. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  6773. WHERE o.outStatus in(5,6) AND g.deleteStatus = 5 AND o.createTime BETWEEN '.$todayStart.' AND '.$todayEnd.'
  6774. UNION ALL
  6775. SELECT d.goodsId,d.skuName as specGroup,d.unitName,d.goodsName as title,d.skuId,d.num as num,@a:=2 as isOrder,@b:=0 as o_num,@c:= 0 as totalMoney,@d:= 0 as outCostPrice,d.returnTotalPrice, @g:= 0 as otherNum ,@g:= 0 as goodsBasicId FROM qianniao_order_return_'.$this->onlineEnterpriseId.' as r
  6776. LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' as d ON d.linkId=r.id
  6777. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.'
  6778. )
  6779. AS order_view GROUP BY skuId';
  6780. $countSql = 'SELECT order_view.id as id FROM
  6781. (
  6782. SELECT o.id,g.skuId FROM qianniao_order_'.$this->onlineEnterpriseId.'_1 as o
  6783. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  6784. WHERE o.outStatus in(5,6) AND g.deleteStatus = 5 AND o.createTime BETWEEN '.$todayStart.' AND '.$todayEnd.'
  6785. UNION ALL
  6786. SELECT r.id,d.skuId FROM qianniao_order_return_'.$this->onlineEnterpriseId.' as r
  6787. LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' as d ON d.linkId=r.id
  6788. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.'
  6789. ) AS order_view GROUP BY skuId';
  6790. $sql .= ' LIMIT '.$selectParams['offset'].','.$selectParams['limit'];
  6791. $lists = $this->objDOrderIndex->query($sql);
  6792. if ($lists === false){
  6793. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6794. }
  6795. $goodsBasicDate = [];
  6796. //获取商品资料
  6797. $goodsBasicIds = array_column($lists,'goodsBasicId');
  6798. $objGoodsDate = new MGoodsBasic($this->onlineUserId,$this->onlineEnterpriseId);
  6799. $result = $objGoodsDate->getBasicGoodsFieldByIds($goodsBasicIds);
  6800. if ( !$result->isSuccess() ){
  6801. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  6802. }
  6803. $goodsBasicDate = $result->getData();
  6804. $skuIds = [];
  6805. foreach ($lists as &$list){
  6806. $list['isEq'] = isset($goodsBasicDate[$list['goodsBasicId']]['isEq']) ? $goodsBasicDate[$list['goodsBasicId']]['isEq'] : 4;
  6807. $list['specGroup'] = json_decode($list['specGroup'],true);
  6808. if (is_array($list['specGroup'])){
  6809. $arr = array_column($list['specGroup'],'specValueName');
  6810. $str = implode('_',$arr);
  6811. $list['specGroup'] = $str;
  6812. }
  6813. $list['subProMoney'] = floatval(bcsub($list['totalMoney'],$list['outCostPrice'],2));//毛利
  6814. $skuIds[] = $list['skuId'];
  6815. }
  6816. unset($list);
  6817. $thisRetMap = [];//本期
  6818. $lastRetMap = [];//上期
  6819. if (!empty($skuIds)){
  6820. $str = implode(',',$skuIds);
  6821. //本期退货数量
  6822. $fields = ' SUM(d.num) as thisRetNum,d.skuId as skuId,SUM(d.returnTotalPrice) as thisReturnTotalPrice ';
  6823. $sql = 'SELECT '.$fields.' FROM qianniao_order_' . $this->onlineEnterpriseId . '_1 AS o
  6824. LEFT JOIN qianniao_order_return_'.$this->onlineEnterpriseId.' AS r
  6825. ON r.originId = o.id LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' AS d
  6826. ON d.linkId = r.id
  6827. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND
  6828. o.createTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6829. r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6830. d.skuId IN('.$str.') GROUP BY d.skuId';
  6831. $retLists = $this->objDOrderIndex->query($sql);
  6832. if ($retLists === false){
  6833. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6834. }
  6835. unset($sql);
  6836. //上期退货
  6837. $fields = ' SUM(d.num) as lastRetNum,d.skuId as skuId,SUM(d.returnTotalPrice) as lastReturnTotalPrice ';
  6838. $sql = 'SELECT '.$fields.' FROM qianniao_order_' . $this->onlineEnterpriseId . '_1 AS o
  6839. LEFT JOIN qianniao_order_return_'.$this->onlineEnterpriseId.' AS r
  6840. ON r.originId = o.id LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' AS d
  6841. ON d.linkId = r.id
  6842. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND
  6843. o.createTime < '.$todayStart.' AND
  6844. r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6845. d.skuId IN('.$str.') GROUP BY d.skuId';
  6846. $lastRetLists = $this->objDOrderIndex->query($sql);
  6847. if ($lastRetLists === false){
  6848. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6849. }
  6850. unset($sql);
  6851. foreach ($retLists as $val){
  6852. $thisRetMap[$val['skuId']] = [
  6853. 'thisRetNum' => $val['thisRetNum'],
  6854. 'thisReturnTotalPrice' => $val['thisReturnTotalPrice'],
  6855. ];
  6856. }
  6857. foreach ($lastRetLists as $val){
  6858. $lastRetMap[$val['skuId']] = [
  6859. 'lastRetNum' => $val['lastRetNum'],
  6860. 'lastReturnTotalPrice' => $val['lastReturnTotalPrice']
  6861. ];
  6862. }
  6863. }
  6864. foreach ($lists as &$item){
  6865. if (!isset($thisRetMap[$item['skuId']])){
  6866. $item['thisRetNum'] = 0;
  6867. $item['thisReturnTotalPrice'] = 0;
  6868. }else{
  6869. $item['thisRetNum'] = floatval($thisRetMap[$item['skuId']]['thisRetNum']);
  6870. $item['thisReturnTotalPrice'] = floatval($thisRetMap[$item['skuId']]['thisReturnTotalPrice']);
  6871. }
  6872. if (!isset($lastRetMap[$item['skuId']])){
  6873. $item['lastRetNum'] = 0;
  6874. $item['lastReturnTotalPrice'] = 0;
  6875. }else{
  6876. $item['lastRetNum'] = floatval($lastRetMap[$item['skuId']]['lastRetNum']);
  6877. $item['lastReturnTotalPrice'] = floatval($lastRetMap[$item['skuId']]['lastReturnTotalPrice']);
  6878. }
  6879. $item['retNum'] = bcadd($item['thisRetNum'],$item['lastRetNum'],2);
  6880. $item['returnTotalPrice'] = bcadd($item['thisReturnTotalPrice'],$item['lastReturnTotalPrice'],2);
  6881. }
  6882. unset($item);
  6883. $count = $this->objDOrderIndex->query($countSql);
  6884. if ($count === false){
  6885. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6886. }
  6887. $data = [
  6888. 'total' => count($count),
  6889. 'data' => $lists
  6890. ];
  6891. return ResultWrapper::success($data);
  6892. }
  6893. /**
  6894. * Doc: (des="")
  6895. * User: XMing
  6896. * Date: 2021/3/10
  6897. * Time: 11:05 上午
  6898. * @param array $params
  6899. * @return ResultWrapper
  6900. * @throws \Exception
  6901. */
  6902. public function getGoodsListsByUserCenterId(array $params): ResultWrapper
  6903. {
  6904. $fix = 1;
  6905. if (isset($params['userCenterId']) && !empty($params['userCenterId'])){
  6906. $fix = ceil($params['userCenterId'] / $this->cutTable);
  6907. }
  6908. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6909. $fields = ' id,customerName,customerId ';
  6910. $where = '';
  6911. if (isset($params['startTime']) && !empty($params['startTime']) && isset($params['endTime']) && !empty($params['endTime'])){
  6912. $where .= ' AND `createTime` BETWEEN '.$params['startTime'].' AND '.$params['endTime'];
  6913. }
  6914. $sql = 'SELECT '.$fields.' FROM qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix.' WHERE deleteStatus = '.StatusCode::$standard.$where;
  6915. if (isset($params['userCenterId']) && !empty($params['userCenterId'])){
  6916. $sql .= ' AND userCenterId = '.$params['userCenterId'];
  6917. }
  6918. $sql .= ' order by createTime desc';
  6919. $lists = $this->objDOrder->query($sql);
  6920. if ($lists === false){
  6921. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  6922. }
  6923. if (empty($lists)){
  6924. return ResultWrapper::success(['data' => [],'total' => 0]);
  6925. }
  6926. unset($sql);
  6927. unset($where);
  6928. unset($fields);
  6929. $orderIds = [];
  6930. $orderRelMap = [];
  6931. foreach ($lists as $item){
  6932. $orderIds[] = $item['id'];
  6933. $orderRelMap[$item['id']] = $item;
  6934. }
  6935. $fields = ' goodsBasicId,createTime,orderId,goodsName,goodsCode,goodsImages,unitName,specGroup,shopId,shopName,price,SUM(buyNum) AS buyNum,(price * SUM(buyNum)) AS totalMoney,categoryName,brandName,barCode,outNum ,SUM(JSON_EXTRACT(extends,"$.u_1_buy")) AS otherNum ';
  6936. $where = '';
  6937. if (!empty($orderIds)){
  6938. $str = trim(implode(',',$orderIds),',');
  6939. $where .= ' AND `orderId` IN ('.$str.')';
  6940. }
  6941. if (isset($params['categoryId']) && !empty($params['categoryId'])){
  6942. $categoryId = (int)$params['categoryId'];
  6943. $where .= ' AND FIND_IN_SET('.$categoryId.',`categoryPath`) ';
  6944. }
  6945. if (isset($params['brandId']) && !empty($params['brandId'])){
  6946. $brandId = (int)$params['brandId'];
  6947. $where .= ' AND `brandId` = '.$brandId;
  6948. }
  6949. if (isset($params['barCode']) && !empty($params['barCode'])){
  6950. $barCode = (string)$params['barCode'];
  6951. $where .= ' AND `barCode` = "'.$barCode.'"';
  6952. }
  6953. if (isset($params['shopId']) && !empty($params['shopId'])){
  6954. $shopId = (int)$params['shopId'];
  6955. $where .= ' AND `shopId` = '.$shopId;
  6956. }
  6957. if (isset($params['keyword']) && !empty($params['keyword'])){
  6958. $keyword = '"%'.$params['keyword'].'%"';
  6959. $where .= ' AND (`goodsName` LIKE '.$keyword.' OR `goodsCode` LIKE '.$keyword.') ';
  6960. }
  6961. $sql = 'SELECT '.$fields.' FROM qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix.'
  6962. WHERE `deleteStatus` = '.StatusCode::$standard.$where.'
  6963. GROUP BY skuId ORDER BY createTime DESC ';
  6964. $count = $this->objDOrderGoods->query($sql);
  6965. if ($count === false){
  6966. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6967. }
  6968. if (isset($params['limit']) && !empty($params['limit'])){
  6969. $sql .= ' LIMIT '.$params['offset'].','.$params['limit'];
  6970. }
  6971. $lists = $this->objDOrderGoods->query($sql);
  6972. if ($lists === false){
  6973. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6974. }
  6975. if (empty($lists)){
  6976. return ResultWrapper::success(['data'=>[],'total'=>0]);
  6977. }
  6978. if ($lists === false){
  6979. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6980. }
  6981. $goodsBasicDate = [];
  6982. //获取商品资料
  6983. $goodsBasicIds = array_column($lists,'goodsBasicId');
  6984. $objGoodsDate = new MGoodsBasic($this->onlineUserId,$this->onlineEnterpriseId);
  6985. $result = $objGoodsDate->getBasicGoodsFieldByIds($goodsBasicIds);
  6986. if ( !$result->isSuccess() ){
  6987. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  6988. }
  6989. $goodsBasicDate = $result->getData();
  6990. foreach ($lists as &$item){
  6991. if (isset($item['specGroup']) && !empty($item['specGroup'])){
  6992. $item['specGroup'] = json_decode($item['specGroup'],true);
  6993. }
  6994. $item['customerName'] = isset($orderRelMap[$item['orderId']]) ? $orderRelMap[$item['orderId']]['customerName'] : '';
  6995. $item['customerId'] = isset($orderRelMap[$item['orderId']]) ? $orderRelMap[$item['orderId']]['customerId'] : 0;
  6996. $item['isEq'] = isset($goodsBasicDate[$item['goodsBasicId']]['isEq']) ? $goodsBasicDate[$item['goodsBasicId']]['isEq'] : 4;
  6997. }
  6998. return ResultWrapper::success([
  6999. 'data' => $lists,
  7000. 'total' => (int)count($count)
  7001. ]);
  7002. }
  7003. /**
  7004. * Doc: (des="缺货单列表")
  7005. * User: XMing
  7006. * Date: 2021/3/11
  7007. * Time: 6:44 下午
  7008. * @param array $selectParams
  7009. * @return ResultWrapper
  7010. * @throws \Exception
  7011. */
  7012. public function getDistributionAll(array $selectParams): ResultWrapper
  7013. {
  7014. //{"page":1,"pageSize":10,"search":{},"state":"all"}
  7015. $selectParams['state'] = 'state';
  7016. $selectParams['outStatus'] = 6;
  7017. $orderListsResult = self::getAllOrder($selectParams,[]);
  7018. if (!$orderListsResult->isSuccess()){
  7019. return ResultWrapper::fail($orderListsResult->getData(),$orderListsResult->getErrorCode());
  7020. }
  7021. $total = $orderListsResult->getData()['total'];
  7022. $orderLists = $orderListsResult->getData()['data'];
  7023. if (empty($orderLists)){
  7024. return ResultWrapper::success(['data' => [],'total' => 0]);
  7025. }
  7026. $arrayLists = [];
  7027. $orderIds = [];
  7028. foreach ($orderLists as $item){
  7029. $infoResult = self::getOrderInfoById($item['id']);
  7030. if (!$infoResult->isSuccess()){
  7031. return ResultWrapper::fail($infoResult->getData(),$infoResult->getErrorCode());
  7032. }
  7033. $infoResult = $infoResult->getData();
  7034. $goodsData = $infoResult['goodsData'];
  7035. foreach ($goodsData as $key => $item){
  7036. if ($item['outOfNum'] == 0){
  7037. unset($goodsData[$key]);
  7038. continue;
  7039. }
  7040. $infoResult['goodsData'] = array_values($goodsData);
  7041. }
  7042. $arrayLists[] = $infoResult;
  7043. }
  7044. return ResultWrapper::success(['data' => $arrayLists,'total' => $total]);
  7045. }
  7046. /**
  7047. * Doc: (des="业务员销售排行")
  7048. * User: XMing
  7049. * Date: 2021/3/15
  7050. * Time: 10:09 上午
  7051. * @param array $params
  7052. * @param $export
  7053. * @return ResultWrapper
  7054. */
  7055. public function salesManRank(array $params,$export = 0): ResultWrapper
  7056. {
  7057. $sortFields = ['dealCustomerNum','orderNum','dealAmount','skuNum','buyNum'];
  7058. $sort = ['ASC','DESC'];
  7059. if (!in_array($params['sortField'],$sortFields)){
  7060. return ResultWrapper::fail('sortField字段异常',ErrorCode::$paramError);
  7061. }
  7062. if (!in_array($params['sort'],$sort)){
  7063. return ResultWrapper::fail('sort字段异常',ErrorCode::$paramError);
  7064. }
  7065. $where = '';
  7066. $fields = ' o.salesManName,o.salesManId,COUNT(DISTINCT o.id) as orderNum,COUNT(DISTINCT o.customerId) as dealCustomerNum,SUM(DISTINCT o.payAmount) as dealAmount,COUNT(DISTINCT g.skuId) as skuNum,SUM(g.buyNum) as buyNum ';
  7067. if (isset($params['startTime']) && !empty($params['startTime']) && isset($params['endTime']) && !empty($params['endTime'])){
  7068. $where .= ' AND o.createTime BETWEEN '.$params['startTime'].' AND '.$params['endTime'];
  7069. }
  7070. if ( !empty($params['orderStatus'])&& isset($params['orderStatus']) ){//删选
  7071. $orderStatus = implode(',',$params['orderStatus']);
  7072. $where .= ' AND o.orderStatus IN ('.$orderStatus.')';
  7073. }
  7074. $sql = 'SELECT '.$fields.' FROM qianniao_order_'.$this->onlineEnterpriseId.'_1 as o
  7075. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  7076. WHERE o.deleteStatus = 5
  7077. AND o.salesManId IS NOT NULL
  7078. AND o.salesManId != 0 '.$where;
  7079. $sql .= ' GROUP BY o.salesManName ';
  7080. if (isset($params['sortField']) && !empty($params['sortField']) && isset($params['sort']) && !empty($params['sort'])){
  7081. $sql .= ' ORDER BY '.$params['sortField'].' '.$params['sort'];
  7082. }
  7083. $count = $this->objDOrder->query($sql);
  7084. if ($count === false){
  7085. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7086. }
  7087. if (count((array)$count) == 0){
  7088. return ResultWrapper::success(['data' => [],'total' => 0]);
  7089. }
  7090. if($export){
  7091. $params['limit'] = null;
  7092. $params['offset'] = null;
  7093. }
  7094. if (isset($params['limit']) && !empty($params['limit'])){
  7095. $sql .= ' LIMIT '.$params['offset'].','.$params['limit'];
  7096. }
  7097. //导出
  7098. if($export){
  7099. $lists = $this->objDOrder->query($sql);
  7100. if ($lists === false){
  7101. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7102. }
  7103. self::exportsalesManRank($lists);
  7104. exit;
  7105. }else{
  7106. $lists = $this->objDOrder->query($sql);
  7107. if ($lists === false){
  7108. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7109. }
  7110. foreach ($lists as &$list){
  7111. $list['dealAmount'] = sprintf('%.2f', $list['dealAmount']);
  7112. }
  7113. }
  7114. return ResultWrapper::success(['data' => $lists,'total' => count($count)]);
  7115. }
  7116. /**
  7117. * Doc: (des="")
  7118. * User: XMing
  7119. * Date: 2021/3/17
  7120. * Time: 10:47 上午
  7121. * @param array $orderIds
  7122. * @param array $params
  7123. * @return ResultWrapper
  7124. * @throws \Exception
  7125. */
  7126. public function updateCostPriceBySku(array $orderIds,array $params): ResultWrapper
  7127. {
  7128. Logger::logs(E_USER_ERROR,'params',__CLASS__,__LINE__,$params);
  7129. Logger::logs(E_USER_ERROR,'orderIds',__CLASS__,__LINE__,$orderIds);
  7130. if (empty($orderIds)){
  7131. return ResultWrapper::success();
  7132. }
  7133. $lists = $this->objDOrderIndex->select($orderIds,'id,userCenterId');
  7134. if ($lists === false){
  7135. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  7136. }
  7137. $tables = [];
  7138. foreach ($lists as $list){
  7139. $fix = ceil($list['userCenterId'] / $this->cutTable);
  7140. $tables[$fix][] = $list['id'];
  7141. }
  7142. if (empty($tables)){
  7143. return ResultWrapper::success('没有更新的表');
  7144. }
  7145. $status = $this->objDOrderGoods->beginTransaction();
  7146. foreach ($params as $value){
  7147. $where = $value['where'];
  7148. $update = $value['update'];
  7149. foreach ($tables as $fix => $orderIds){
  7150. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  7151. Logger::logs(E_USER_ERROR,'update',__CLASS__,__LINE__,$update);
  7152. Logger::logs(E_USER_ERROR,'where',__CLASS__,__LINE__,$where);
  7153. $updateResult = $this->objDOrderGoods->update($update,$where);
  7154. if ($updateResult === false){
  7155. $this->objDOrderGoods->rollBack();
  7156. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  7157. }
  7158. }
  7159. }
  7160. $status && $this->objDOrderGoods->commit();
  7161. return ResultWrapper::success(true);
  7162. }
  7163. /*
  7164. * 设置物流信息
  7165. * */
  7166. public function addLogistics($params)
  7167. {
  7168. $logisticsData = $params['logisticsData'];
  7169. if(empty($logisticsData['id'])){
  7170. $objMDriver = new MDriver($this->onlineEnterpriseId, $this->onlineUserId);
  7171. $paramsDriver = [
  7172. 'enterpriseId'=> $this->onlineEnterpriseId,
  7173. 'driverName' => $logisticsData['name'],
  7174. 'phone' => $logisticsData['truckTel'],
  7175. 'plateNumber' => $logisticsData['truckName'],
  7176. 'remark' => $logisticsData['remark']
  7177. ];
  7178. $addDriver = $objMDriver->addDriver($paramsDriver);
  7179. if ( !$addDriver->isSuccess() ){
  7180. return ResultWrapper::fail($addDriver->getData(),$addDriver->getErrorCode());
  7181. }
  7182. $driverId = $addDriver->getData();
  7183. $params['logisticsData']['id']= $driverId;
  7184. }
  7185. //去掉订单id剩下的数据就是物流数据
  7186. $orderId = $params['orderId'];
  7187. unset($params['orderId']);
  7188. $orderNo = $params['no'];
  7189. unset($params['no']);
  7190. $updateLogistics = self::editOrderExpress($orderNo,$params,$orderId);
  7191. if (!$updateLogistics->isSuccess()){
  7192. $this->objDOrder->rollBack();
  7193. return ResultWrapper::fail($updateLogistics->getData(),$updateLogistics->getErrorCode());
  7194. }
  7195. return ResultWrapper::success($updateLogistics);
  7196. }
  7197. /**
  7198. * 业务员订单表导出方法
  7199. * @param $result
  7200. * @return void
  7201. * @throws Exception
  7202. */
  7203. public function exportsalesManRank($result)
  7204. {
  7205. //导出到本地
  7206. header("Content-type:application/vnd.ms-excel");
  7207. header("Content-Disposition:filename=业务员订单记录表.csv");
  7208. header('Cache-Control: max-age=0');
  7209. $fp = fopen('php://output', 'a');
  7210. $head = ['销售员','成交客户','sku数量','订单数','销售数量','成交金额']; //定义标题
  7211. foreach ($head as $i => $v) {
  7212. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  7213. }
  7214. fputcsv($fp, $head);
  7215. $limit = 10000;
  7216. $num = 0; //计数器
  7217. foreach ($result as $v) { //循环数据
  7218. $num++;
  7219. if ($num == $limit) {
  7220. ob_flush(); //释放内存
  7221. flush();
  7222. }
  7223. $rows['salesManName'] = isset($v['salesManName']) ? $v['salesManName'] : '';//销售员
  7224. $rows['dealCustomerNum'] = isset($v['dealCustomerNum']) ? $v['dealCustomerNum'] : '';//成交客户
  7225. $rows['skuNum'] = isset($v['skuNum']) ? $v['skuNum'] : '';//SKU数量
  7226. $rows['orderNum'] = isset($v['orderNum']) ? $v['orderNum'] : '';//订单数
  7227. $rows['buyNum'] = isset($v['buyNum']) ? $v['buyNum'] : '';//销售数量
  7228. $rows['dealAmount'] = isset($v['dealAmount']) ? $v['dealAmount'] : '';//成交金额
  7229. foreach ($rows as $kk => $vv) {
  7230. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  7231. }
  7232. fputcsv($fp, $rs);
  7233. $rows = [];
  7234. }
  7235. }
  7236. /**
  7237. * 导出方法
  7238. *
  7239. * @param $orderProfit
  7240. */
  7241. private static function exportOrderProfit($orderProfit)
  7242. {
  7243. //导出到本地
  7244. header("Content-type:application/vnd.ms-excel");
  7245. header("Content-Disposition:filename=销售毛利明细表记录.csv");
  7246. header('Cache-Control: max-age=0');
  7247. $fp = fopen('php://output', 'a');
  7248. $head = ['商品名','单据类型', '单据日期', '客户名', '数量','其他单位','销售价', '成本价', '销售收入','销售成本', '销售毛利', '销售毛利率']; //定义标题
  7249. foreach ($head as $i => $v) {
  7250. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  7251. }
  7252. fputcsv($fp, $head);
  7253. $limit = 10000;
  7254. $num = 0;//计数器
  7255. foreach ($orderProfit as $v) {
  7256. //循环数据
  7257. $num++;
  7258. if ($num == $limit) {
  7259. ob_flush();//释放内存
  7260. flush();
  7261. }
  7262. $rows['goodsName'] = isset($v['goodsName']) ? $v['goodsName'] : '';//商品名
  7263. $rows['orderType'] = $v['orderType'] === 1 ? '销售订单' : '销售单';//单据类型
  7264. $rows['createTime'] = isset($v['createTime']) ? date('Y-m-d H:i:s',$v['createTime']) : '';//单据日期
  7265. $rows['customerName'] = isset($v['customerName']) ? $v['customerName'] : '';//客户名
  7266. $rows['buyNum'] = isset($v['buyNum']) ? $v['buyNum'] : '';//数量
  7267. $rows['otherNum'] = isset($v['otherNum']) ? $v['otherNum'] : 0;//其他单位
  7268. $rows['price'] = isset($v['price']) ? $v['price'] : '';//销售价
  7269. $rows['outCostPrice'] = isset($v['outCostPrice']) ? $v['outCostPrice'] : '';//成本价
  7270. $rows['totalMoney'] = isset($v['totalMoney']) ? $v['totalMoney'] : '';//销售收入
  7271. $rows['saleCostAmount'] = isset($v['saleCostAmount']) ? $v['saleCostAmount'] : '';//销售成本
  7272. $rows['saleProfitAmount'] = isset($v['saleProfitAmount']) ? $v['saleProfitAmount'] : '';//销售毛利
  7273. $rows['saleProfitRate'] = isset($v['saleProfitRate']) ? $v['saleProfitRate'].'%' : '';//销售毛利率
  7274. foreach ($rows as $kk => $vv) {
  7275. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  7276. }
  7277. fputcsv($fp, $rs);
  7278. $rows = [];
  7279. }
  7280. exit;
  7281. }
  7282. /**
  7283. * 拣货回写订单拣货状态
  7284. */
  7285. public function updateOrderPicking($orderIds,$orderPickStatus)
  7286. {
  7287. $tableName = $this->objDOrder->getTableName('qianniao_order_' . $this->onlineEnterpriseId, $this->onlineUserId, $this->cutTable);
  7288. $this->objDOrder->setTable($tableName);
  7289. if(!empty($orderIds)){
  7290. foreach ($orderIds as $orderId){
  7291. $dbResult = $this->objDOrder->update(['pickingStatus'=>$orderPickStatus],['id'=>$orderId]);
  7292. if ($dbResult === false){
  7293. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7294. }
  7295. }
  7296. }
  7297. return ResultWrapper::success([]);
  7298. }
  7299. /**
  7300. *
  7301. *用户订单状态数量统计
  7302. */
  7303. public function getOrderStatusNum()
  7304. {
  7305. // 2待支付 3代发货 4待收货 5已完成 10退货
  7306. $returnData = [
  7307. '2' => 0,
  7308. '3' => 0,
  7309. '4' => 0,
  7310. '5' => 0,
  7311. '10' => 0
  7312. ];
  7313. // 查询订单各状态对应的总条数
  7314. $sql = 'SELECT count(orderStatus) as total,orderStatus FROM qianniao_order_index_'.$this->onlineEnterpriseId.' WHERE deleteStatus = '.StatusCode::$standard.' AND userCenterId = '.$this->onlineUserId.' GROUP BY orderStatus';
  7315. $dbResult = $this->objDOrderIndex->query($sql);
  7316. if($dbResult === false){
  7317. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  7318. }
  7319. if (!empty($dbResult)){
  7320. foreach ($dbResult as $key => $value){
  7321. $returnData[$value['orderStatus']] = $value['total'];
  7322. }
  7323. }
  7324. // 查询退货状态总条数
  7325. unset($dbResult);
  7326. $sql = 'SELECT count(id) as total FROM qianniao_order_return_'.$this->onlineEnterpriseId.' WHERE deleteStatus = '.StatusCode::$standard.' AND userCenterId = '.$this->onlineUserId;
  7327. $dbResult = $this->objDOrderIndex->query($sql);
  7328. if($dbResult === false){
  7329. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  7330. }
  7331. if (!empty($dbResult)){
  7332. $returnData[10] = $dbResult[0]['total'];
  7333. }
  7334. return ResultWrapper::success($returnData);
  7335. }
  7336. }