MOrder.Class.php 360 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897
  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. class MOrder extends MBaseModel
  74. {
  75. /**
  76. * @var DOrder
  77. */
  78. private $objDOrder;
  79. /**
  80. * @var int 用户id
  81. */
  82. private $onlineUserId;
  83. /**
  84. * @var int 企业id
  85. */
  86. private $onlineEnterpriseId;
  87. /**
  88. * @var int 单表数据量
  89. */
  90. private $cutTable = 500000;
  91. /**
  92. * @var DOrderIndex
  93. */
  94. private $objDOrderIndex;
  95. /**
  96. * @var DOrderGoods
  97. */
  98. private $objDOrderGoods;
  99. /**
  100. * @var DOrderStatistics
  101. */
  102. private $objDOrderStatistics;
  103. /**
  104. * @var bool
  105. */
  106. private $isFront;//是否是前台调用此Model 前台=>true
  107. /**
  108. * @var OverviewCache
  109. */
  110. private $objOverviewCache;
  111. /**
  112. * @var string
  113. */
  114. private $orderStatisticsTableName = 'order_statistics';
  115. /**
  116. * @var MAccount
  117. */
  118. private $objMAccount;
  119. /**
  120. * @var MReceived
  121. */
  122. private $objMReceived;
  123. /**
  124. * @var ActivityLimitCache
  125. */
  126. private $objActivityLimitCache;
  127. /**
  128. * @var SaleOrder 销售单
  129. */
  130. private $objSaleOrder;
  131. /**
  132. * @var bool 销售单是否打印小票
  133. */
  134. private $isEnablePrint = false;
  135. /**
  136. * @var DOrderReceive
  137. */
  138. private $objDOrderReceive;
  139. /**
  140. * @var DCustomer
  141. */
  142. private $objDCustomer;
  143. /**
  144. * @var int
  145. */
  146. private $loginUserCenterId;
  147. /**
  148. * @var array
  149. */
  150. private $expressMap = [
  151. 'express_hundred' => 'kuaidi100',
  152. 'express_bird' => 'kdniao'
  153. ];
  154. /**
  155. * @var bool
  156. */
  157. private $isCashier;
  158. /**
  159. * @var MProcessSetting
  160. */
  161. private $objMProcessSetting;
  162. use TStdOrder;
  163. /**
  164. * MOrder constructor.
  165. * @param $onlineUserId
  166. * @param $onlineEnterpriseId
  167. * @param null $loginUserCenterId
  168. * @param bool $isFront
  169. * @throws \Exception
  170. */
  171. public function __construct($onlineUserId, $onlineEnterpriseId, $loginUserCenterId = null, $isFront = false, $isCashier = false)
  172. {
  173. $this->isCashier = $isCashier;
  174. $this->isFront = $isFront;
  175. $this->onlineUserId = $onlineUserId;
  176. $this->onlineEnterpriseId = $onlineEnterpriseId;
  177. $this->loginUserCenterId = $loginUserCenterId;
  178. parent::__construct($this->onlineEnterpriseId, $loginUserCenterId);
  179. $this->objDOrder = new DOrder('default');
  180. self::orderSubTable($onlineEnterpriseId, $onlineUserId);
  181. $this->objDOrderIndex = new DOrderIndex();
  182. $this->objDOrderGoods = new DOrderGoods('default');
  183. $this->objDOrderReceive = new DOrderReceive();
  184. $this->objDOrderStatistics = new DOrderStatistics('default');
  185. $this->objMAccount = new MAccount($onlineEnterpriseId, $onlineUserId);
  186. $this->objMReceived = new MReceived($onlineEnterpriseId, $onlineUserId);
  187. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  188. $this->objDOrderStatistics->setTable($this->objDOrderStatistics->get_Table() . '_' . $this->onlineEnterpriseId);
  189. $this->objDOrder->setSearchIndex('order_search')->setType('order');
  190. $this->objActivityLimitCache = new ActivityLimitCache($this->onlineEnterpriseId);
  191. $this->objOverviewCache = new OverviewCache();
  192. $this->objSaleOrder = new SaleOrder();
  193. $this->objDCustomer = new DCustomer();
  194. $this->objDCustomer->setTable('qianniao_customer_' . $this->onlineEnterpriseId);
  195. $this->objMProcessSetting = new MProcessSetting($this->onlineEnterpriseId);
  196. }
  197. /**
  198. * 订单分表 分表规则:企业id_(客户/200000)
  199. * @param $enterpriseId (企业id)
  200. * @param $userId (用户id)
  201. * @throws \Exception
  202. */
  203. public function orderSubTable($enterpriseId, $userId)
  204. {
  205. $tableName = $this->objDOrder->getTableName('qianniao_order_' . $enterpriseId, $userId, $this->cutTable);
  206. self::existsTable($tableName);
  207. $this->objDOrder->setTable($tableName);
  208. }
  209. /**
  210. * 获取订单表表名
  211. */
  212. public function getOrderTable($enterpriseId, $userId){
  213. return $this->objDOrder->getTableName('qianniao_order_' . $enterpriseId, $userId, $this->cutTable);
  214. }
  215. /**
  216. * 统计订单信息
  217. *
  218. * @param $data
  219. * @param $className
  220. */
  221. private static function noticeStatistics($data, $className)
  222. {
  223. $i = 1;
  224. do {
  225. $postData = [
  226. 'topicName' => 'MyJob',
  227. 'topicClass' => "Jobs\Model\MTopic\Order\\" . $className,
  228. 'topicMethon' => 'push',
  229. 'topicMethonParams' => [
  230. 'userCenterId' => $data['userCenterId'],
  231. 'enterpriseId' => $data['enterpriseId'],
  232. 'customerId' => $data['customerId'],
  233. 'no' => $data['no'],
  234. 'noticeType' => $data['noticeType'],
  235. ],
  236. ];
  237. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  238. $result = request($url, $postData);
  239. $i++;
  240. } while ($result['httpcode'] != 200 && $i <= 3);
  241. }
  242. /**
  243. * 分表后缀+月日+订单id
  244. * @param $orderId
  245. * @return string
  246. */
  247. private function createVerifyCode($orderId)
  248. {
  249. $fix = ceil($this->onlineUserId / $this->cutTable);
  250. return $fix . '-' . date('nj') . '-' . $orderId;
  251. }
  252. /**
  253. * Doc: (des="")
  254. * User: XMing
  255. * Date: 2020/12/25
  256. * Time: 2:11 下午
  257. * @param $data
  258. * @return ResultWrapper
  259. */
  260. public function checkLimit($data)
  261. {
  262. foreach ($data as $goods) {
  263. if (isset($goods['activityId'])) {
  264. //获取活动商品剩余数量
  265. $surplusNum = $this->objActivityLimitCache->getLen($goods['activityId'], $goods['goodsId'], $goods['skuId']);
  266. if ($surplusNum < $goods['buyNum']) {
  267. return ResultWrapper::fail($goods['title'] . '活动剩余数量不足', ErrorCode::$paramError);
  268. }
  269. }
  270. }
  271. return ResultWrapper::success($data);
  272. }
  273. /**
  274. * Doc: (des="订单编辑")
  275. * User: XMing
  276. * Date: 2020/11/5
  277. * Time: 10:07 上午
  278. * @param array $params
  279. * @param $id
  280. * @return ResultWrapper
  281. * @throws \Exception
  282. */
  283. public function edit(array $params, $id): ResultWrapper
  284. {
  285. $orderIndex = $this->objDOrderIndex->get($id);
  286. if ($orderIndex === false) {
  287. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  288. }
  289. if (empty($orderIndex)) {
  290. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  291. }
  292. /*if ($orderIndex['payStatus'] == StatusCode::$standard) {
  293. return ResultWrapper::fail('订单已支付,不能编辑', ErrorCode::$paramError);
  294. }
  295. if ($orderIndex['auditStatus'] != StatusCode::$auditStatus['auditing']) {
  296. return ResultWrapper::fail('订单已审核不能编辑', ErrorCode::$paramError);
  297. }*/
  298. if (
  299. in_array($orderIndex['orderStatus'], [StatusCode::$orderStatus['waitReceive'], StatusCode::$orderStatus['finish'], StatusCode::$orderStatus['close']])
  300. ) {
  301. return ResultWrapper::fail('此订单不能编辑', ErrorCode::$paramError);
  302. }
  303. $fix = ceil((empty($params['userCenterId']) ? 1 : $params['userCenterId']) / $this->cutTable);
  304. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  305. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $fix);
  306. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  307. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  308. $customerResult = self::getCustomerInfoByUserCenterId($params['userCenterId']);
  309. if (!$customerResult->isSuccess()) {
  310. return ResultWrapper::fail($customerResult->getData(), $customerResult->getErrorCode());
  311. }
  312. $customer = $customerResult->getData();
  313. isset($customer['customerType']) && $params['customerType'] = $customer['customerType'];
  314. isset($customer['salesManId']) && $params['salesManId'] = $customer['salesManId'];
  315. isset($customer['salesManName']) && $params['salesManName'] = $customer['salesManName'];
  316. $params['customerOwe'] = $objMCustomerBalance->getCustomerBalance($customer['id']);//获取客户当前欠款
  317. $address = [];
  318. $selfRule = [];
  319. switch ($params['deliveryType']) {
  320. case StatusCode::$deliveryType['goodsDelivery']:
  321. $addressResult = self::getAddressInfo($params['addressId']);
  322. if (!$addressResult->isSuccess()) {
  323. return ResultWrapper::fail($addressResult->getData(), $addressResult->getErrorCode());
  324. }
  325. $address = $addressResult->getData();
  326. break;
  327. case StatusCode::$deliveryType['selfMention']:
  328. $selfRuleResult = self::getSelfRuleData($params['selfRuleId']);
  329. if (!$selfRuleResult->isSuccess()) {
  330. return ResultWrapper::fail($selfRuleResult->getData(), $selfRuleResult->getErrorCode());
  331. }
  332. $selfRule = $selfRuleResult->getData();
  333. break;
  334. }
  335. $status = $this->objDOrder->beginTransaction();
  336. $updateIndexResult = $this->objDOrderIndex->update(
  337. [
  338. 'userCenterId' => isset($params['userCenterId']) ? $params['userCenterId'] : 0,
  339. 'deliveryType' => isset($params['deliveryType']) ? $params['deliveryType'] : 0,
  340. 'customerId' => isset($params['customerId']) ? $params['customerId'] : 0,
  341. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  342. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  343. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  344. 'selfRuleId' => isset($params['selfRuleId']) ? $params['selfRuleId'] : 0,
  345. 'updateTime' => time(),
  346. ],
  347. $id
  348. );
  349. if ($updateIndexResult === false) {
  350. $this->objDOrder->rollBack();
  351. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  352. }
  353. $updateOrder = [
  354. 'customerName' => isset($params['customerName']) ? $params['customerName'] : '',
  355. 'customerId' => isset($params['customerId']) ? $params['customerId'] : 0,
  356. 'deliveryType' => isset($params['deliveryType']) ? $params['deliveryType'] : 0,
  357. 'remark' => isset($params['remark']) ? $params['remark'] : '',
  358. 'salesManId' => isset($params['salesManId']) ? $params['salesManId'] : 0,
  359. 'salesManName' => isset($params['salesManName']) ? $params['salesManName'] : '',
  360. 'customerType' => isset($params['customerType']) ? $params['customerType'] : 0,
  361. 'userCenterId' => isset($params['userCenterId']) ? $params['userCenterId'] : 0,
  362. 'customerOwe' => isset($params['customerOwe']) ? $params['customerOwe'] : 0,
  363. 'preferential' => isset($params['preferential']) ? $params['preferential'] : 0,
  364. 'vipDiscount' => isset($params['vipDiscount']) ? $params['vipDiscount'] : 0,
  365. 'expressMoney' => isset($params['expressMoney']) ? $params['expressMoney'] : 0,
  366. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  367. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  368. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  369. 'selfRuleId' => isset($params['selfRuleId']) ? $params['selfRuleId'] : 0,
  370. 'originPayAmount' => isset($params['originPayAmount']) ? $params['originPayAmount'] : 0,
  371. 'payAmount' => isset($params['payMoney']) ? $params['payMoney'] : 0,
  372. 'totalMoney' => isset($params['totalMoney']) ? $params['totalMoney'] : 0,
  373. 'receivedMoney' => isset($params['receivedMoney']) ? $params['receivedMoney'] : 0,
  374. "accountList" => isset($params['accountList']) ? json_encode($params['accountList']) : null,
  375. "currentAccountName" => isset($params['currentAccountName']) ? $params['currentAccountName'] : '',
  376. "totalReduceMoney" => isset($params['totalReduceMoney']) ? $params['totalReduceMoney'] : 0,
  377. "selfRuleData" => empty($selfRule) ? null : json_encode($selfRule),
  378. "updateTime" => time(),
  379. ];
  380. $updateOrderResult = $this->objDOrder->update($updateOrder, $id);
  381. if ($updateOrderResult === false) {
  382. $this->objDOrder->rollBack();
  383. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  384. }
  385. if (!empty($address)) {
  386. $updateReceiveResult = $this->objDOrderReceive->update([
  387. 'customerId' => $address['customerId'],
  388. 'customerCode' => $address['customerCode'],
  389. 'realName' => $address['name'],
  390. 'mobile' => $address['mobile'],
  391. 'address' => $address['address'],
  392. 'provinceCode' => $address['provinceCode'],
  393. 'cityCode' => $address['cityCode'],
  394. 'districtCode' => $address['districtCode'],
  395. 'updateTime' => time()
  396. ], ['orderId' => $id]);
  397. if ($updateReceiveResult === false) {
  398. $this->objDOrder->rollBack();
  399. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  400. }
  401. }
  402. //编辑商品
  403. if ($orderIndex['payStatus'] != StatusCode::$standard || $orderIndex['auditStatus'] != StatusCode::$auditStatus['auditPass']) {
  404. //解锁库存
  405. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  406. $unlockResult = $objMInventory->unlockInventory([$id], StatusCode::$orderType['saleOrder'], $orderIndex['createTime']);
  407. if (!$unlockResult->isSuccess()) {
  408. $this->objDOrder->rollBack();
  409. Logger::logs(E_USER_ERROR, '编辑订单,库存解锁失败', __CLASS__, __LINE__, $unlockResult->getData());
  410. return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  411. }
  412. $editResult = $objMOrderGoods->edit($params, $id,$orderIndex['no']);
  413. if (!$editResult->isSuccess()) {
  414. $this->objDOrder->rollBack();
  415. return ResultWrapper::fail($editResult->getData(), $editResult->getErrorCode());
  416. }
  417. }
  418. /*
  419. //跟新es
  420. $_id = self::createEsDocumentId($id);
  421. $this->objDOrder->esupdateTypeFieldVaule($updateOrder, $_id);*/
  422. if ($status){
  423. $this->objDOrder->commit();
  424. }
  425. return ResultWrapper::success(true);
  426. }
  427. /**
  428. * Doc: (des="代客下单,销售订单")
  429. * User: XMing
  430. * Date: 2020/12/19
  431. * Time: 2:38 下午
  432. * @param $params
  433. * @return ResultWrapper
  434. * @throws \Exception
  435. */
  436. public function add($params): ResultWrapper
  437. {
  438. $params['orderType'] = getArrayItem($params,'orderType',StatusCode::$orderType['saleOrder']);
  439. $goodsNameStr = self::createGoodsName($params['lists']);
  440. $commonParamsResult = self::formatCommonParams($params); // 格式化订单关联数据
  441. if (!$commonParamsResult->isSuccess()){
  442. return ResultWrapper::fail($commonParamsResult->getData(),$commonParamsResult->getErrorCode());
  443. }
  444. $params = $commonParamsResult->getData();
  445. $lists = $params['lists'];
  446. unset($params['lists']);
  447. $groupShopDataResult = self::buildGoodsByShop($lists,$params);
  448. if (!$groupShopDataResult->isSuccess()){
  449. return ResultWrapper::fail($groupShopDataResult->getData(),$groupShopDataResult->getErrorCode());
  450. }
  451. $shopGoodsData = $groupShopDataResult->getData();
  452. //锁定库存 查询商铺对应的仓库
  453. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  454. $modelResult = $objMShop->getShopDataByShopIds(array_column($shopGoodsData, 'shopId')); // 根据shopIds获取商铺数据
  455. if (!$modelResult->isSuccess()) {
  456. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  457. }
  458. $shopMap = $modelResult->getData();
  459. $buildGroupResult = self::groupSupplierOrderData($shopGoodsData,$params,$shopMap); // 将商品数据按照指定的字段分组
  460. if (!$buildGroupResult->isSuccess()){
  461. return ResultWrapper::fail($buildGroupResult->getData(),$buildGroupResult->getErrorCode());
  462. }
  463. $buildGroup = $buildGroupResult->getData();
  464. $insertOrderResult = self::insertOrder($buildGroup,$params);
  465. if (!$insertOrderResult->isSuccess()){
  466. return ResultWrapper::fail($insertOrderResult->getData(),$insertOrderResult->getErrorCode());
  467. }
  468. $orderIds = $insertOrderResult->getData();
  469. /* 拣货信息 */
  470. /* 功能临时屏蔽
  471. $orderNum = 0;
  472. $notOutNum = 0;
  473. $notPickingNum = 0;
  474. $otherNum = 0;
  475. foreach ($lists as $listKey => $listValue){
  476. $notOutNum = bcadd($notOutNum,$listValue['buyNum'],4);
  477. $notPickingNum = bcadd($notPickingNum,$listValue['buyNum'],4);
  478. $otherNum = bcadd($otherNum,$listValue['otherNum']);
  479. $orderNum = bcadd($orderNum,$listValue['buyNum']);
  480. }
  481. //组装订单拣货信息
  482. $orderPickingDate = [
  483. 'orderId' => $orderIds[0],
  484. 'sort' => 0,
  485. 'outNum' => 0,
  486. 'notOutNum' => $notOutNum,
  487. 'orderNum' => $orderNum,
  488. 'notPickingNum' => $notPickingNum,
  489. 'pickingNum' => 0,
  490. 'outTime' => 0,
  491. 'otherNum' => $otherNum,
  492. 'mangeId' => getArrayItem($params,'operatorId',0),
  493. 'mangeName' => getArrayItem($params,'operatorName',''),
  494. ];
  495. $objOrderPicking = new MOrderPicking($this->onlineUserId,$this->onlineEnterpriseId);
  496. $orderPickingResult = $objOrderPicking->addOrderPick($orderPickingDate); //临时注释
  497. if(!$orderPickingResult->isSuccess()){
  498. return ResultWrapper::fail($orderPickingResult->getData(), $orderPickingResult->getErrorCode());
  499. }*/
  500. parent::sendMessage($this->onlineEnterpriseId,'NewOrder');
  501. $params['orderType'] == StatusCode::$orderType['saleOrder'] && self::runProcessNextAudit($orderIds);
  502. return ResultWrapper::success($orderIds);
  503. }
  504. /**
  505. * Doc: (des="商品名称")
  506. * User: XMing
  507. * Date: 2020/11/18
  508. * Time: 3:27 下午
  509. * @param $goods
  510. * @return string
  511. */
  512. public static function createGoodsName($goods): string
  513. {
  514. $str = '';
  515. foreach ($goods as $val){
  516. if (isset($val['goodsName']) && !empty($val['goodsName'])){
  517. $str .= (string)$val['goodsName'].' ';
  518. }
  519. }
  520. return $str;
  521. }
  522. /**
  523. * Doc: (des="执行订单的下一步操作")
  524. * User: XMing
  525. * Date: 2020/11/6
  526. * Time: 5:03 下午
  527. * @param array $ids 订单ids
  528. * @return ResultWrapper
  529. * @throws \Exception
  530. */
  531. private function runProcessNextAudit(array $ids): ResultWrapper
  532. {
  533. Logger::logs(E_USER_ERROR,'订单自动审核',__CLASS__,__LINE__,$ids);
  534. if (empty($ids)){
  535. return ResultWrapper::success(true);
  536. }
  537. $setResult = $this->objMProcessSetting->getProcessSettingByType(StatusCode::$processType['sales'],'audit');
  538. if (!$setResult->isSuccess()){
  539. Logger::logs(E_USER_ERROR,'获取流程配置出错',__CLASS__,__LINE__,$setResult->getData());
  540. return ResultWrapper::fail($setResult->getData(),$setResult->getErrorCode());
  541. }
  542. $set = $setResult->getData();
  543. if (empty($set)){
  544. Logger::logs(E_USER_ERROR,'配置为空',__CLASS__,__LINE__,'');
  545. return ResultWrapper::success(true);
  546. }
  547. if (isset($set['enableStatus']) && $set['enableStatus'] == StatusCode::$standard){
  548. Logger::logs(E_USER_ERROR,'配置',__CLASS__,__LINE__,$set);
  549. return ResultWrapper::success(true);
  550. }
  551. foreach ($ids as $id){
  552. $params = [
  553. 'id' => $id,
  554. 'audit' => '自动审核',
  555. 'auditId' => $this->onlineUserId,
  556. 'auditStatus' => StatusCode::$auditStatus['auditPass'],
  557. ];
  558. $auditResult = $this->updateAuditStatus($params);
  559. if (!$auditResult->isSuccess()){
  560. Logger::logs(E_USER_ERROR,'自动审核订单出错',__CLASS__,__LINE__,$auditResult->getData());
  561. return ResultWrapper::fail($auditResult->getData(),$auditResult->getErrorCode());
  562. }
  563. }
  564. Logger::logs(E_USER_ERROR,'自动审核订单成功',__CLASS__,__LINE__,$ids);
  565. return ResultWrapper::success(true);
  566. }
  567. /**
  568. * Doc: (des="根据客户id获取客户信息")
  569. * User: XMing
  570. * Date: 2020/11/3
  571. * Time: 2:11 下午
  572. * @param int $id
  573. * @return ResultWrapper
  574. * @throws \Exception
  575. */
  576. private function getCustomerInfoByUserCenterId(int $id): ResultWrapper
  577. {
  578. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  579. //获取客户信息
  580. $customerData = $objMCustomer->getCustomerInfoByUserCenterId($id);
  581. if (!$customerData->isSuccess()) {
  582. return ResultWrapper::fail($customerData->getData(), $customerData->getErrorCode());
  583. }
  584. $customerData = $customerData->getData();
  585. if (empty($customerData)) {
  586. return ResultWrapper::fail('未获取到客户信息', ErrorCode::$paramError);
  587. }
  588. return ResultWrapper::success($customerData);
  589. }
  590. /**
  591. * Doc: (des="根据id查询自提点信息")
  592. * User: XMing
  593. * Date: 2020/11/3
  594. * Time: 11:49 上午
  595. * @param int $id
  596. * @return ResultWrapper
  597. * @throws \Exception
  598. */
  599. private function getSelfRuleData(int $id): ResultWrapper
  600. {
  601. $objMDeliverySetting = new MDeliverySetting($this->onlineUserId, $this->onlineEnterpriseId);
  602. $selfRuleDataResult = $objMDeliverySetting->getSelfRuleInfo($id);
  603. if (!$selfRuleDataResult->isSuccess()) {
  604. return ResultWrapper::fail($selfRuleDataResult->getData(), $selfRuleDataResult->getErrorCode());
  605. }
  606. $selfRuleData = $selfRuleDataResult->getData();
  607. $selfRuleData = isset($selfRuleData['setData']) ? $selfRuleData['setData'] : [];
  608. return ResultWrapper::success($selfRuleData);
  609. }
  610. /**
  611. * Doc: (des="根据id获取收货地址信息")
  612. * User: XMing
  613. * Date: 2020/11/3
  614. * Time: 11:52 上午
  615. * @param int $id
  616. * @return ResultWrapper
  617. */
  618. private function getAddressInfo($id): ResultWrapper
  619. {
  620. $objMShippingAddress = new MShippingAddress($this->onlineEnterpriseId);
  621. $result = $objMShippingAddress->getShippingAddressInfo($id);
  622. if (!$result->isSuccess()) {
  623. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  624. }
  625. $addressData = $result->getData();
  626. if (empty($addressData)) {
  627. return ResultWrapper::fail('未获取到收货地址信息', ErrorCode::$dberror);
  628. }
  629. return ResultWrapper::success($addressData);
  630. }
  631. /**
  632. * Doc: (des="小程序下单")
  633. * User: XMing
  634. * Date: 2020/12/18
  635. * Time: 11:39 上午
  636. * @param $params
  637. * @param $ip
  638. * @param $token
  639. * @param $auth
  640. * @return ResultWrapper
  641. * @throws \Exception
  642. */
  643. public function addOrder($params, $ip, $token, $auth): ResultWrapper
  644. {
  645. $goodsData = getArrayItem($params,'goodsData',[]);
  646. unset($params['goodsData']);
  647. $shopGoodsData = getArrayItem($goodsData,'goodsData',[]);//商品数据
  648. unset($goodsData['goodsData']);
  649. $common = array_merge($params,$goodsData);
  650. $params = $common;//公共数据
  651. unset($common);
  652. $params['token'] = $token;
  653. $params['auth'] = $auth;
  654. $params['orderType'] = StatusCode::$orderType['saleOrder'];
  655. $params['userCenterId'] = $this->onlineUserId;
  656. $params['orderStatus'] = StatusCode::$orderStatus['waitPay'];
  657. // 货到付款和银行打款 修改订单状态为待发货
  658. if( in_array($params['payType'],[StatusCode::$payType['cashPay']]) ){
  659. $params['orderStatus'] = StatusCode::$orderStatus['waitDelivery'];
  660. }
  661. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  662. $params['outerTradeNo'] = $tmpOuterTradeNo;
  663. // 格式化订单关联数据
  664. $commonParamsResult = self::formatCommonParams($params);
  665. if (!$commonParamsResult->isSuccess()){
  666. return ResultWrapper::fail($commonParamsResult->getData(),$commonParamsResult->getErrorCode());
  667. }
  668. $params = $commonParamsResult->getData();
  669. //查询商铺对应的仓库
  670. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  671. $modelResult = $objMShop->getShopDataByShopIds(array_column($shopGoodsData, 'shopId'));
  672. if (!$modelResult->isSuccess()) {
  673. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  674. }
  675. $shopMap = $modelResult->getData();
  676. // 将商品数据按照指定的字段分组
  677. $buildGroupResult = self::groupSupplierOrderData($shopGoodsData,$params,$shopMap);
  678. if (!$buildGroupResult->isSuccess()){
  679. return ResultWrapper::fail($buildGroupResult->getData(),$buildGroupResult->getErrorCode());
  680. }
  681. $buildGroup = $buildGroupResult->getData();
  682. //mysql写入数据
  683. $insertOrderResult = self::insertOrder($buildGroup,$params);
  684. if (!$insertOrderResult->isSuccess()){
  685. return ResultWrapper::fail($insertOrderResult->getData(),$insertOrderResult->getErrorCode());
  686. }
  687. $orderIds = $insertOrderResult->getData();
  688. // 处理支付
  689. $payResult = self::toPay($tmpOuterTradeNo,$params,$orderIds,$ip);
  690. if (!$payResult->isSuccess()){
  691. return ResultWrapper::fail($payResult->getData(),$payResult->getErrorCode());
  692. }
  693. // 发送新订单提醒
  694. parent::sendMessage($this->onlineEnterpriseId,'NewOrder');
  695. $params['orderType'] == StatusCode::$orderType['saleOrder'] && self::runProcessNextAudit($orderIds);
  696. $customerData = $this->objDCustomer->get($buildGroup['orderIndex'][0]['customerId']);
  697. if ($customerData === false) {
  698. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  699. }
  700. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  701. $orderData = $this->objDOrder->get($orderIds);
  702. if($orderData === false){
  703. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  704. }
  705. if( empty($orderData) ){
  706. return ResultWrapper::fail('查找不到该订单数据', ErrorCode::$contentNotExists);
  707. }
  708. foreach($buildGroup['order'] as $key => $value){
  709. // 发送小程序订阅消息
  710. $sendMessageData = [
  711. 'character_string6' => [ 'value' => StatusCode::$noPrefix[1].'-'.$key ], // 订单编号
  712. 'amount10' => [ 'value' => $value['payAmount'] ], // 订单金额
  713. 'thing15' => [ 'value' => $buildGroup['orderReceive'][$key]['realName'] ], // 收货人姓名
  714. 'phone_number16' => [ 'value' => $buildGroup['orderReceive'][$key]['mobile'] ], // 收货人电话
  715. 'phrase19' => [ 'value' => $orderData['payStatus'] == StatusCode::$delete ? '待支付':'已支付'], // 支付状态
  716. ];
  717. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  718. $result = $objMSystemPushMessage->sendWeiXinPushMessage(1, $customerData['openId'], $sendMessageData, '/pagesT/order/orderDetail?id='.array_pop($orderIds));
  719. if(!$result->isSuccess()){
  720. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/phperstar.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  721. }
  722. }
  723. }
  724. return ResultWrapper::success($payResult->getData());
  725. }
  726. /**
  727. * Doc: (des="支付")
  728. * User: XMing
  729. * Date: 2020/12/18
  730. * Time: 4:17 下午
  731. * @param string $tmpOuterTradeNo 临时订单号
  732. * @param array $params 公共参数
  733. * @param array $orderIds 所有订单号
  734. * @param $ip
  735. * @return ResultWrapper
  736. * @throws \Exception
  737. */
  738. public function toPay($tmpOuterTradeNo,$params,$orderIds,$ip): ResultWrapper
  739. {
  740. // 获取支付金额
  741. $payMoney = getArrayItem($params,'payMoney',0);
  742. if (empty($payMoney)){
  743. return ResultWrapper::fail('支付金额异常',ErrorCode::$paramError);
  744. }
  745. // 处理支付方式
  746. $payType = explode(',', $params['payType']);
  747. rsort($payType);
  748. $objSystemCache = new SystemCache();
  749. // 后台代客下单/货到付款/银行打款不需要返回支付配置
  750. if ( $params['source'] == StatusCode::$source['manage'] || in_array(StatusCode::$payType['cashPay'], $payType) ) {
  751. return ResultWrapper::success($orderIds);
  752. }
  753. $payment = [];
  754. $payParams = '';
  755. $payStatus = StatusCode::$partion;
  756. $orderStatus = StatusCode::$orderStatus['waitPay'];
  757. $notPayMoney = $payMoney;
  758. foreach($payType as $k => $v){
  759. //判断支付状态(有银行打款是5,没有直接给3)
  760. // 除了余额支付其他方式都要获取支付配置
  761. if($v != StatusCode::$payType['balance'] && $v != StatusCode::$payType['bankLoans']){
  762. $objMPaymentSetting = new MPaymentSetting($this->onlineUserId, $this->onlineEnterpriseId);
  763. $result = $objMPaymentSetting->getPayData($v);
  764. if (!$result->isSuccess() || empty($result->getData())) {
  765. return ResultWrapper::fail('获取微信配置错误', ErrorCode::$configEroor);
  766. }
  767. $payment = $result->getData();
  768. }
  769. switch (true){
  770. case in_array(StatusCode::$payType['balance'], $payType):
  771. //减少余额()
  772. $status = $this->objDOrderIndex->beginTransaction();
  773. //新增会员流水记录
  774. $memberBalanceDetailData = [
  775. 'customerId' => $params['id'],
  776. 'type' => StatusCode::$delete,
  777. 'userCenterId' => $this->onlineUserId,
  778. 'purpose' => '创建订单消费',
  779. 'orderIds' =>implode(',',$orderIds),
  780. 'remark' => '订单id'.implode(',',$orderIds),
  781. 'financeType' => '会员余额消费'
  782. ];
  783. // 组合支付方式
  784. if( !empty($params['admixPayData']) ) {
  785. foreach ($params['admixPayData'] as $key => $value) {
  786. if ($value['payType'] == StatusCode::$payType['balance']) {
  787. // 本次混合支付余额支付金额
  788. $memberBalanceDetailData['money'] = $value['payMoney'];
  789. // 总金额 - 余额支付金额 = 剩余需要搭配支付金额
  790. $payMoney = bcsub($payMoney, $value['payMoney'], 2);
  791. $notPayMoney = $payMoney;
  792. }
  793. }
  794. }else{
  795. $orderStatus = StatusCode::$orderStatus['waitDelivery'];
  796. $payStatus = StatusCode::$standard;
  797. $memberBalanceDetailData['money'] = $payMoney;
  798. $notPayMoney = 0;
  799. }
  800. $objMMemberBalanceDetail = new MMemberBalanceDetail($this->onlineEnterpriseId,$this->onlineUserId);
  801. $memberBalanceDbResult = $objMMemberBalanceDetail->addMemberBalanceDetail($memberBalanceDetailData);
  802. if (!$memberBalanceDbResult->isSuccess()) {
  803. $this->objDOrderIndex->rollBack();
  804. return ResultWrapper::fail($memberBalanceDbResult->getData(), $memberBalanceDbResult->getErrorCode());
  805. }
  806. // 查询余额对应的银行账户
  807. $defaultAccountResult = $this->objMAccount->getDefaultAccount(StatusCode::$payType['balance']);
  808. if ($defaultAccountResult->isSuccess() == false) {
  809. $this->objDOrderIndex->rollBack();
  810. return ResultWrapper::fail($defaultAccountResult->getData(), $defaultAccountResult->getErrorCode());
  811. }
  812. if(empty($defaultAccountResult->getData())){
  813. $this->objDOrderIndex->rollBack();
  814. return ResultWrapper::fail('没有默认的'.StatusCode::$payType[$payType['balance']].'账户', ErrorCode::$notAllowAccess);
  815. }
  816. $defaultAccount = $defaultAccountResult->getData();
  817. //修改订单状态
  818. $time = time();
  819. $this->objDOrderIndex->setTable('qianniao_order_index_'.$this->onlineEnterpriseId);
  820. $fix = ceil($params['userCenterId'] / $this->cutTable);
  821. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  822. foreach ($orderIds as $orderId){
  823. $updateIndexResult = $this->objDOrderIndex->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'updateTime' => $time],$orderId);
  824. if ($updateIndexResult === false){
  825. $this->objDOrderIndex->rollBack();
  826. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  827. }
  828. $updateIndex = $this->objDOrder->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'payTime'=> $time,'updateTime' => $time,'notPayMoney'=>$notPayMoney],$orderId);
  829. if ($updateIndex === false){
  830. $this->objDOrderIndex->rollBack();
  831. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  832. }
  833. $orderInfo = $this->objDOrder->get($orderId);
  834. if($orderInfo == false){
  835. $this->objDOrderIndex->rollBack();
  836. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  837. }
  838. // 生成收款单
  839. $receivedData = [
  840. 'customerId' => $orderInfo['customerId'],
  841. 'customerName' => $orderInfo['customerName'],
  842. 'currentAccountName' => $orderInfo['shopName'],
  843. 'financeType' => '销售收款',
  844. 'financeTypeId' => StatusCode::$systemFinanceType['saleReceipt'],
  845. 'shopId' => $orderInfo['shopId'],
  846. 'shopName' => $orderInfo['shopName'],
  847. 'receiptTime' => time(),
  848. 'operatorId' => $this->onlineUserId,
  849. 'originId' => $orderId,
  850. 'originNo' => $orderInfo['no'],
  851. 'sourceId' => $orderId,
  852. 'sourceNo' => $orderInfo['no'],
  853. 'sourceNoMoney' => $orderInfo['totalMoney'], //原单据订单总金额
  854. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  855. 'createTime' => time(),
  856. 'updateTime' => time(),
  857. 'accountList' => [
  858. [
  859. "accountId" => isset($defaultAccount['id']) ? $defaultAccount['id'] : 0,
  860. "accountNumber" => isset($defaultAccount['accountNumber']) ? $defaultAccount['accountNumber'] : '',
  861. 'accountName' => isset($defaultAccount['name']) ? $defaultAccount['name'] : '',
  862. "money" => $memberBalanceDetailData['money'],
  863. "discountMoney" => 0,
  864. "finalMoney" => $memberBalanceDetailData['money'],
  865. "payWay" => '余额支付',
  866. "remark" => "在线余额支付自动生成收款单"
  867. ]
  868. ],
  869. ];
  870. $result = $this->objMReceived->addReceived($receivedData, true);
  871. if ($result->isSuccess() == false) {
  872. $this->objDOrderIndex->rollBack();
  873. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  874. }
  875. unset($receivedData);
  876. unset($result);
  877. }
  878. // 根据客户id (customerId) 获取 openId
  879. if(!empty($orderInfo['customerId'])){
  880. $customerId = $orderInfo['customerId'];
  881. $objDCustomer = new DCustomer('default');
  882. $objDCustomer->setTable($objDCustomer->get_Table() . '_' . $this->onlineEnterpriseId);
  883. $customerData = $objDCustomer->get($customerId);
  884. if($customerData === false){
  885. return ResultWrapper::fail($objDCustomer->error(), ErrorCode::$dberror);
  886. }
  887. if( empty($customerData) ){
  888. return ResultWrapper::fail('查找不到该客户数据', ErrorCode::$contentNotExists);
  889. }
  890. // 小程序订阅消息
  891. if (isset($customerData['openId']) && !empty($customerData['openId'])) {
  892. // 发送小程序订阅消息
  893. $sendMessageData = [
  894. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfo['no']], // 订单编号
  895. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfo['createTime'])], // 下单时间
  896. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  897. 'thing7' => ['value' => '余额支付'], // 支付方式
  898. 'name8' => ['value' => substr($orderInfo['shopName'],0,30)] // 商家名称
  899. ];
  900. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  901. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customerData['openId'], $sendMessageData);
  902. if (!$result->isSuccess()) {
  903. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  904. }
  905. }
  906. }
  907. $status && $this->objDOrderIndex->commit();
  908. $payParams = ResultWrapper::success([]);
  909. break;
  910. case in_array(StatusCode::$payType['aliPay'], $payType):
  911. //ali
  912. /*********读取支付宝支付参数(原配置)*********/
  913. /**$aliPayConfigData = Factory::config()->get('alipay');
  914. * if (empty($aliPayConfigData)) {
  915. * return ResultWrapper::fail('支付宝配置错误', ErrorCode::$configEroor);
  916. * }*/
  917. $payOrderData = [
  918. 'subject' => '千鸟云商',
  919. 'out_trade_no' => $tmpOuterTradeNo,
  920. 'total_amount' => $payMoney,
  921. 'passback_params' => $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', $orderIds),
  922. ];
  923. $aliPayConfigData = [
  924. 'appid' => $payment['appid'],
  925. 'rsaPrivateKey' => $payment['rsaPrivateKey'],
  926. 'alipayrsaPublicKey' => $payment['alipayrsaPublicKey'],
  927. ];
  928. $objAliPay = new aliPay($aliPayConfigData['appid'], $aliPayConfigData['rsaPrivateKey'], $aliPayConfigData['alipayrsaPublicKey']);
  929. $payParams = $objAliPay->appPay($payOrderData);
  930. break;
  931. case in_array(StatusCode::$payType['wxPay'], $payType):
  932. //wx
  933. /********************生成小程序唤起支付用到的参数(原配置)*****/
  934. /**$weixinConfigData = Factory::config()->get('weixin');
  935. * if (empty($weixinConfigData)) {
  936. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  937. * }*/
  938. // 获取当前登录企业的小程序配置
  939. $miniprogramSetting = $objSystemCache->getAppIdByEnterpriseId($this->onlineEnterpriseId);
  940. if (empty($miniprogramSetting)) {
  941. return ResultWrapper::fail('后台小程序配置项为空', ErrorCode::$configEroor);
  942. }
  943. $miniprogramSetting = json_decode($miniprogramSetting, true);//获取小程序appid
  944. // 获取配置文件微信公众号
  945. $weixinConfigData = Factory::config()->getAppoint('weixin', 'offiaccount');
  946. switch ($params['source']) {
  947. case StatusCode::$source['weiXinBrowser'];
  948. if (empty($weixinConfigData)) {
  949. return ResultWrapper::fail('微信公众号配置错误', ErrorCode::$configEroor);
  950. }
  951. $appid = $weixinConfigData['appid'];
  952. $paySource = 'weiXinBrowser';
  953. break;
  954. case StatusCode::$source['H5'];
  955. if (empty($weixinConfigData)) {
  956. return ResultWrapper::fail('微信公众号配置错误', ErrorCode::$configEroor);
  957. }
  958. $appid = $weixinConfigData['appid'];
  959. $paySource = 'H5';
  960. break;
  961. case StatusCode::$source['miniProgram'];
  962. $appid = $miniprogramSetting['appid'];
  963. $paySource = 'miniProgram';
  964. break;
  965. default :
  966. $appid = $payment['mobileAppid'];
  967. $paySource = 'APP';
  968. break;
  969. }
  970. $weixinConfigData = [
  971. 'mch_id' => $payment['mchId'],
  972. 'apiPartnerKey' => $payment['apiPartnerKey'],
  973. 'appid' => $appid
  974. ];
  975. $attach = $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', $orderIds);
  976. //$objPay = new Pay($appid, $weixinConfigData['pay']['mch_id'], $weixinConfigData['pay']['apiPartnerKey']);//old
  977. //判断是否是子商户,优先选择子商户
  978. if(isset($payment['sub_mch_id']) && !empty($payment['sub_mch_id']) && $payMoney['mch_type'] == 2 ){
  979. $sub_mch_id = $payment['sub_mch_id'];
  980. $sub_weixinConfigData = Factory::config()->get('weixin');
  981. if (empty($sub_weixinConfigData)) {
  982. return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  983. }
  984. $objPay = new Pay($appid, $sub_weixinConfigData['service_pay']['mch_id'], $sub_weixinConfigData['service_pay']['apiPartnerKey']);
  985. $payParams = $objPay->unifiedorder($tmpOuterTradeNo,$payMoney, $ip, $paySource, '千鸟云商', $params['openId'], $attach,$sub_mch_id);
  986. break;
  987. }
  988. $objPay = new Pay($appid, $weixinConfigData['mch_id'], $weixinConfigData['apiPartnerKey']);
  989. $payParams = $objPay->unifiedorder($tmpOuterTradeNo,$payMoney, $ip, $paySource, '千鸟云商', $params['openId'], $attach);
  990. break;
  991. case in_array(StatusCode::$payType['byte'],$payType):
  992. //字节跳动
  993. $mweb_url = '';
  994. //读取缓存配置
  995. //$objSystemCache->getByteDanceSetting($this->onlineEnterpriseId);
  996. // 获取配置文件字节小程序
  997. $byteDanceConfigData = Factory::config()->getAppoint('byteDance', 'pay');
  998. if (empty($byteDanceConfigData)) {
  999. return ResultWrapper::fail('字节跳动配置错误', ErrorCode::$configEroor);
  1000. }
  1001. $objbytePay = new bytePay($byteDanceConfigData['appid'], $byteDanceConfigData['merchant_id'], $byteDanceConfigData['app_secret']);
  1002. unset($payParams);
  1003. $payParams = $objbytePay->pay($tmpOuterTradeNo, $payMoney, '千鸟云商', $ip, $mweb_url);
  1004. break;
  1005. case in_array(StatusCode::$payType['bankLoans'], $payType):
  1006. foreach ($orderIds as $orderId){
  1007. $orderInfo = $this->objDOrder->get($orderId);
  1008. if($orderInfo == false){
  1009. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1010. }
  1011. }
  1012. // 根据客户id (customerId) 获取 openId
  1013. if(!empty($orderInfo['customerId'])){
  1014. $customerId = $orderInfo['customerId'];
  1015. $objDCustomer = new DCustomer('default');
  1016. $objDCustomer->setTable($objDCustomer->get_Table() . '_' . $this->onlineEnterpriseId);
  1017. $customerData = $objDCustomer->get($customerId);
  1018. if($customerData === false){
  1019. return ResultWrapper::fail($objDCustomer->error(), ErrorCode::$dberror);
  1020. }
  1021. if( empty($customerData) ){
  1022. return ResultWrapper::fail('查找不到该客户数据', ErrorCode::$contentNotExists);
  1023. }
  1024. // 小程序订阅消息
  1025. if (isset($customerData['openId']) && !empty($customerData['openId'])) {
  1026. // 发送小程序订阅消息
  1027. $sendMessageData = [
  1028. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfo['no']], // 订单编号
  1029. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfo['createTime'])], // 下单时间
  1030. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  1031. 'thing7' => ['value' => '银行打款'], // 支付方式
  1032. 'name8' => ['value' => substr($orderInfo['shopName'],0,30)] // 商家名称
  1033. ];
  1034. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  1035. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customerData['openId'], $sendMessageData);
  1036. if (!$result->isSuccess()) {
  1037. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  1038. }
  1039. }
  1040. }
  1041. $payParams = ResultWrapper::success($orderIds);
  1042. break;
  1043. default:
  1044. //TODO
  1045. return ResultWrapper::fail('暂未开放的支付方式',ErrorCode::$paramError);
  1046. break;
  1047. }
  1048. unset($payType[$k]);
  1049. if (!$payParams->isSuccess()) {
  1050. return ResultWrapper::fail($payParams->getData(), $payParams->getErrorCode());
  1051. }
  1052. }
  1053. return ResultWrapper::success($payParams->getData());
  1054. }
  1055. /**
  1056. * Doc: (des="已审核未出库订单,审核驳回")
  1057. * User: XMing
  1058. * Date: 2021/2/25
  1059. * Time: 9:41 上午
  1060. * @param int $orderId
  1061. * @return ResultWrapper
  1062. * @throws \Exception
  1063. */
  1064. public function revokeAudit(int $orderId): ResultWrapper
  1065. {
  1066. $orderIndex = $this->objDOrderIndex->get($orderId);
  1067. if ($orderIndex === false) {
  1068. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1069. }
  1070. if (empty($orderIndex)) {
  1071. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  1072. }
  1073. $fix = ceil((empty($params['userCenterId']) ? 1 : $params['userCenterId']) / $this->cutTable);
  1074. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1075. $orderData = $this->objDOrder->get($orderId);
  1076. if ($orderData === false){
  1077. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1078. }
  1079. if (empty($orderData)){
  1080. return ResultWrapper::fail('为获取到指定的订单信息',ErrorCode::$paramError);
  1081. }
  1082. if ($orderData['auditStatus'] != StatusCode::$auditStatus['auditPass']){
  1083. return ResultWrapper::fail('订单审核状态异常,不能驳回',ErrorCode::$paramError);
  1084. }
  1085. if ($orderData['outStatus'] != StatusCode::$delete){
  1086. return ResultWrapper::fail('订单已经出库,不能驳回',ErrorCode::$paramError);
  1087. }
  1088. if ($orderData['orderStatus'] == StatusCode::$orderStatus['close']){
  1089. return ResultWrapper::fail('订单已关闭,不嫩驳回',ErrorCode::$paramError);
  1090. }
  1091. $this->objDOrderIndex->beginTransaction();
  1092. $time = time();
  1093. //update order
  1094. $updateOrder = $this->objDOrder->update([
  1095. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1096. 'updateTime' => $time,
  1097. 'revokeTime' => $time
  1098. ],$orderId);
  1099. if ($updateOrder === false){
  1100. $this->objDOrderIndex->rollBack();
  1101. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1102. }
  1103. //update orderIndex
  1104. $updateOrderIndex = $this->objDOrderIndex->update([
  1105. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1106. 'updateTime' => $time
  1107. ],$orderId);
  1108. if ($updateOrderIndex === false){
  1109. $this->objDOrderIndex->rollBack();
  1110. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1111. }
  1112. //update stock
  1113. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  1114. $stockOutResult = $objMInventoryOut->delInventoryOutStatus([
  1115. 'sourceId' => $orderId,
  1116. 'type' => StatusCode::$orderType['saleOut']
  1117. ]);
  1118. if (!$stockOutResult->isSuccess()){
  1119. $this->objDOrderIndex->rollBack();
  1120. return ResultWrapper::fail($stockOutResult->getData(),$stockOutResult->getErrorCode());
  1121. }
  1122. // 删除已生成的收款单
  1123. $objDReceivedIndex = new DReceivedIndex('finance');
  1124. $objDReceivedIndex->setTable('qianniao_received_index_' . $this->onlineEnterpriseId);
  1125. $deleteReceive = $objDReceivedIndex->delete(['sourceId'=>$orderIndex['id']]);
  1126. if ($deleteReceive === false) {
  1127. return ResultWrapper::fail($objDReceivedIndex->error(), ErrorCode::$dberror);
  1128. }
  1129. /*
  1130. //update es
  1131. $_id = self::createEsDocumentId($orderId);
  1132. $this->objDOrder->esupdateTypeFieldVaule([
  1133. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1134. 'updateTime' => $time
  1135. ], $_id);*/
  1136. $this->objDOrderIndex->commit();
  1137. return ResultWrapper::success(true);
  1138. }
  1139. /**
  1140. * Doc: (des="")
  1141. * User: XMing
  1142. * Date: 2021/3/9
  1143. * Time: 5:13 下午
  1144. * @param int $orderId
  1145. * @return ResultWrapper
  1146. * @throws \Exception
  1147. */
  1148. public function reStockOut(int $orderId): ResultWrapper
  1149. {
  1150. // 获取订单索引表数据
  1151. $orderIndex = $this->objDOrderIndex->get($orderId);
  1152. if ($orderIndex === false){
  1153. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1154. }
  1155. if (empty($orderIndex)){
  1156. return ResultWrapper::fail('未获取到指定地订单信息',ErrorCode::$paramError);
  1157. }
  1158. // 获取订单数据
  1159. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1160. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1161. $orderData = $this->objDOrder->get($orderId);
  1162. if ($orderData === false){
  1163. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1164. }
  1165. if (empty($orderData)){
  1166. return ResultWrapper::fail('未获取到指定的订单信息',ErrorCode::$paramError);
  1167. }
  1168. if ($orderData['outStatus'] == StatusCode::$standard){
  1169. return ResultWrapper::fail('订单已经出库,请不要重复出库',ErrorCode::$paramError);
  1170. }
  1171. // 查询销售订单是否还有未审核的出库单,必须先处理完,再生成新的出库单
  1172. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  1173. $condition = [
  1174. 'originId' => $orderData['id'],
  1175. 'deleteStatus' => StatusCode::$standard,
  1176. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1177. ];
  1178. $result = $objMInventoryOut->getInventoryOutData($condition);
  1179. if (!$result->isSuccess()) {
  1180. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  1181. }
  1182. $inventoryOutData = $result->getData();
  1183. if( !empty($inventoryOutData) ){
  1184. return ResultWrapper::fail('当前销售订单还有未审核的出库单,单号:'.StatusCode::$noPrefix[5].'-'.$inventoryOutData[0]['no'].',请先处理完成', ErrorCode::$notAllowAccess);
  1185. }
  1186. // 查询订单商品表数据
  1187. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  1188. $orderGoodsData = $this->objDOrderGoods->select(['orderId' => $orderId,'deleteStatus' => StatusCode::$standard]);
  1189. if ($orderGoodsData === false){
  1190. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  1191. }
  1192. if (empty($orderGoodsData)){
  1193. return ResultWrapper::fail('订单商品获取失败',ErrorCode::$paramError);
  1194. }
  1195. // 组装出库单数据
  1196. $saleOutData = [
  1197. 'sourceId' => $orderData['id'],
  1198. 'sourceNo' => $orderData['no'],
  1199. 'originNo' => $orderData['no'],
  1200. 'originId' => $orderData['id'],
  1201. 'shopId' => $orderData['shopId'],
  1202. 'shopName' => $orderData['shopName'],
  1203. 'amount' => $orderData['payAmount'],
  1204. 'operatorId' => $orderData['auditId'],//操作人id
  1205. 'operatorName' => $orderData['audit'],//操作人信息
  1206. 'customerId' => $orderData['customerId'],
  1207. 'customerName' => $orderData['customerName'],
  1208. 'customerCode' => createCode(StatusCode::$code['customer']['prefix'], $orderData['customerId'], StatusCode::$code['customer']['length']),
  1209. 'customerMobile' => $orderData['customerMobile'],
  1210. 'source' => StatusCode::$orderType['saleOrder'], //订单来源(出库类型)
  1211. 'type' => StatusCode::$orderType['saleOut'],
  1212. 'deliveryType' => $orderData['deliveryType'],//配送方式
  1213. 'remark' => $orderData['remark'],
  1214. ];
  1215. $saleOutData['materielNum'] = 0;
  1216. //获取sku
  1217. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  1218. $skuIds = array_column(array_values($orderGoodsData), 'skuId');
  1219. $modelResult = $objMSku->getSkuDataBySkuIds($skuIds);
  1220. if (!$modelResult->isSuccess()) {
  1221. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1222. }
  1223. $skuData = $modelResult->getData();
  1224. unset($modelResult);
  1225. foreach ($orderGoodsData as $key => $value) {
  1226. if ($value['outOfNum'] > 0 && $value['isEq'] == StatusCode::$delete){
  1227. $saleOutData['materielNum']++;
  1228. $totalMoney = bcsub(bcsub($value['totalMoney'], $value['vipDiscount']), $value['preferential']);//销售总价 !优惠后
  1229. $saleOutData['orderGoodsData'][] = [
  1230. 'materielId' => $value['goodsBasicId'],
  1231. 'materielName' => $value['goodsName'],
  1232. 'materielCode' => createCode(StatusCode::$code['goodsBasic']['prefix'], $value['goodsBasicId'], StatusCode::$code['goodsBasic']['length']),
  1233. 'skuId' => $value['skuId'],
  1234. 'num' => $value['outOfNum'],
  1235. 'otherNum' => $value['otherNum'],
  1236. 'outNum' => 0,
  1237. 'total' => $value['outOfNum'],
  1238. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  1239. 'skuName' => isset($skuData[$value['skuId']]) ? $skuData[$value['skuId']]['skuName'] : '',
  1240. 'unitPrice' => $value['price'],//单价 不优惠
  1241. 'totalPrice' => $totalMoney,//销售总价 !优惠后
  1242. ];
  1243. }
  1244. }
  1245. if (empty($saleOutData['orderGoodsData'])){
  1246. return ResultWrapper::fail('此订单没有需要出库的商品',ErrorCode::$paramError);
  1247. }
  1248. // 新增出库单
  1249. $dbResult = $objMInventoryOut->addInventoryOut($saleOutData);
  1250. if (!$dbResult->isSuccess()){
  1251. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  1252. }
  1253. return ResultWrapper::success($dbResult->getData());
  1254. }
  1255. /**
  1256. * Doc: (des="")
  1257. * User: XMing
  1258. * Date: 2021/3/18
  1259. * Time: 6:55 下午
  1260. * @param int $orderId
  1261. * @return ResultWrapper
  1262. * @throws \Exception
  1263. */
  1264. public function retAmount(int $orderId)
  1265. {
  1266. $message = '退款成功';
  1267. // 从订单索引表查询订单数据
  1268. $orderIndex = $this->objDOrderIndex->get($orderId);
  1269. if ($orderIndex === false){
  1270. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1271. }
  1272. if (empty($orderIndex)){
  1273. return ResultWrapper::fail('未获取到订单数据',ErrorCode::$paramError);
  1274. }
  1275. // 从订单和订单商品查询订单数据
  1276. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1277. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  1278. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  1279. $order = $this->objDOrder->get($orderId);
  1280. if ($order === false){
  1281. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  1282. }
  1283. if ( empty($order) ){
  1284. return ResultWrapper::fail('未获取到指定订单信息',ErrorCode::$paramError);
  1285. }
  1286. $sql = 'SELECT * FROM qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix.' WHERE orderId = '.$orderId.' AND deleteStatus = '.StatusCode::$standard.' AND outOfNum > 0';
  1287. $rows = $this->objDOrderGoods->query($sql);
  1288. if ($rows === false){
  1289. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  1290. }
  1291. if (empty($rows)){
  1292. return ResultWrapper::fail('未获取到指定订单的商品信息',ErrorCode::$paramError);
  1293. }
  1294. // 根据实际订单未出库数量计算退款金额
  1295. $receiveMoney = 0;
  1296. foreach ($rows as $row){
  1297. if ($row['outOfNum'] <= 0) continue;
  1298. $receiveMoney = bcadd($receiveMoney,bcmul($row['price'],$row['outOfNum'], 4),4);
  1299. }
  1300. // 保留4位判断金额是否异常
  1301. if ($receiveMoney <= 0){
  1302. return ResultWrapper::fail('退款金额异常',ErrorCode::$paramError);
  1303. }
  1304. $receiveMoney = bcadd($receiveMoney, '0', 2); // 实际退款保留两位
  1305. $status = $this->objDOrder->beginTransaction();
  1306. $payType = explode(',', $orderIndex['payType']);
  1307. // 未支付订单不生成退款单
  1308. if( $order['payStatus'] == StatusCode::$standard){
  1309. // 小于1分钱不做退款处理
  1310. if ($receiveMoney >= 0.01){
  1311. // 根据订单支付方式规划退款账户
  1312. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  1313. // 包含余额组合支付方式统一返回余额,其他原路返回
  1314. if( in_array(StatusCode::$payType['balance'],$payType) ){
  1315. $financeAccountData = $objMAccount->getDefaultAccount(StatusCode::$payType['balance']);
  1316. }else if( in_array(StatusCode::$payType['bankLoans'],$payType) ){
  1317. $extends = json_decode($order['extends'], true);
  1318. if( isset($extends['bankData']['id']) && !empty($extends['bankData']['id'])){
  1319. $accountId = $extends['bankData']['id'];
  1320. //获取银行打款账户信息
  1321. $financeAccountData = $objMAccount->getAccountInfo($accountId);
  1322. }else{
  1323. $financeAccountData = ResultWrapper::fail('获取打款账户错误');
  1324. }
  1325. } else{
  1326. $financeAccountData = $objMAccount->getDefaultAccount($payType);
  1327. }
  1328. if(!$financeAccountData->isSuccess()){
  1329. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  1330. }
  1331. $financeAccountData = $financeAccountData->getData();
  1332. //记录负应收的id
  1333. //$financeRefundData['offsetId'] = (int)$addReceiveResult->getData();
  1334. // 生成财务退款单
  1335. $financeRefundData = [
  1336. 'originId' => getArrayItem($order,'id',0),
  1337. 'originNo' => getArrayItem($order,'no',''),
  1338. 'sourceId' => getArrayItem($order,'id',0),
  1339. 'sourceNo' => getArrayItem($order,'no',''),
  1340. 'refundTime' => time(),
  1341. 'createTime' => time(),
  1342. 'unitId' => getArrayItem($order,'customerId',0),
  1343. 'unitName' => getArrayItem($order,'customerName',0),
  1344. 'currentAccountName' => getArrayItem($order,'customerName',''),
  1345. 'financeType' => '订单完结退款',
  1346. 'financeTypeId' => 1,
  1347. 'payType' =>getArrayItem($order,'payType',''),
  1348. 'shopId' => getArrayItem($order,'shopId',0),
  1349. 'shopName' => getArrayItem($order,'shopName',0),
  1350. 'money' => $receiveMoney,
  1351. 'operatorId' => $this->onlineUserId,
  1352. 'type' => StatusCode::$standard,
  1353. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1354. 'remark' => '订单一键完结,订单编号:'. getArrayItem($order,'no','').'完结后需退款金额:'.$receiveMoney
  1355. ];
  1356. $financeRefundData['accountList'] = [
  1357. [
  1358. 'accountId' => $financeAccountData['id'],
  1359. 'accountNumber' => $financeAccountData['accountNumber'],
  1360. 'accountName' => $financeAccountData['name'],
  1361. 'money' => $receiveMoney,
  1362. ]
  1363. ];
  1364. $objMRefund = new MRefund($this->onlineEnterpriseId,$this->onlineUserId);
  1365. $result = $objMRefund->addRefund($financeRefundData);
  1366. if(!$result->isSuccess()){
  1367. $this->objDOrder->rollBack();
  1368. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  1369. }
  1370. // 应收自动审核队列
  1371. //Factory::cache('finance')->zadd('salesOutReceive::'.$this->onlineEnterpriseId, time(), $addReceiveResult->getData());
  1372. }else{
  1373. $message = '退款金额少于0.01,不做退款处理,退款成功';
  1374. }
  1375. }
  1376. $updateIndexData = [
  1377. 'updateTime' => time(),
  1378. 'isRet' => StatusCode::$standard,
  1379. ];
  1380. $updateOrderIndex = $this->objDOrderIndex->update($updateIndexData, $orderId);
  1381. if ($updateOrderIndex === false){
  1382. $this->objDOrder->rollBack();
  1383. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1384. }
  1385. $update = [
  1386. 'updateTime' => time(),
  1387. 'retTime' => time(),
  1388. 'retMoney' => $receiveMoney,
  1389. 'isRet' => StatusCode::$standard,
  1390. ];
  1391. $updateOrder = $this->objDOrder->update($update,$orderId);
  1392. if ($updateOrder === false){
  1393. $this->objDOrder->rollBack();
  1394. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  1395. }
  1396. //订单解锁
  1397. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  1398. $unlockResult = $objMInventory->unlockInventory([$orderId], StatusCode::$orderType['saleOrder'], $orderIndex['createTime']);
  1399. if (!$unlockResult->isSuccess()) {
  1400. $this->objDOrder->rollBack();
  1401. return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  1402. }
  1403. $status && $this->objDOrder->commit();
  1404. return ResultWrapper::success($message);
  1405. }
  1406. /**
  1407. * Doc: (des="创建分销")
  1408. * User: XMing
  1409. * Date: 2020/7/29
  1410. * Time: 6:41 下午
  1411. * @param string $token
  1412. * @param string $auth
  1413. * @param int $customerId
  1414. * @param int $orderId
  1415. */
  1416. private function taskCreateCommission(string $token, string $auth, int $customerId, int $orderId)
  1417. {
  1418. $i = 1;
  1419. do {
  1420. $postData = [
  1421. 'topicName' => 'MyJob',
  1422. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  1423. 'topicMethon' => 'push',
  1424. 'topicMethonParams' => [
  1425. 'Authorization' => $auth,
  1426. 'Token' => $token,
  1427. 'orderId' => $orderId,
  1428. 'customerId' => $customerId,
  1429. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  1430. ],
  1431. ];
  1432. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  1433. $result = request($url, $postData);
  1434. $i++;
  1435. } while ($result['httpcode'] != 200 && $i <= 3);
  1436. Logger::logs(E_USER_ERROR, '投递任务成功', __CLASS__, __LINE__, $postData);
  1437. }
  1438. /**
  1439. * Doc: (des="修改订单的退货状态")
  1440. * User: XMing
  1441. * Date: 2020/7/14
  1442. * Time: 3:54 下午
  1443. * @param $params
  1444. * @return ResultWrapper
  1445. * @throws \Exception
  1446. */
  1447. public function editOrder($params)
  1448. {
  1449. if (empty($params['id'])) {
  1450. return ResultWrapper::fail('没有订单id', ErrorCode::$paramError);
  1451. }
  1452. $id = $params['id'];
  1453. unset($params['id']);
  1454. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1455. $orderIndex = $this->objDOrderIndex->get(['id' => $id], 'userCenterId');
  1456. if ($orderIndex === false) {
  1457. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1458. }
  1459. $this->objDOrderIndex->beginTransaction();
  1460. $updateResult = $this->objDOrderIndex->update([
  1461. 'updateTime' => $params['updateTime'],
  1462. 'returnStatus' => $params['returnStatus'],
  1463. ], ['id' => $id]);
  1464. if ($updateResult === false) {
  1465. $this->objDOrderIndex->rollBack();
  1466. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1467. }
  1468. $tableNum = ceil($orderIndex['userCenterId'] / $this->cutTable);
  1469. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $tableNum);
  1470. $dbResult = $this->objDOrder->update([
  1471. 'updateTime' => $params['updateTime'],
  1472. 'returnStatus' => $params['returnStatus'],
  1473. ], $id);
  1474. if ($dbResult === false) {
  1475. $this->objDOrderIndex->rollBack();
  1476. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1477. }
  1478. $this->objDOrderIndex->commit();
  1479. /*//修改es数据
  1480. $_id = self::createEsDocumentId($id);
  1481. $this->objDOrder->esupdateTypeFieldVaule(['returnStatus' => $params['returnStatus'], 'updateTime' => $params['updateTime']], $_id);*/
  1482. return ResultWrapper::success($dbResult);
  1483. }
  1484. /**
  1485. * 更新ES
  1486. * @param $orderId
  1487. * @param $order
  1488. * @param $addressData
  1489. * @param $addOrderGoodsName
  1490. * @param int $userCenterId
  1491. */
  1492. public function updateEsData($orderId, $order, $addressData, $addOrderGoodsName, $userCenterId = 0)
  1493. {
  1494. $orderEsData = [
  1495. /*订单表信息*/
  1496. 'id' => $orderId,//订单编号,
  1497. 'no' => $order['no'],//订单编号,
  1498. 'outerTradeNo' => '',//'外部流水号(支付宝/微信返回的流水号)'
  1499. 'shopId' => $order['shopId'],
  1500. 'shopName' => $order['shopName'],
  1501. 'enterpriseId' => $this->onlineEnterpriseId,
  1502. 'userCenterId' => $userCenterId != 0 ? $userCenterId : $this->onlineUserId,
  1503. 'totalMoney' => $order['totalMoney'],
  1504. 'payAmount' => $order['payAmount'],
  1505. 'buyTotal' => isset($order['buyTotal']) ? $order['buyTotal'] : 0,//购买总数
  1506. 'customerName' => $order['customerName'],//客户姓名
  1507. 'customerId' => $order['customerId'],//客户id
  1508. 'customerType' => isset($order['customerType']) ? $order['customerType'] : 0,//客户类型
  1509. 'payStatus' => StatusCode::$delete,//'支付状态 默认4 未支付 5已支付'
  1510. 'orderStatus' => StatusCode::$orderStatus['waitPay'],//订单状态 默认1 创建 2待支付 3代发货 4待收货 5已完成 6已关闭
  1511. 'payType' => $order['payType'],//'支付方式 1微信 2支付宝 3货到付款 4上门自提'
  1512. 'deliveryType' => $order['deliveryType'],//'配送方式 1商品配送 2上门自提'
  1513. 'source' => $order['source'],//订单来源 默认1 ios 2android 3小程序 4后台创建
  1514. 'remark' => $order['remark'],//订单备注
  1515. 'auditStatus' => $order['auditStatus'],// '审核状态 默认1 待审 2审核通过 3 审核未通过 4 审核中'
  1516. //'payTime' => '',//'付款时间'
  1517. 'createTime' => $order['createTime'],//'创建时间'
  1518. 'updateTime' => $order['updateTime'],//'修改时间',
  1519. 'salesManId' => isset($order['salesManId']) ? $order['salesManId'] : 0,
  1520. 'salesManName' => isset($order['salesManName']) ? $order['salesManName'] : '',
  1521. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  1522. 'outStatus' => StatusCode::$delete,
  1523. 'verifyCode' => $order['verifyCode'],//核销码
  1524. /*收货人信息*/
  1525. 'realName' => isset($addressData['realName']) ? $addressData['realName'] : '',//收货人姓名
  1526. 'mobile' => isset($addressData['mobile']) ? $addressData['mobile'] : '',//收货人电话
  1527. 'address' => isset($addressData['address']) ? $addressData['address'] : '',//收货详细地址
  1528. 'provinceCode' => isset($addressData['provinceCode']) ? $addressData['provinceCode'] : '',//收货人省份编码
  1529. 'cityCode' => isset($addressData['cityCode']) ? $addressData['cityCode'] : '',//收货人城市编码
  1530. 'districtCode' => isset($addressData['districtCode']) ? $addressData['districtCode'] : '',//收货人区编码
  1531. /*优惠信息*/
  1532. 'preferential' => $order['preferential'],//优惠券优惠金额
  1533. 'vipDiscount' => $order['vipDiscount'],//会员卡优惠金额
  1534. 'vipDoubleDiscount' => $order['vipDoubleDiscount'],//会员卡折上折优惠金额
  1535. /*商品信息*/
  1536. 'goodsName' => $addOrderGoodsName,
  1537. 'orderType' => isset($order['orderType']) ? $order['orderType'] : StatusCode::$orderType['salesSlip'],
  1538. ];
  1539. isset($order['salesManName']) && $orderEsData['salesManName'] = $order['salesManName'];
  1540. $_id = self::createEsDocumentId($orderId);
  1541. $result = $this->objDOrder->addUpSearchIndexDocument($orderEsData, $_id);
  1542. if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  1543. //echo "es操作成功";
  1544. //return;
  1545. }
  1546. //echo "es操作失败";
  1547. }
  1548. /**
  1549. * 创建文档id
  1550. *
  1551. * @param $orderId
  1552. * @return string
  1553. */
  1554. private function createEsDocumentId($orderId)
  1555. {
  1556. return 'EnterpriseId_' . $this->onlineEnterpriseId . '_OrderId_' . $orderId;
  1557. }
  1558. /**
  1559. * Doc: (des="获取订单创建时间,用于其它业务计算分表使用")
  1560. * User: XMing
  1561. * Date: 2020/12/25
  1562. * Time: 2:16 下午
  1563. * @param $orderId
  1564. * @return ResultWrapper
  1565. * @throws \Exception
  1566. */
  1567. public function getOrderCreateTime($orderId)
  1568. {
  1569. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1570. $orderIndexRes = $this->objDOrderIndex->get_by('id', $orderId);
  1571. if ($orderIndexRes === false) {
  1572. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1573. }
  1574. if (empty($orderIndexRes)) {
  1575. return ResultWrapper::fail('未找到订单信息', ErrorCode::$paramError);
  1576. }
  1577. return ResultWrapper::success($orderIndexRes);
  1578. }
  1579. /**
  1580. * Doc: (des="获取订单详情")
  1581. * User: XMing
  1582. * Date: 2020/7/14
  1583. * Time: 6:25 下午
  1584. * @param $id
  1585. * @return ResultWrapper
  1586. * @throws \Exception
  1587. */
  1588. public function getOrderInfoById($id): ResultWrapper
  1589. {
  1590. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  1591. $orderIndexRes = $this->objDOrderIndex->get_by('id', $id);
  1592. if ($orderIndexRes === false) {
  1593. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1594. }
  1595. if (empty($orderIndexRes)) {
  1596. return ResultWrapper::fail('未找到订单信息', ErrorCode::$paramError);
  1597. }
  1598. //切换分表
  1599. self::orderSubTable($this->onlineEnterpriseId, $orderIndexRes['userCenterId']);
  1600. $dbResult = $this->objDOrder->get_by('id', $id);
  1601. if ($dbResult === false) {
  1602. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1603. }
  1604. $formatData = self::format($dbResult);
  1605. if (!$formatData->isSuccess()){
  1606. return ResultWrapper::fail($formatData->getData(),$formatData->getErrorCode());
  1607. }
  1608. $dbResult = $formatData->getData();
  1609. //添加订单打印的数据
  1610. $printResult = self::printInfo($dbResult);
  1611. if (!$printResult->isSuccess()){
  1612. return ResultWrapper::fail($printResult->getData(),$printResult->getErrorCode());
  1613. }
  1614. $dbResult = $printResult->getData();
  1615. //logisticsData
  1616. $dbResult['logisticsData'] = json_decode($dbResult['logisticsData'],true);
  1617. // 查询订单退货对应退货单的状态
  1618. if($dbResult['returnStatus']){
  1619. $objMOrderReturn = new MOrderReturn($this->onlineEnterpriseId, $this->onlineUserId);
  1620. $result = $objMOrderReturn->getAuditStatusByOrderId($id);
  1621. $dbResult['returnAuditStatus'] = StatusCode::$auditStatus['auditing'];
  1622. if($result->isSuccess()){
  1623. $dbResult['returnAuditStatus'] = $result->getData();
  1624. }
  1625. }
  1626. return ResultWrapper::success($dbResult);
  1627. }
  1628. /**
  1629. * 补充打印订单字段信息
  1630. *
  1631. * @param $dbResult
  1632. * @return ResultWrapper
  1633. * @throws \Exception
  1634. */
  1635. public function printInfo($dbResult)
  1636. {
  1637. if ($dbResult['source'] == StatusCode::$source['manage']){
  1638. $dbResult['receivable'] = $dbResult['totalMoney'];//应收
  1639. }else{
  1640. $dbResult['receivable'] = $dbResult['payAmount'];//应收
  1641. }
  1642. if ($dbResult['payType'] == StatusCode::$payType['cashPay']
  1643. || $dbResult['payType'] == StatusCode::$payType['bankLoans']
  1644. ) {
  1645. //货到付款 已支付 = payAmount金额
  1646. if ($dbResult['source'] == StatusCode::$source['manage']){
  1647. $dbResult['netReceipts'] = isset($dbResult['receivedMoney']) ? $dbResult['receivedMoney'] : 0;
  1648. }else{
  1649. if ($dbResult['payStatus'] == StatusCode::$standard) {
  1650. $dbResult['netReceipts'] = $dbResult['payAmount'];//实收
  1651. } else {
  1652. $dbResult['netReceipts'] = 0;//实收
  1653. }
  1654. }
  1655. } else {
  1656. //在线支付 已支付 = payAmount金额
  1657. if ($dbResult['payStatus'] == StatusCode::$standard) {
  1658. $dbResult['netReceipts'] = $dbResult['payAmount'];//实收
  1659. } else {
  1660. $dbResult['netReceipts'] = 0;//实收
  1661. }
  1662. }
  1663. $dbResult['currentShortage'] = bcsub($dbResult['receivable'], $dbResult['netReceipts'], 2);//本单欠
  1664. $dbResult['upOwe'] = $dbResult['customerOwe'];//上欠
  1665. $dbResult['totalDeficit'] = bcadd($dbResult['currentShortage'], $dbResult['upOwe'], 2);
  1666. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  1667. $shopData = $objMShop->getShopInfo(['id' => $dbResult['shopId']]);
  1668. if (!$shopData->isSuccess()) {
  1669. return ResultWrapper::fail($shopData->getData(),$shopData->getErrorCode());
  1670. } else {
  1671. $shopData = $shopData->getData();
  1672. }
  1673. $dbResult['shopAddress'] = isset($shopData['area']) ? $shopData['area'] : [];
  1674. $dbResult['shopMobile'] = isset($shopData['mobile']) ? $shopData['mobile'] : '';
  1675. $dbResult['shopDescribe'] = isset($shopData['describe']) ? $shopData['describe'] : '';
  1676. $dbResult['partnerPhone'] = isset($shopData['mobile']) ? $shopData['mobile'] : '';//合伙人联系电弧
  1677. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  1678. $accountName = '';
  1679. if ($dbResult['payType'] == StatusCode::$payType['wxPay'] || $dbResult['payType'] == StatusCode::$payType['aliPay']){
  1680. $accountResult = $objMAccount->getDefaultAccount($dbResult['payType']);
  1681. if (!$accountResult->isSuccess()){
  1682. return ResultWrapper::fail($accountResult->getData(),$accountResult->getErrorCode());
  1683. }
  1684. $account = $accountResult->getData();
  1685. $accountName = isset($account['name']) ? $account['name'] : '';
  1686. }else{
  1687. $account = isset($dbResult['accountList']) ? array_shift($dbResult['accountList']) : [];
  1688. $accountName = isset($account['accountName']) ? $account['accountName'] : '';
  1689. }
  1690. $dbResult['accountName'] = $accountName;//收款账户
  1691. $pbjMPrintNum = new MPrintNum($this->onlineEnterpriseId);
  1692. $dbResult['printingNum'] = $pbjMPrintNum->getObjectPrintNum($dbResult['no'], $dbResult['orderType']);
  1693. return ResultWrapper::success($dbResult);
  1694. }
  1695. /**
  1696. * 检索导出(ES)
  1697. *
  1698. * @param $dsl
  1699. * @return ResultWrapper
  1700. * @throws \Exception
  1701. */
  1702. private function exportSearch($dsl)
  1703. {
  1704. $result = $this->objDOrder->getScrollSearchQueryDsl($dsl);
  1705. if (isset($result['status']) && $result['status'] == 400) {
  1706. return ResultWrapper::fail('获取数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  1707. }
  1708. if (!isset($result['hits']) && $result['hits']['total'] == 0) {
  1709. return ResultWrapper::fail('导出数据为空' . $result['error']['reason'], ErrorCode::$apiNotResult);
  1710. }
  1711. $dbResult = $result['hits']['hits'];
  1712. $list = [];
  1713. foreach ($dbResult as $key => &$value) {
  1714. $data = [];
  1715. $data = $value['_source'];
  1716. $list[] = $data;
  1717. }
  1718. self::exportOrder($list, 'es');
  1719. }
  1720. /**
  1721. * 导出方法
  1722. *
  1723. * @param $allOrderData
  1724. */
  1725. private static function export($allOrderData)
  1726. {
  1727. //导出到本地
  1728. header("Content-type:application/vnd.ms-excel");
  1729. header("Content-Disposition:filename=订单记录.csv");
  1730. header('Cache-Control: max-age=0');
  1731. $fp = fopen('php://output', 'a');
  1732. $head = ['ID', '订单编号', '下单时间', '客户名称', '收货人', '业务员', '联系电话', '订单金额', '订单状态', '收款状态', '配送方式', '订单来源', '订单审核']; //定义标题
  1733. foreach ($head as $i => $v) {
  1734. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  1735. }
  1736. fputcsv($fp, $head);
  1737. $limit = 10000;
  1738. $num = 0;//计数器
  1739. foreach ($allOrderData as $v) {
  1740. //循环数据
  1741. $num++;
  1742. if ($num == $limit) {
  1743. ob_flush();//释放内存
  1744. flush();
  1745. }
  1746. $rows['id'] = $v['id'];
  1747. $rows['no'] = $v['no'];
  1748. $rows['createTime'] = date('Y-m-d H:i:s', $v['createTime']);
  1749. $rows['customerName'] = $v['customerName'];
  1750. $rows['realName'] = $v['realName'];
  1751. $rows['salesManName'] = $v['salesManName'];
  1752. $rows['mobile'] = $v['mobile'];
  1753. $rows['payAmount'] = $v['payAmount'];
  1754. $rows['orderStatus'] = StatusCode::$orderStatus[$v['orderStatus']];
  1755. $rows['payStatus'] = StatusCode::$standard == $v['payStatus'] ? '已支付' : '未支付';
  1756. $rows['deliveryType'] = ($v['deliveryType'] != StatusCode::$deliveryType['goodsDelivery'] && $v['deliveryType'] != StatusCode::$deliveryType['selfMention']) ? '' : StatusCode::$deliveryType[$v['deliveryType']];
  1757. $rows['source'] = StatusCode::$source[$v['source']];
  1758. $rows['auditStatus'] = StatusCode::$auditStatus[$v['auditStatus']];
  1759. foreach ($rows as $kk => $vv) {
  1760. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  1761. }
  1762. fputcsv($fp, $rs);
  1763. $rows = [];
  1764. }
  1765. exit;
  1766. }
  1767. /**
  1768. * 导出列表(数据库)
  1769. *
  1770. * @param string $sql
  1771. * @return ResultWrapper
  1772. * @throws \Exception
  1773. */
  1774. public function exportAllOrder(string $sql)
  1775. {
  1776. $objDOrderIndex = new DOrderIndex();
  1777. $dbResult = $objDOrderIndex->query($sql);
  1778. if ($dbResult === false) {
  1779. return ResultWrapper::fail($objDOrderIndex->error(), ErrorCode::$dberror);
  1780. }
  1781. $allOrderData = [];
  1782. $allGroupData = [];
  1783. foreach ($dbResult as $key => $val) {
  1784. $tableNum = (int)ceil($val['userCenterId'] / $this->cutTable);
  1785. //这里感觉没有必要使用对主索引表的订单id进行分组,可以通过条件直接查询表下的数据
  1786. $allGroupData[$tableNum][] = $val['id'];
  1787. }
  1788. $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';
  1789. foreach ($allGroupData as $k => $orderId) {
  1790. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  1791. $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';
  1792. $dbResult = $this->objDOrder->query($sql);
  1793. if ($dbResult === false) {
  1794. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1795. }
  1796. $allOrderData = array_merge($dbResult, $allOrderData);
  1797. }
  1798. self::export($allOrderData);
  1799. }
  1800. /**
  1801. * Doc: (des="订单导出,构建查询数据")
  1802. * User: XMing
  1803. * Date: 2020/8/22
  1804. * Time: 10:25 上午
  1805. * @param array|string $data
  1806. * @param string $field
  1807. * @return ResultWrapper
  1808. */
  1809. private function buildSelectGroupDataByCondition($data, string $field)
  1810. {
  1811. switch ($field) {
  1812. case 'db':
  1813. $result = self::getAllOrderIdsBySql($data);
  1814. break;
  1815. case 'es':
  1816. $result = self::getAllOrderIdsBySearchResult($data);
  1817. break;
  1818. }
  1819. if (!$result->isSuccess()) {
  1820. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  1821. }
  1822. return ResultWrapper::success($result->getData());
  1823. }
  1824. /**
  1825. * Doc: (des="将es检索数据,进行数据分组转化为统一格式")
  1826. * [[表后缀]=>[订单id,]]
  1827. * User: XMing
  1828. * Date: 2020/8/22
  1829. * Time: 10:15 上午
  1830. * @param array $data
  1831. * @return ResultWrapper
  1832. */
  1833. private function getAllOrderIdsBySearchResult(array $data)
  1834. {
  1835. if (empty($data)) {
  1836. return ResultWrapper::success([]);
  1837. }
  1838. $groupMapRes = self::buildGroupMapByArray((array)$data);
  1839. if (!$groupMapRes->isSuccess()) {
  1840. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1841. }
  1842. return ResultWrapper::success($groupMapRes->getData());
  1843. }
  1844. /**
  1845. * Doc: (des="")
  1846. * User: XMing
  1847. * Date: 2020/8/22
  1848. * Time: 10:18 上午
  1849. * @param array $data
  1850. * @return ResultWrapper
  1851. */
  1852. private function buildGroupMapByArray(array $data)
  1853. {
  1854. if (empty($data)) {
  1855. return ResultWrapper::success([]);
  1856. }
  1857. $allGroupMap = [];
  1858. //对所有数据进行分组,[[表后缀]=>[订单id,]]
  1859. foreach ($data as $key => $val) {
  1860. $tableNum = (int)ceil($val['userCenterId'] / $this->cutTable);
  1861. //这里感觉没有必要使用对主索引表的订单id进行分组,可以通过条件直接查询表下的数据
  1862. $allGroupMap[$tableNum][] = $val['id'];
  1863. }
  1864. return ResultWrapper::success($allGroupMap);
  1865. }
  1866. /**
  1867. * Doc: (des="通过sql,进行数据分组转化为统一格式")
  1868. * [[表后缀]=>[订单id,]]
  1869. * User: XMing
  1870. * Date: 2020/8/22
  1871. * Time: 9:55 上午
  1872. * @param string $sql
  1873. * @return ResultWrapper
  1874. */
  1875. private function getAllOrderIdsBySql(string $sql)
  1876. {
  1877. if (empty($sql)) {
  1878. return ResultWrapper::success([]);
  1879. }
  1880. $list = $this->objDOrderIndex->exportQuery($sql);
  1881. if ($list === false) {
  1882. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  1883. }
  1884. $list = self::getGeneratorData($list);
  1885. if (empty($list)) {
  1886. return ResultWrapper::success([]);
  1887. }
  1888. $groupMapRes = self::buildGroupMapByArray((array)$list);
  1889. if (!$groupMapRes->isSuccess()) {
  1890. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1891. }
  1892. return ResultWrapper::success($groupMapRes->getData());
  1893. }
  1894. /**
  1895. * Doc: (des="获取export查询方法返回的数据集合")
  1896. * User: XMing
  1897. * Date: 2020/8/22
  1898. * Time: 11:42 上午
  1899. * @param $object
  1900. * @return array
  1901. */
  1902. private static function getGeneratorData($object)
  1903. {
  1904. $arrayList = [];
  1905. foreach ($object as $value) {
  1906. $arrayList[] = $value;
  1907. }
  1908. return $arrayList;
  1909. }
  1910. /**
  1911. * Doc: (des="格式化导出数据,统一根据订单id格式化数据")
  1912. * User: XMing
  1913. * Date: 2020/8/22
  1914. * Time: 9:44 上午
  1915. * @param array|string $data
  1916. * @param string $source
  1917. * @return ResultWrapper
  1918. * @throws \Exception
  1919. */
  1920. private function exportOrder($data, string $source)
  1921. {
  1922. if (empty($data)) {
  1923. return ResultWrapper::success([]);
  1924. }
  1925. $groupMapRes = self::buildSelectGroupDataByCondition($data, $source);
  1926. if (!$groupMapRes->isSuccess()) {
  1927. return ResultWrapper::fail($groupMapRes->getData(), $groupMapRes->getErrorCode());
  1928. }
  1929. $groupMap = $groupMapRes->getData();
  1930. if (empty($groupMap)) {
  1931. return ResultWrapper::fail('导出数据构建失败', ErrorCode::$paramError);
  1932. }
  1933. //查询需要导出的数据
  1934. $orderFields = '*';
  1935. $orderReceiveFields = '*';
  1936. $orderGoodsFields = '*';
  1937. $allOrderData = [];//订单集
  1938. $allOrderReceiveData = [];//订单收货地址集
  1939. $allOrderGoodsData = [];//订单商品信息
  1940. foreach ($groupMap as $k => $orderIds) {
  1941. //订单表
  1942. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  1943. $orderResult = $this->objDOrder->exportSelect(['id' => $orderIds], $orderFields, 'createTime desc');//查询订单
  1944. if ($orderResult === false) {
  1945. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  1946. }
  1947. $orderResult = self::getGeneratorData($orderResult);
  1948. //订单收货表
  1949. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $k);
  1950. $orderReceiveResult = $this->objDOrderReceive->exportSelect(['orderId' => $orderIds], $orderReceiveFields, 'createTime desc');//订单收货
  1951. if ($orderReceiveResult === false) {
  1952. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  1953. }
  1954. $orderReceiveResult = self::getGeneratorData($orderReceiveResult);
  1955. //订单商品表
  1956. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $k);
  1957. $orderGoodsResult = $this->objDOrderGoods->exportSelect(['orderId' => $orderIds], $orderGoodsFields, 'createTime desc');
  1958. if ($orderGoodsResult === false) {
  1959. return ResultWrapper::fail($this->objDOrderGoods->error(), ErrorCode::$dberror);
  1960. }
  1961. $orderGoodsResult = self::getGeneratorData($orderGoodsResult);
  1962. //对数据进行合并
  1963. $allOrderData = array_merge($orderResult, $allOrderData);
  1964. $allOrderReceiveData = array_merge($orderReceiveResult, $allOrderReceiveData);
  1965. $allOrderGoodsData = array_merge($orderGoodsResult, $allOrderGoodsData);
  1966. }
  1967. $formatResult = self::formatManageOrderList($allOrderData, $allOrderReceiveData, $allOrderGoodsData);
  1968. if (!$formatResult->isSuccess()) {
  1969. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  1970. }
  1971. $exportData = $formatResult->getData();
  1972. if (empty($exportData)) {
  1973. return ResultWrapper::fail('构建导出数据为空', ErrorCode::$paramError);
  1974. }
  1975. //将数据导出
  1976. self::exportCsv($exportData);
  1977. }
  1978. /**
  1979. * Doc: (des="")
  1980. * User: XMing
  1981. * Date: 2020/8/22
  1982. * Time: 2:24 下午
  1983. * @param array $area
  1984. * @param string $address
  1985. * @return string
  1986. */
  1987. private static function createAddress($area, $address)
  1988. {
  1989. $str = '';
  1990. if (isset($area['provinceName']) && !empty($area['provinceName'])) {
  1991. $str .= $area['provinceName'];
  1992. }
  1993. if (isset($area['cityName']) && !empty($area['cityName'])) {
  1994. $str .= $area['cityName'];
  1995. }
  1996. if (isset($area['districtName']) && !empty($area['districtName'])) {
  1997. $str .= $area['districtName'];
  1998. }
  1999. $str .= $address;
  2000. return $str;
  2001. }
  2002. /**
  2003. * Doc: (des="生成规格名字")
  2004. * User: XMing
  2005. * Date: 2020/8/22
  2006. * Time: 2:47 下午
  2007. * @param array $specGroup
  2008. * @return string
  2009. */
  2010. private static function createSpecName($specGroup)
  2011. {
  2012. if(empty($specGroup)){
  2013. return "无";
  2014. }
  2015. $str = '';
  2016. foreach ($specGroup as $value) {
  2017. empty($str) && $str .= ' ';
  2018. $str .= $value['specName'] . ':';
  2019. $str .= $value['specValueName'];
  2020. }
  2021. return $str;
  2022. }
  2023. /**
  2024. * Doc: (des="将数据导出到表格")
  2025. * User: XMing
  2026. * Date: 2020/8/22
  2027. * Time: 11:09 上午
  2028. * @param array $data
  2029. */
  2030. private function exportCsv(array $data)
  2031. {
  2032. //导出到本地
  2033. header("Content-type:application/vnd.ms-excel");
  2034. header("Content-Disposition:filename=订单记录.csv");
  2035. header('Cache-Control: max-age=0');
  2036. $fp = fopen('php://output', 'a');
  2037. $head = ['ID', '订单编号', '订单金额', '优惠金额', '付款金额', '订单状态', '支付方式', '付款状态','配送方式','订单来源','审核状态','下单时间','客户名称','收货人','收货人电话','收货人地址','所属店铺', '业务员','件数','商品编码','商品名称','单位','属性','数量','销售单价(元)','销售总价'];//定义标题
  2038. foreach ($head as $i => $v) {
  2039. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  2040. }
  2041. fputcsv($fp, $head);
  2042. $limit = 10000;
  2043. $num = 0;//计数器
  2044. $rows = [];
  2045. foreach ($data as $v) {
  2046. //循环数据
  2047. $num++;
  2048. if ($num == $limit) {
  2049. ob_flush();//释放内存
  2050. flush();
  2051. }
  2052. foreach ($v['goodsData'] as $index => $item) {
  2053. self::buildExportData($rows, $v, $item, $index);
  2054. foreach ($rows as $kk => $vv) {
  2055. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  2056. }
  2057. fputcsv($fp, $rs);
  2058. $rows = [];
  2059. }
  2060. }
  2061. exit;
  2062. }
  2063. /**
  2064. * Doc: (des="")
  2065. * User: XMing
  2066. * Date: 2020/8/22
  2067. * Time: 3:28 下午
  2068. * @param array $rows
  2069. * @param array $v
  2070. * @param array $item
  2071. * @param int $index
  2072. */
  2073. private static function buildExportData(&$rows, array $v, array $item, int $index)
  2074. {
  2075. $rows['id'] = '';
  2076. $rows['no'] = '';
  2077. $rows['totalMoney'] = '';
  2078. $rows['subMoney'] = '';
  2079. $rows['payMoney'] = '';
  2080. $rows['orderMsg'] = '';
  2081. $rows['payTypeMsg'] = '';
  2082. $rows['payMsg'] = '';
  2083. $rows['deliveryMsg'] = '';
  2084. $rows['sourceMsg'] = '';
  2085. $rows['auditMsg'] = '';
  2086. $rows['createTime'] = '';
  2087. $rows['customerName'] = '';
  2088. $rows['receiveName'] = '';
  2089. $rows['receiveMobile'] = '';
  2090. $rows['receiveAddress'] = '';
  2091. $rows['shopName'] = '';
  2092. $rows['salesManName'] = '';
  2093. $rows['otherNum'] = '';
  2094. $rows['id'] = $v['id'];
  2095. $rows['no'] = $v['no'];
  2096. $rows['totalMoney'] = $v['totalMoney'];
  2097. $rows['subMoney'] = bcsub($v['payAmount'], $v['totalMoney'], 2);
  2098. $rows['payMoney'] = $v['payAmount'];
  2099. $rows['orderMsg'] = $v['orderMsg'];
  2100. $rows['payTypeMsg'] = $v['payTypeMsg'];
  2101. $rows['payMsg'] = $v['payMsg'];
  2102. $rows['deliveryMsg'] = $v['deliveryMsg'];
  2103. $rows['sourceMsg'] = $v['sourceMsg'];
  2104. $rows['auditMsg'] = $v['auditMsg'];
  2105. $rows['createTime'] = date('Y-m-d H:i:s', $v['createTime']);
  2106. $rows['customerName'] = $v['customerName'];
  2107. $rows['receiveName'] = $v['receiveData']['realName'];
  2108. $rows['receiveMobile'] = $v['receiveData']['mobile'];
  2109. $rows['receiveAddress'] = self::createAddress($v['receiveData']['area'], $v['receiveData']['address']);
  2110. $rows['shopName'] = $v['shopName'];
  2111. $rows['salesManName'] = $v['salesManName'];
  2112. $rows['goodsCode'] = $item['goodsCode'];
  2113. $rows['goodsName'] = $item['goodsName'];
  2114. $rows['unitName'] = $item['unitName'];
  2115. $rows['specName'] = self::createSpecName((isset($item['specGroup']) && !empty($item['specGroup'])) ? json_decode($item['specGroup'], true) : []);
  2116. $rows['buyNum'] = $item['buyNum'];
  2117. $rows['unitPrice'] = $item['price'];
  2118. $rows['totalPrice'] = $item['totalMoney'];
  2119. $rows['otherNum'] = $item['otherNum'];
  2120. }
  2121. /**
  2122. * 获取所有订单
  2123. *
  2124. * @param $selectParams
  2125. * @param $search
  2126. * @param bool $is_export
  2127. * @return ResultWrapper
  2128. * @throws \Exception
  2129. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2130. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2131. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2132. * @finish:已完成 orderStatus = 5 auditPass 2
  2133. * @close:已关闭 orderStatus = 6
  2134. *
  2135. * 新订单列表 {"page":1,"pageSize":10,"search":{"auditStatus":1}}
  2136. * 订单查询 {"page":1,"pageSize":10,"search":{"auditStatus":2}} 订单查询:此页面只展示新订单审核后的订单,订单状态为【待出库】,订单出库后,页面会显示出【确认收货】的按钮,订单在出库管理进行出库后,订单状态为【已出库】,客户或后台操作【确认收货】后,订单状态为【已完成】。
  2137. * 自提订单 {"page":1,"pageSize":10,"search":{"deliveryType":2}}
  2138. * 取消订单 {"page":1,"pageSize":10,"search":{"orderStatus":6}}
  2139. *
  2140. */
  2141. public function getAllOrder($selectParams, $search, $is_export = false)
  2142. {
  2143. $objDOrderIndex = new DOrderIndex();
  2144. $selectParams = array_merge($selectParams, $search);
  2145. // 组装检索sql语句
  2146. $buildSql = self::setOrderStatusSqlAttr($selectParams);
  2147. $sql = $buildSql['sql'];
  2148. if ($is_export === true) self::exportOrder($sql, 'db');//导出数据
  2149. $total = $objDOrderIndex->query($buildSql['countSql']);
  2150. if (isset($selectParams['limit']) && isset($selectParams['offset'])) {
  2151. $sql .= ' limit ' . $selectParams['offset'] . ',' . $selectParams['limit'];
  2152. }
  2153. $dbResult = $objDOrderIndex->query($sql);
  2154. if ($dbResult === false) {
  2155. return ResultWrapper::fail($objDOrderIndex->error(), ErrorCode::$dberror);
  2156. }
  2157. $allOrderData = [];//订单集
  2158. $allOrderReceiveData = [];//订单收货地址集
  2159. $allGroupData = [];
  2160. if (!empty($dbResult)) {
  2161. foreach ($dbResult as $key => $val) {
  2162. $tableNum = ceil($val['userCenterId'] / $this->cutTable);
  2163. $allGroupData[$tableNum][] = $val['id'];
  2164. }
  2165. foreach ($allGroupData as $k => $orderId) {
  2166. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  2167. $dbResult = $this->objDOrder->select(['id' => $orderId], '*', 'createTime desc');//查询订单
  2168. if ($dbResult === false) {
  2169. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2170. }
  2171. //物流信息展示
  2172. if( !empty($dbResult['logisticsData']) ){
  2173. json_decode($dbResult['logisticsData'],true);
  2174. }
  2175. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $k);
  2176. $orderReceiveResult = $this->objDOrderReceive->select(['orderId' => $orderId], '*', 'createTime desc');//订单收货
  2177. if ($orderReceiveResult === false) {
  2178. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  2179. }
  2180. $allOrderData = array_merge($dbResult, $allOrderData);//订单集
  2181. $allOrderReceiveData = array_merge($orderReceiveResult, $allOrderReceiveData);//订单收货地址集
  2182. }
  2183. }
  2184. // 格式化后台订单列表
  2185. $formatResult = self::formatManageOrderList($allOrderData, $allOrderReceiveData);
  2186. if (!$formatResult->isSuccess()) {
  2187. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  2188. }
  2189. $return = [
  2190. 'data' => $formatResult->getData(),
  2191. 'total' => isset($total[0]['total']) ? $total[0]['total'] : 0,
  2192. ];
  2193. return ResultWrapper::success($return);
  2194. }
  2195. /**
  2196. * Doc: (des="获取检索订单数据")
  2197. *订单列表搜索商品名称、商品编码、收货人、电话
  2198. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2199. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2200. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2201. * @finish:已完成 orderStatus = 5 auditPass 2
  2202. * @close:已关闭 orderStatus = 6
  2203. * @param $export
  2204. * @param $selectParams
  2205. */
  2206. public function keywordSearch($selectParams,$export = '')
  2207. {
  2208. // 组装检索sql
  2209. $whereSql = '';
  2210. if(!empty($selectParams['keywordType']) && !empty($selectParams['keyword'])){
  2211. $whereSql = self::assemblySql($selectParams['keywordType'],$selectParams['keyword']);
  2212. }
  2213. $orderTab ='qianniao_order_'.$this->onlineEnterpriseId.'_'.'1';
  2214. $orderGoodsTab ='qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.'1';
  2215. $orderReceive ='qianniao_order_receive_'.$this->onlineEnterpriseId.'_'.'1';
  2216. // 初始化表
  2217. $this->objDOrder->setTable($orderTab);
  2218. $this->objDOrder->setTable($orderGoodsTab);
  2219. $this->objDOrder->setTable($orderReceive);
  2220. $condition = '';
  2221. $limit = '';
  2222. if(!$export){
  2223. if (isset($selectParams['limit']) && isset($selectParams['offset'])) {
  2224. $limit .= ' limit ' . $selectParams['offset'] . ',' . $selectParams['limit'];
  2225. }
  2226. }
  2227. // 时间筛选
  2228. if (isset($selectParams['startTime']) && !empty($selectParams['startTime'])){
  2229. $condition .= ' AND o.createTime BETWEEN '.$selectParams['startTime'].' AND '.$selectParams['endTime'];
  2230. }
  2231. //userCenterId
  2232. if (isset($selectParams['userCenterId']) && !empty($selectParams['userCenterId'])) {
  2233. $condition .= ' and o.userCenterId = ' . $selectParams['userCenterId'];
  2234. }
  2235. //customerId
  2236. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  2237. $condition .= ' and o.customerId = ' . $selectParams['customerId'];
  2238. }
  2239. //shopId
  2240. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  2241. $condition .= ' and o.shopId = ' . $selectParams['shopId'];
  2242. }
  2243. // 付款状态 支付状态 默认4 未支付 5已支付
  2244. if (isset($selectParams['payStatus']) && !empty($selectParams['payStatus'])) {
  2245. $condition .= ' and o.payStatus = ' . $selectParams['payStatus'];
  2246. }
  2247. //支付方式
  2248. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  2249. $condition .= ' and find_in_set('.$selectParams['payType'].',o.payType) ';
  2250. }
  2251. // 客户类型
  2252. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])){
  2253. $condition .= ' AND o.customerType = '.$selectParams['customerType'];
  2254. }
  2255. // 订单来源 订单来源 默认1 ios 2android 3小程序 4后台创建
  2256. if (isset($selectParams['source']) && !empty($selectParams['source'])){
  2257. $condition .= ' AND o.source = '.$selectParams['source'];
  2258. }
  2259. //出库状态
  2260. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  2261. $condition .= ' and o.outStatus = ' . $selectParams['outStatus'];
  2262. }
  2263. //退货状态
  2264. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  2265. if (is_array($selectParams['returnStatus'])) {
  2266. $returnStatusStr = implode(',', $selectParams['returnStatus']);
  2267. $condition .= ' and o.returnStatus in(' . $returnStatusStr . ') ';
  2268. } else {
  2269. $condition .= ' and o.returnStatus = ' . $selectParams['returnStatus'];
  2270. }
  2271. }
  2272. //订单状态
  2273. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  2274. $condition = self::orderStateSql($condition, $selectParams['state']);
  2275. }
  2276. if($export){
  2277. $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 ';
  2278. $orderGoodsData = $this->objDOrder->exportQuery($sql);
  2279. if ($orderGoodsData === false) {
  2280. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2281. }
  2282. $result = self::exportOrderList($orderGoodsData);
  2283. exit;
  2284. }
  2285. $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;
  2286. $dbResult = $this->objDOrder->query($sql);
  2287. if ($dbResult === false) {
  2288. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2289. }
  2290. // 格式化后台订单列表
  2291. $formatResult = self::formatManageOrderList($dbResult,[]);
  2292. if (!$formatResult->isSuccess()) {
  2293. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  2294. }
  2295. $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;
  2296. $total = $this->objDOrder->query($sqlTotal);
  2297. if ($total === false) {
  2298. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2299. }
  2300. $return = [
  2301. 'data' => $formatResult->getData(),
  2302. 'total' => isset($total[0]['total']) ? $total[0]['total'] : 0,
  2303. ];
  2304. return ResultWrapper::success($return);
  2305. }
  2306. /**
  2307. * 获取检索订单数据导出
  2308. * @param $orderListData
  2309. * @return ResultWrapper
  2310. */
  2311. public function exportOrderList($orderListData)
  2312. {
  2313. //导出到本地
  2314. header("Content-type:application/vnd.ms-excel");
  2315. header("Content-Disposition:filename=订单管理.csv");
  2316. header('Cache-Control: max-age=0');
  2317. $fp = fopen('php://output', 'a');
  2318. $head = ['ID', '订单编号', '订单金额', '订单金额', '付款金额', '订单状态', '支付方式', '付款状态','配送方式','订单来源','审核状态','下单时间','客户名称','收货人','收货人电话','收货人地址','所属店铺', '业务员','件数','商品编码','商品名称','单位','属性','数量','销售单价(元)','优惠金额','销售总价'];//定义标题
  2319. foreach ($head as $i => $v) {
  2320. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  2321. }
  2322. fputcsv($fp, $head);
  2323. $limit = 10000;
  2324. $num = 0;//计数器
  2325. foreach ($orderListData as $value) {//循环数据
  2326. $orderReceiveData[]= [
  2327. 'orderId' => $value['id'],
  2328. 'provinceCode' => $value['provinceCode'],
  2329. 'cityCode' => $value['cityCode'],
  2330. 'districtCode' => $value['districtCode'],
  2331. 'allAddress' => $value['allAddress']
  2332. ];
  2333. // 格式化后台订单列表
  2334. $fromatValue = self::formatManageOrderList([$value],$orderReceiveData);
  2335. if (!$fromatValue->isSuccess()) {
  2336. echo($fromatValue->getData());
  2337. exit();
  2338. }
  2339. $fromatValue = array_pop($fromatValue->getData());
  2340. $value = array_merge($value, $fromatValue);
  2341. $num++;
  2342. if ($num == $limit) {
  2343. ob_flush();//释放内存
  2344. flush();
  2345. }
  2346. $rows['id'] = isset($value['id']) ? $value['id'] : null; // ID
  2347. $rows['no'] = isset($value['no']) ? $value['no'] : null; // 订单编号
  2348. $rows['totalMoney'] = isset($value['totalMoney']) ? $value['totalMoney'] : null; // 订单金额
  2349. $rows['subMoney'] = isset($value['payAmount']) && isset($value['totalMoney']) ? bcsub($value['payAmount'], $value['totalMoney'], 2): 0; // 订单金额
  2350. $rows['payAmount'] = isset($value['payAmount']) ? $value['payAmount'] : null; // 付款金额
  2351. $rows['orderMsg'] = isset($value['orderMsg']) ? $value['orderMsg'] : null; // 订单状态
  2352. $rows['payTypeMsg'] = isset($value['payTypeMsg']) ? $value['payTypeMsg'] : null; // 支付方式
  2353. $rows['payMsg'] = isset($value['payMsg']) ? $value['payMsg'] : null; // 付款状态
  2354. $rows['deliveryMsg'] = isset($value['deliveryMsg']) ? $value['deliveryMsg'] : null; // 配送方式
  2355. $rows['sourceMsg'] = isset($value['sourceMsg']) ? $value['sourceMsg'] : null; // 订单来源
  2356. $rows['auditMsg'] = isset($value['auditMsg']) ? $value['auditMsg'] : null; // 审核状态
  2357. $rows['createTime'] = isset( $value['createTime']) ? date('Y-m-d H:i:s', $value['createTime']) : null; // 下单时间
  2358. $rows['customerName'] = isset($value['customerName']) ? $value['customerName'] : null; // 客户名称
  2359. $rows['receiveName'] = isset($value['realName']) ? $value['realName']: null; // 收货人
  2360. $rows['receiveMobile'] = isset($value['mobile']) ? $value['mobile'] : null; // 收货人电话
  2361. $rows['receiveAddress'] = isset($value['receiveData']['allAddress']) ? $value['receiveData']['allAddress'] : null;// '收货人地址'
  2362. $rows['shopName'] = isset($value['shopName']) ? $value['shopName'] : null; // ,'所属店铺',
  2363. $rows['salesManName'] = isset($value['salesManName']) ? $value['salesManName'] : null; // '业务员'
  2364. $rows['otherNum'] = getArrayItem($value, 'otherNum', 0); //件数
  2365. $rows['goodsCode'] = getArrayItem($value, 'goodsCode'); // '商品编码'
  2366. $rows['goodsName'] = getArrayItem($value, 'goodsName'); // '商品名称
  2367. $rows['unitName'] = getArrayItem($value, 'unitName'); // 单位
  2368. $rows['specName'] = self::createSpecName((isset($value['specGroup']) && !empty($value['specGroup'])) ? json_decode($value['specGroup'], true) : []);
  2369. $rows['buyNum'] = getArrayItem($value, 'buyNum', 0);
  2370. $rows['unitPrice'] = getArrayItem($value, 'price', 0);
  2371. $rows['preferential'] = getArrayItem($value, 'preferential', 0);
  2372. $rows['totalPrice'] = getArrayItem($value, 'totalMoney', 0); // '销售单价(元)'
  2373. foreach ($rows as $kk => $vv) {
  2374. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  2375. }
  2376. fputcsv($fp, $rs);
  2377. $rows = [];
  2378. }
  2379. }
  2380. /**
  2381. * 根据订单列表 keywordType 拼装sql
  2382. * @param $keywordType
  2383. * @param $keyword
  2384. */
  2385. public function assemblySql($keywordType,$keyword)
  2386. {
  2387. $whereSql = '';
  2388. switch ($keywordType){
  2389. case 1: // 单据编号 order
  2390. if(strpos($keyword,StatusCode::$noPrefix[1]) !== false){
  2391. $orderNo = explode('-',$keyword);
  2392. $orderNo = $orderNo[1].'-'.$orderNo[2];
  2393. $whereSql .= ' and o.no = "'.$orderNo.'"';
  2394. }else{
  2395. $whereSql .= ' and o.no = "'.$keyword.'"';
  2396. }
  2397. break;
  2398. case 2: // 自提码 order
  2399. $whereSql .= ' and o.verifyCode ="'.$keyword.'"';
  2400. break;
  2401. case 3: // 商品名称 order_goods
  2402. $whereSql .=' and g.goodsName LIKE "%' .$keyword. '%" ';
  2403. break;
  2404. case 4: // 商品编码 order_goods
  2405. $whereSql .=' and g.goodsCode ="'.$keyword.'"';
  2406. break;
  2407. case 5: // 收货人 order_receive
  2408. $whereSql .=' and r.realName LIKE "%' .$keyword. '%" ';
  2409. break;
  2410. case 6: // 电话 order_receive
  2411. $whereSql .=' and r.mobile ="'.$keyword.'"';
  2412. break;
  2413. case 7: // 业务员 order
  2414. $whereSql .=' and o.salesManName LIKE "%' .$keyword. '%" ';
  2415. break;
  2416. case 8: // 详细地址 order_receive
  2417. $whereSql .=' and r.address LIKE "%' .$keyword. '%" ';
  2418. }
  2419. return $whereSql;
  2420. }
  2421. /**
  2422. * Doc: (des="state标示多选sql处理")
  2423. *
  2424. */
  2425. private static function orderStateSql($sql, $states)
  2426. {
  2427. if (is_array($states)) {
  2428. if (in_array('all', $states)) {
  2429. return $sql;
  2430. }
  2431. foreach ($states as $index => $state) {
  2432. $sql .= $index == 0 ? ' and (' . self::orderstate($state) : ' or ' . self::orderstate($state);
  2433. }
  2434. $sql .= ') ';
  2435. } else {
  2436. if ($states == 'all') {
  2437. return $sql;
  2438. }
  2439. $stateSql = self::orderstate($states);
  2440. if (!empty($stateSql)) {
  2441. $sql .= ' and ' . self::orderstate($states);
  2442. }
  2443. }
  2444. return $sql;
  2445. }
  2446. /**
  2447. * Doc: (des="state标示对应sql")
  2448. */
  2449. private static function orderstate($state)
  2450. {
  2451. $sql = '';
  2452. switch ($state) {
  2453. case 'waitAudit'://待审核
  2454. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditing'] . ' and o.orderStatus != ' . StatusCode::$orderStatus['close'] . ')';
  2455. break;
  2456. case 'waitOutStock'://待出库
  2457. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and (o.orderStatus = ' . StatusCode::$orderStatus['waitPay'] . ' or orderStatus = ' . StatusCode::$orderStatus['waitDelivery'] . ')) ';
  2458. break;
  2459. case 'hasOutStock'://已出库
  2460. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and o.orderStatus = ' . StatusCode::$orderStatus['waitReceive'] . ')';
  2461. break;
  2462. case 'finish'://已完成
  2463. $sql .= ' (o.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and o.orderStatus = ' . StatusCode::$orderStatus['finish'] . ')';
  2464. break;
  2465. case 'close'://已关闭
  2466. $sql .= ' (o.orderStatus = ' . StatusCode::$orderStatus['close'] . ')';
  2467. break;
  2468. case 'all'://全部订单
  2469. break;
  2470. }
  2471. return $sql;
  2472. }
  2473. /**
  2474. * Doc: (des="格式化后台订单列表")
  2475. * User: XMing
  2476. * Date: 2020/7/11
  2477. * Time: 5:02 下午
  2478. * @param array $orderData
  2479. * @param array $orderReceiveData
  2480. * @param array $orderGoodsData
  2481. * @return ResultWrapper
  2482. */
  2483. public function formatManageOrderList(array $orderData, array $orderReceiveData, array $orderGoodsData = [])
  2484. {
  2485. $returnData = [];
  2486. if (empty($orderData)) {
  2487. return ResultWrapper::success($returnData);
  2488. }
  2489. $receiveMap = [];
  2490. if (!empty($orderReceiveData)) {
  2491. $orderReceiveData = self::formatSysArea($orderReceiveData);// 订单收货地址集渲染
  2492. foreach ($orderReceiveData as $key => &$item) {
  2493. $receiveMap[$item['orderId']] = [
  2494. 'customerId' => getArrayItem($item, 'customerId', 0),
  2495. 'address' => getArrayItem($item, 'address'),
  2496. 'allAddress' => $item['area']['provinceName'].$item['area']['cityName'].$item['area']['districtName'].getArrayItem($item, 'address'),
  2497. 'realName' => getArrayItem($item, 'realName'),
  2498. 'mobile' => getArrayItem($item, 'mobile'),
  2499. 'area' => getArrayItem($item, 'area', [])
  2500. ];
  2501. }
  2502. unset($item);
  2503. }
  2504. $orderData = self::formatOrderStatus($orderData); // 格式化订单状态
  2505. $goodsMap = [];
  2506. if (!empty($orderGoodsData)) {
  2507. foreach ($orderGoodsData as $key => $item) {
  2508. $goodsMap[$item['orderId']][] = $item;
  2509. }
  2510. }
  2511. unset($item);
  2512. // 映射下打印次数
  2513. $allOrderNos = [];
  2514. foreach ($orderData as $key => $value){
  2515. $allOrderNos[] = $value['no'];
  2516. }
  2517. $pbjMPrintNum = new MPrintNum($this->onlineEnterpriseId);
  2518. $printNumData = $pbjMPrintNum->getObjectPrintNumByNos($allOrderNos); // 批量获取打印次数
  2519. $orderNoBindPritNum = [];
  2520. if(!empty($printNumData)){
  2521. foreach ($printNumData as $key => $value){
  2522. $orderNoBindPritNum[$value['objectNo']] = $value['printNum'];
  2523. }
  2524. }
  2525. foreach ($orderData as $key => $datum) {
  2526. $returnData[$key] = [
  2527. 'id' => $datum['id'],
  2528. 'no' => self::formatSn($datum['no']),
  2529. 'shopId' => $datum['shopId'],
  2530. 'shopName' => isset($datum['shopName']) ? $datum['shopName'] : '',
  2531. 'customerId' => $datum['customerId'],
  2532. 'customerName' => $datum['customerName'],
  2533. 'userCenterId' => $datum['userCenterId'],
  2534. 'payAmount' => $datum['payAmount'],
  2535. 'retMoney' => $datum['retMoney'],
  2536. 'totalMoney' => $datum['totalMoney'],
  2537. 'payStatus' => $datum['payStatus'],
  2538. 'auditStatus' => $datum['auditStatus'],
  2539. 'returnStatus' => $datum['returnStatus'],
  2540. 'outStatus' => $datum['outStatus'],
  2541. 'deliveryType' => $datum['deliveryType'],
  2542. 'payType' => $datum['payType'],
  2543. 'salesManName' => empty($datum['salesManName']) ? '' : $datum['salesManName'],
  2544. 'salesman' => !isset($datum['salesman']) || is_null($datum['salesman']) ? '' : $datum['salesman'],
  2545. 'salesManId' => $datum['salesManId'],
  2546. 'createTime' => $datum['createTime'],
  2547. 'source' => $datum['source'],
  2548. 'orderStatus' => $datum['orderStatus'],
  2549. 'receiveData' => isset($receiveMap[$datum['id']]) ? $receiveMap[$datum['id']] : [],
  2550. 'orderMsg' => $datum['orderMsg'],
  2551. 'payMsg' => $datum['payMsg'],
  2552. 'deliveryMsg' => $datum['deliveryMsg'],
  2553. 'payTypeMsg' => $datum['payTypeMsg'],
  2554. 'sourceMsg' => $datum['sourceMsg'],
  2555. 'auditMsg' => $datum['auditMsg'],
  2556. 'extends' => json_decode($datum['extends'],true),
  2557. 'printingNum' => getArrayItem($orderNoBindPritNum, $datum['no'], 0),
  2558. ];
  2559. if (!empty($orderGoodsData)) {
  2560. $returnData[$key]['goodsData'] = isset($goodsMap[$datum['id']]) ? $goodsMap[$datum['id']] : [];
  2561. }
  2562. }
  2563. return ResultWrapper::success($returnData);
  2564. }
  2565. private static function formatSn($no): string
  2566. {
  2567. return StatusCode::$noPrefix[StatusCode::$orderType['saleOrder']].'-'.$no;
  2568. }
  2569. /**
  2570. * Doc: (des="订单查询index表 sql生成")
  2571. * User: XMing
  2572. * Date: 2020/7/11
  2573. * Time: 11:23 上午
  2574. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  2575. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  2576. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  2577. * @finish:已完成 orderStatus = 5 auditPass 2
  2578. * @close:已关闭 orderStatus = 6
  2579. * @param array $selectParams
  2580. * @return array
  2581. */
  2582. public function setOrderStatusSqlAttr(array $selectParams): array
  2583. {
  2584. $fields = 'id,userCenterId,no,customerId';
  2585. $countFields = ' COUNT(id) AS total ';
  2586. //订单类型
  2587. $whereSql = '';
  2588. if (isset($selectParams['orderType']) && !empty($selectParams['orderType'])) {
  2589. if (is_array($selectParams['orderType'])) {
  2590. $orderTypeStr = implode(',', $selectParams['orderType']);
  2591. $whereSql .= ' and orderType in(' . $orderTypeStr . ') ';
  2592. } else {
  2593. $whereSql .= ' and orderType = ' . $selectParams['orderType'];
  2594. }
  2595. } else {
  2596. $whereSql .= ' and orderType = ' . StatusCode::$orderType['saleOrder'];
  2597. }
  2598. if (isset($selectParams['keyword']) && !empty($selectParams['keyword'])){
  2599. if (strstr($selectParams['keyword'],StatusCode::$noPrefix['1'])){
  2600. $selectParams['keyword']= substr($selectParams['keyword'],strlen(StatusCode::$noPrefix[StatusCode::$orderType['saleOrder']])+1);
  2601. }
  2602. $keyword = '"%'.$selectParams['keyword'].'%"';
  2603. $whereSql .= ' and no LIKE '.$keyword.' or verifyCode LIKE '.$keyword;
  2604. }
  2605. if (isset($selectParams['orderType']) && $selectParams['orderType'] == StatusCode::$orderType['cashierOrder']) {
  2606. $selectParams['cashierUid'] = $this->onlineUserId;
  2607. }
  2608. if (isset($selectParams['isAll']) && $selectParams['isAll'] == StatusCode::$standard) {
  2609. unset($selectParams['cashierUid']);
  2610. }
  2611. //userCenterId
  2612. if (isset($selectParams['userCenterId']) && !empty($selectParams['userCenterId'])) {
  2613. $whereSql .= ' and userCenterId = ' . $selectParams['userCenterId'];
  2614. }
  2615. //customerId
  2616. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  2617. $whereSql .= ' and customerId = ' . $selectParams['customerId'];
  2618. }
  2619. //收银员id
  2620. if (isset($selectParams['cashierStaffId']) && !empty($selectParams['cashierStaffId'])) {
  2621. $whereSql .= ' and cashierStaffId = ' . $selectParams['cashierStaffId'];
  2622. }
  2623. //no
  2624. if (isset($selectParams['no']) && !empty($selectParams['no'])) {
  2625. $whereSql .= ' and no = "' . $selectParams['no'].'"';
  2626. }
  2627. //shopId
  2628. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  2629. $whereSql .= ' and shopId = ' . $selectParams['shopId'];
  2630. }
  2631. //收银员id
  2632. if (isset($selectParams['cashierUid']) && !empty($selectParams['cashierUid'])) {
  2633. $whereSql .= ' and cashierUid = ' . $selectParams['cashierUid'];
  2634. }
  2635. //审核状态
  2636. if (isset($selectParams['auditStatus']) && !empty($selectParams['auditStatus'])) {
  2637. $whereSql .= ' and auditStatus = ' . $selectParams['auditStatus'];
  2638. }
  2639. //出库状态
  2640. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  2641. $whereSql .= ' and outStatus = ' . $selectParams['outStatus'];
  2642. }
  2643. //退货状态
  2644. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  2645. if (is_array($selectParams['returnStatus'])) {
  2646. $returnStatusStr = implode(',', $selectParams['returnStatus']);
  2647. $whereSql .= ' and returnStatus in(' . $returnStatusStr . ') ';
  2648. } else {
  2649. $whereSql .= ' and returnStatus = ' . $selectParams['returnStatus'];
  2650. }
  2651. }
  2652. //配送方式
  2653. if (isset($selectParams['deliveryType']) && !empty($selectParams['deliveryType'])) {
  2654. $whereSql .= ' and deliveryType = ' . $selectParams['deliveryType'];
  2655. }
  2656. //支付方式
  2657. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  2658. $whereSql .= ' and find_in_set('.$selectParams['payType'].',payType) ';
  2659. }
  2660. if (isset($selectParams['startTime']) && !empty($selectParams['startTime'])){
  2661. $whereSql .= ' AND createTime BETWEEN '.$selectParams['startTime'].' AND '.$selectParams['endTime'];
  2662. }
  2663. if (isset($selectParams['source']) && !empty($selectParams['source'])){
  2664. $whereSql .= ' AND source = '.$selectParams['source'];
  2665. }
  2666. if (isset($selectParams['salesManId']) && !empty($selectParams['salesManId'])){
  2667. $whereSql .= ' AND salesManId = '.$selectParams['salesManId'];
  2668. }
  2669. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])){
  2670. $whereSql .= ' AND customerType = '.$selectParams['customerType'];
  2671. }
  2672. //订单状态
  2673. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  2674. $whereSql = self::buildStateSqlAttr($whereSql, $selectParams['state']);
  2675. }
  2676. //数据域
  2677. if (isset($selectParams['orderType']) && $selectParams['orderType'] == StatusCode::$orderType['cashierOrder'] && isset($selectParams['cashierUid']) && !empty($selectParams['cashierUid'])) {
  2678. //收银台列表
  2679. } else {
  2680. $whereSql = parent::getSalesManQueryParams($whereSql);
  2681. }
  2682. $whereSql = parent::getShopIdQueryParams($whereSql);
  2683. $whereSql .= ' order by createTime desc';
  2684. $sql = 'select ' . $fields . ' from qianniao_order_index_' . $this->onlineEnterpriseId . ' where deleteStatus = ' . StatusCode::$standard.$whereSql;
  2685. $countSql = 'select ' . $countFields . ' from qianniao_order_index_' . $this->onlineEnterpriseId . ' where deleteStatus = ' . StatusCode::$standard.$whereSql;
  2686. return [
  2687. 'sql' => $sql,
  2688. 'countSql' => $countSql
  2689. ];
  2690. }
  2691. /**
  2692. * Doc: (des="state标示多选sql处理")
  2693. * User: XMing
  2694. * Date: 2020/7/13
  2695. * Time: 9:38 上午
  2696. * @param string $sql
  2697. * @param mixed $states
  2698. * @return string
  2699. */
  2700. private static function buildStateSqlAttr(string $sql, $states)
  2701. {
  2702. if (is_array($states)) {
  2703. if (in_array('all', $states)) {
  2704. return $sql;
  2705. }
  2706. foreach ($states as $index => $state) {
  2707. $sql .= $index == 0 ? ' and (' . self::stateSql($state) : ' or ' . self::stateSql($state);
  2708. }
  2709. $sql .= ') ';
  2710. } else {
  2711. if ($states == 'all') {
  2712. return $sql;
  2713. }
  2714. $stateSql = self::stateSql($states);
  2715. if (!empty($stateSql)) {
  2716. $sql .= ' and ' . self::stateSql($states);
  2717. }
  2718. }
  2719. return $sql;
  2720. }
  2721. /**
  2722. * Doc: (des="state标示对应sql")
  2723. * User: XMing
  2724. * Date: 2020/7/13
  2725. * Time: 9:43 上午
  2726. * @param string $state
  2727. * @return string
  2728. */
  2729. private static function stateSql(string $state)
  2730. {
  2731. $sql = '';
  2732. switch ($state) {
  2733. case 'waitAudit'://待审核
  2734. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditing'] . ' and orderStatus != ' . StatusCode::$orderStatus['close'] . ')';
  2735. break;
  2736. case 'waitOutStock'://待出库
  2737. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and (orderStatus = ' . StatusCode::$orderStatus['waitPay'] . ' or orderStatus = ' . StatusCode::$orderStatus['waitDelivery'] . ')) ';
  2738. break;
  2739. case 'hasOutStock'://已出库
  2740. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and orderStatus = ' . StatusCode::$orderStatus['waitReceive'] . ')';
  2741. break;
  2742. case 'finish'://已完成
  2743. $sql .= ' (auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' and orderStatus = ' . StatusCode::$orderStatus['finish'] . ')';
  2744. break;
  2745. case 'close'://已关闭
  2746. $sql .= ' (orderStatus = ' . StatusCode::$orderStatus['close'] . ')';
  2747. break;
  2748. case 'all'://全部订单
  2749. break;
  2750. }
  2751. return $sql;
  2752. }
  2753. /**
  2754. * 删除订单视图
  2755. */
  2756. public function dropView()
  2757. {
  2758. $sql = 'DROP VIEW ' . $this->orderStatisticsTableName . '_' . $this->onlineEnterpriseId;
  2759. $dbResult = $this->objDOrder->query($sql);
  2760. if ($dbResult === false) {
  2761. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2762. }
  2763. return ResultWrapper::success('删除成功');
  2764. }
  2765. /**
  2766. * 判断表是否存在
  2767. * @param $tableName
  2768. */
  2769. public function existsTable($tableName)
  2770. {
  2771. $exists = $this->objDOrder->existsTable($tableName);
  2772. if (!$exists) {
  2773. //不存在删除视图
  2774. self::dropView();
  2775. }
  2776. }
  2777. /**
  2778. * 添加银行打款数据
  2779. */
  2780. public function addOrderBankData($orderBankData)
  2781. {
  2782. //切换分表
  2783. $fix = $fix = ceil($this->onlineUserId / $this->cutTable);
  2784. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  2785. foreach ($orderBankData['orderId'] as $key => $value){
  2786. //获取订单信息
  2787. $orderData = $this->objDOrder->get(['id' => $value]);
  2788. if ($orderData === false) {
  2789. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2790. }
  2791. if(empty($orderData)){
  2792. return ResultWrapper::fail('订单不存在', ErrorCode::$contentNotExists);
  2793. }
  2794. $orderData['extends'] = json_decode($orderData['extends'], true);
  2795. $orderData['extends']['bankData'] = $orderBankData['bankData'];
  2796. $orderData['extends'] = json_encode($orderData['extends']);
  2797. $dbReuslt = $this->objDOrder->update(['extends'=>$orderData['extends'],'updateTime'=>time()], $value);
  2798. if ($dbReuslt === false) {
  2799. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2800. }
  2801. }
  2802. return ResultWrapper::success($dbReuslt);
  2803. }
  2804. /**
  2805. * Doc: (des="审核订单,到出库单")
  2806. * User: XMing
  2807. * Date: 2020/7/14
  2808. * Time: 6:38 下午
  2809. * @param array $params
  2810. * @return ResultWrapper
  2811. * @throws \Exception
  2812. */
  2813. public function updateAuditStatus(array $params)
  2814. {
  2815. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  2816. $orderIndex = $this->objDOrderIndex->get(['id' => $params['id']]);
  2817. if ($orderIndex === false) {
  2818. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  2819. }
  2820. if (empty($orderIndex)) {
  2821. return ResultWrapper::fail('没有找到订单信息', ErrorCode::$paramError);
  2822. }
  2823. if ($orderIndex['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2824. return ResultWrapper::fail('当前订单已经审核通过!', ErrorCode::$paramError);
  2825. }
  2826. if ($this->isCashier === false) {
  2827. //在线支付的订单必须是已支付才能审核
  2828. if ($orderIndex['payType'] == StatusCode::$payType['wxPay'] || $orderIndex['payType'] == StatusCode::$payType['aliPay']) {
  2829. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass'] && $orderIndex['payStatus'] == StatusCode::$delete) {
  2830. return ResultWrapper::fail('订单尚未支付,不能审核', ErrorCode::$notAllowAccess);
  2831. }
  2832. }
  2833. }
  2834. //切换分表
  2835. $fix = $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  2836. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  2837. //获取订单信息
  2838. $orderData = $this->objDOrder->get(['id' => $params['id']]);
  2839. if ($orderData === false) {
  2840. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2841. }
  2842. // 银行打款支付方式审核之前需要判断是否上传凭证
  2843. if( $orderData['payType'] == StatusCode::$payType['bankLoans'] ){
  2844. $extends = json_decode($orderData['extends'],true);
  2845. if (!array_key_exists('bankData',$extends)){
  2846. return ResultWrapper::fail('该订单未上传银行打款凭证', ErrorCode::$paramError);
  2847. }
  2848. $customerData = $this->objDCustomer->get(['id'=>$orderData['customerId']]);
  2849. if ($customerData === false) {
  2850. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  2851. }
  2852. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  2853. // 银行打款上传凭证小程序订阅消息
  2854. $sendMessageData = [
  2855. 'date4' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime'])], // 提交时间
  2856. 'thing10' => [ 'value' => $customerData['name'] ], // 申请人
  2857. 'thing2' => [ 'value' => '银行打款凭证是否通过'], // 审核内容
  2858. 'date3' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 审核时间
  2859. 'phrase1' => [ 'value' => $orderData['auditStatus'] == StatusCode::$auditStatus['auditPass'] ? '审核通过':'审核未通过'], // 审核结果
  2860. ];
  2861. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  2862. $result = $objMSystemPushMessage->sendWeiXinPushMessage(4, $customerData['openId'], $sendMessageData);
  2863. if(!$result->isSuccess()){
  2864. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/wexinPushMessage.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  2865. }
  2866. }
  2867. }
  2868. $this->objDOrderIndex->beginTransaction();
  2869. // 生成收款单
  2870. $receivedResult = self::createReceived($orderData);
  2871. if (!$receivedResult->isSuccess()) {
  2872. $this->objDOrderIndex->rollBack();
  2873. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  2874. }
  2875. $update = [
  2876. 'auditStatus' => $params['auditStatus'],
  2877. 'updateTime' => time(),
  2878. ];
  2879. if ( $orderData['payType'] == StatusCode::$payType['bankLoans'] ){//银行打款更新payStatus,orderStatus
  2880. $update = [
  2881. 'auditStatus' => $params['auditStatus'],
  2882. 'payStatus' => StatusCode::$standard,
  2883. 'orderStatus' => StatusCode::$orderStatus['waitDelivery'],
  2884. 'updateTime' => time(),
  2885. ];
  2886. }
  2887. //操作索引表
  2888. $orderIndexUpdate = $this->objDOrderIndex->update($update, ['id' => $params['id']]);
  2889. if ($orderIndexUpdate === false) {
  2890. $this->objDOrderIndex->rollBack();
  2891. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $this->objDOrderIndex->error());
  2892. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  2893. }
  2894. //操作订单表
  2895. $orderUpdate = $this->objDOrder->update($update, $params['id']);
  2896. if ($orderUpdate === false) {
  2897. $this->objDOrderIndex->rollBack();
  2898. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $this->objDOrder->error());
  2899. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  2900. }
  2901. //订单审核出库
  2902. $outId = 0;
  2903. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2904. $orderData['auditId'] = $params['auditId'];
  2905. $orderData['audit'] = $params['audit'];
  2906. $addInventoryOutResult = self::addInventoryOut($params['id'], $orderData, $orderData['userCenterId']);
  2907. if (!$addInventoryOutResult->isSuccess()) {
  2908. $this->objDOrderIndex->rollBack();
  2909. return ResultWrapper::fail($addInventoryOutResult->getData(), $addInventoryOutResult->getErrorCode());
  2910. }
  2911. $outId = $addInventoryOutResult->getData();
  2912. }
  2913. $this->objDOrderIndex->commit();
  2914. /*
  2915. //跟新es
  2916. $_id = self::createEsDocumentId($params['id']);
  2917. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  2918. self::runProcessNextOut($outId,$orderData);
  2919. if ($params['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  2920. return ResultWrapper::success($outId);
  2921. }
  2922. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  2923. // 订单审核通过
  2924. $sendMessageData = [
  2925. 'date4' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime'])], // 提交时间
  2926. 'thing2' => [ 'value' => '银行打款凭证是否通过'], // 审核内容
  2927. 'phrase1' => [ 'value' => $orderData['auditStatus'] == 2 ? '审核通过':'审核未通过'], // 审核结果
  2928. 'date3' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 审核时间
  2929. ];
  2930. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  2931. $result = $objMSystemPushMessage->sendWeiXinPushMessage(6, $customerData['openId'], $sendMessageData);
  2932. if(!$result->isSuccess()){
  2933. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/shenhe.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  2934. }
  2935. }
  2936. return ResultWrapper::success('操作成功');
  2937. }
  2938. /**
  2939. * Doc: (des="step 3: 审核出库")
  2940. * User: XMing
  2941. * Date: 2020/11/9
  2942. * Time: 9:24 上午
  2943. * @param array $order
  2944. * @param int $outId
  2945. * @return ResultWrapper
  2946. * @throws \Exception
  2947. */
  2948. private function runProcessNextOut(int $outId,array $order): ResultWrapper
  2949. {
  2950. if (empty($outId)){
  2951. return ResultWrapper::success(true);
  2952. }
  2953. if ($order['orderType'] != StatusCode::$orderType['saleOrder']){
  2954. return ResultWrapper::success(true);
  2955. }
  2956. $setResult = $this->objMProcessSetting->getProcessSettingByType(StatusCode::$processType['sales'],'out');
  2957. if (!$setResult->isSuccess()){
  2958. Logger::logs(E_USER_ERROR,'获取流程配置出错',__CLASS__,__LINE__,$setResult->getData());
  2959. return ResultWrapper::fail($setResult->getData(),$setResult->getErrorCode());
  2960. }
  2961. $set = $setResult->getData();
  2962. if (empty($set)){
  2963. Logger::logs(E_USER_ERROR,'配置为空',__CLASS__,__LINE__,'');
  2964. return ResultWrapper::success(true);
  2965. }
  2966. if (isset($set['enableStatus']) && $set['enableStatus'] == StatusCode::$standard){
  2967. Logger::logs(E_USER_ERROR,'配置',__CLASS__,__LINE__,$set);
  2968. return ResultWrapper::success(true);
  2969. }
  2970. $params = [
  2971. 'id' => $outId,
  2972. 'auditId' => $this->onlineUserId,//操作人id
  2973. 'auditName' => '自动审核',//操作人姓名
  2974. ];
  2975. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId,$this->onlineUserId);
  2976. $result = $objMInventoryOut->updateInventoryOutStatus($params);
  2977. if (!$result->isSuccess()){
  2978. Logger::logs(E_USER_ERROR,'自动审核出库单出错',__CLASS__,__LINE__,$result->getData());
  2979. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  2980. }
  2981. Logger::logs(E_USER_ERROR,'自动审核出库单成功',__CLASS__,__LINE__,$outId);
  2982. return ResultWrapper::success(true);
  2983. }
  2984. /**
  2985. * Doc: (des="后台代客下单创建收款单")
  2986. * User: XMing
  2987. * Date: 2020/11/5
  2988. * Time: 5:31 下午
  2989. * @param array $orderData
  2990. * @return ResultWrapper
  2991. * @throws \Exception
  2992. */
  2993. private function createReceived(array $orderData): ResultWrapper
  2994. {
  2995. // 银行打款
  2996. if ($orderData['payType'] == StatusCode::$payType['bankLoans']){
  2997. $orderExtendsData = json_decode($orderData['extends'], true);
  2998. // 组装收款单账户数据
  2999. $accountListData[] = [
  3000. 'discountMoney' => 0,
  3001. 'money' => $orderData['payAmount'],
  3002. 'payWay' => StatusCode::$payType[4],
  3003. 'remark' => '银行打款生成收款',
  3004. 'accountId' => ($orderExtendsData['bankData']['id']) ? : 0,
  3005. 'accountName' => ($orderExtendsData['bankData']['name']) ? : '',
  3006. 'accountNumber' => ($orderExtendsData['bankData']['accountNumber']) ? : '',
  3007. 'finalMoney' => $orderData['payAmount'],
  3008. ];
  3009. $orderData['accountList'] = json_encode($accountListData);
  3010. $orderData['currentAccountName'] = ($orderExtendsData['bankData']['name']) ? : '';
  3011. }
  3012. //生成收款单
  3013. if ( ($orderData['orderType'] == StatusCode::$orderType['saleOrder'] || $orderData['orderType'] == StatusCode::$orderType['salesSlip']) &&
  3014. $orderData['source'] == StatusCode::$source['manage'] &&
  3015. !empty($orderData['accountList']) &&
  3016. !empty(floatval($orderData['receivedMoney'])) || ( $orderData['payType'] == StatusCode::$payType['bankLoans'] )//银行打款也生成收款单
  3017. ) {
  3018. $this->objDOrderIndex->beginTransaction();
  3019. //生成收款单
  3020. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->onlineUserId);
  3021. //创建收款单
  3022. $received = [
  3023. 'currentAccountName' => $orderData['currentAccountName'],
  3024. 'financeType' => '银行打款收款',
  3025. 'financeTypeId' => 2,
  3026. 'shopId' => $orderData['shopId'],
  3027. 'shopName' => $orderData['shopName'],
  3028. 'receiptTime' => time(),
  3029. 'operatorId' => $this->onlineUserId,
  3030. 'accountList' => json_decode($orderData['accountList'], true),
  3031. 'customerId' => $orderData['customerId'],
  3032. 'customerName' => $orderData['customerName'],
  3033. 'sourceNo' => $orderData['no'],
  3034. 'sourceId' => $orderData['id'],
  3035. 'originId' => $orderData['id'],
  3036. 'originNo' => $orderData['originNo'],
  3037. 'sourceNoMoney' => $orderData['receivedMoney'],
  3038. 'extends' => isset($orderExtendsData['bankData']) ? json_encode($orderExtendsData['bankData']) : '[]',
  3039. 'createTime' => time(),
  3040. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3041. 'updateTime' => time(),
  3042. ];
  3043. $receivedResult = $objMReceived->addReceived($received, true);
  3044. if (!$receivedResult->isSuccess()) {
  3045. $this->objDOrderIndex->rollBack();
  3046. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  3047. }
  3048. $up = [];
  3049. if ($orderData['receivedMoney'] >= $orderData['payAmount']) {
  3050. $up = [
  3051. 'payStatus' => StatusCode::$standard,
  3052. 'updateTime' => time(),
  3053. ];
  3054. }else{
  3055. if ($orderData['receivedMoney'] != 0){
  3056. $up = [
  3057. 'payStatus' => StatusCode::$offline,//部分收款
  3058. 'updateTime' => time(),
  3059. ];
  3060. }
  3061. }
  3062. if (!empty($up)){
  3063. $result = $this->objDOrderIndex->update($up, $orderData['id']);
  3064. if ($result === false) {
  3065. $this->objDOrderIndex->rollBack();
  3066. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3067. }
  3068. $result = $this->objDOrder->update($up, $orderData['id']);
  3069. if ($result === false) {
  3070. $this->objDOrderIndex->rollBack();
  3071. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3072. }
  3073. }
  3074. $this->objDOrderIndex->commit();
  3075. }
  3076. return ResultWrapper::success(true);
  3077. }
  3078. /**
  3079. * Doc: (des="订单审核出库,使用此方法一定要注意在上文获取当前订单的userCenterId用于下文切换分表")
  3080. * User: XMing
  3081. * Date: 2020/7/15
  3082. * Time: 9:48 上午
  3083. * @param array $orderData
  3084. * @param int $id
  3085. * @param int $thisOnlineUserId 当前订单的用户id,用来切换分表
  3086. * @return ResultWrapper
  3087. * @throws \Exception
  3088. */
  3089. private function addInventoryOut(int $id, array $orderData, int $thisOnlineUserId)
  3090. {
  3091. //查询订单商品表
  3092. $objMOrderGoods = new MOrderGoods($thisOnlineUserId, $this->onlineEnterpriseId);
  3093. $selectData = ['orderId' => $id];
  3094. $orderGoodsDataObj = $objMOrderGoods->getOrderGoodsByOrderIds($selectData);
  3095. if (!$orderGoodsDataObj->isSuccess()) {
  3096. return ResultWrapper::fail($orderGoodsDataObj->getData(), ErrorCode::$dberror);
  3097. }
  3098. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  3099. $totalResult = $objMInventoryOut->getTotalByOrderId($orderData['id']);
  3100. if (!$totalResult->isSuccess()){
  3101. return ResultWrapper::fail($totalResult->getData(),$totalResult->getErrorCode());
  3102. }
  3103. $total = (int)$totalResult->getData();
  3104. if ($total > 0){
  3105. //已经生成过出库单了
  3106. Logger::logs(E_USER_ERROR, '订单id:'.$orderData['id'].',重复生成出库单', __CLASS__, __LINE__,$orderData);
  3107. return ResultWrapper::fail('不要重复操作,避免生成成多个出库单',ErrorCode::$paramError);
  3108. }
  3109. //查询商铺id对应的仓库数据
  3110. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  3111. $modelResult = $objMShop->getShopDataByShopIds([$orderData['shopId']]);
  3112. if (!$modelResult->isSuccess()) {
  3113. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  3114. }
  3115. $shopData = $modelResult->getData();
  3116. unset($modelResult);
  3117. //获取订单收货信息
  3118. $orderReceiveDbResult = [];
  3119. if ($orderData['deliveryType'] == StatusCode::$deliveryType['goodsDelivery']) {
  3120. $fix = ceil($thisOnlineUserId / $this->cutTable);
  3121. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  3122. $orderReceiveDbResult = $this->objDOrderReceive->get(['orderId' => $id]);
  3123. if ($orderReceiveDbResult === false) {
  3124. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  3125. }
  3126. if (empty($orderReceiveDbResult)) {
  3127. return ResultWrapper::fail('订单收货地址查询失败', ErrorCode::$dberror);
  3128. }
  3129. }
  3130. $objMCustomer = new MCustomer($this->onlineEnterpriseId,$this->onlineUserId);
  3131. $customerResult = $objMCustomer->getCustomerByCustomerId($orderData['customerId']);
  3132. if (!$customerResult->isSuccess()){
  3133. return ResultWrapper::fail($customerResult->getData(),$customerResult->getErrorCode());
  3134. }
  3135. $customer = $customerResult->getData();
  3136. $orderGoodsData = $orderGoodsDataObj->getData();//订单商品数据
  3137. $saleOutData = [
  3138. 'sourceId' => $orderData['id'],
  3139. 'sourceNo' => $orderData['no'],
  3140. 'originNo' => $orderData['no'],
  3141. 'originId' => $orderData['id'],
  3142. 'shopId' => $orderData['shopId'],
  3143. 'shopName' => $orderData['shopName'],
  3144. 'amount' => $orderData['payAmount'],
  3145. 'operatorId' => $orderData['auditId'],//操作人id
  3146. 'operatorName' => $orderData['audit'],//操作人信息
  3147. 'customerId' => $orderData['customerId'],
  3148. 'customerName' => $orderData['customerName'],
  3149. 'customerCode' => createCode(StatusCode::$code['customer']['prefix'], $orderData['customerId'], StatusCode::$code['customer']['length']),
  3150. 'customerMobile' => isset($customer['mobile']) ? $customer['mobile'] : '',
  3151. 'source' => StatusCode::$orderType['saleOrder'], //订单来源(出库类型)
  3152. 'type' => StatusCode::$orderType['saleOut'],
  3153. 'deliveryType' => $orderData['deliveryType'],//配送方式
  3154. 'remark' => $orderData['remark'],
  3155. ];
  3156. $saleOutData['materielNum'] = 0;
  3157. //获取sku
  3158. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  3159. $skuIds = array_column(array_values($orderGoodsData), 'skuId');
  3160. $modelResult = $objMSku->getSkuDataBySkuIds($skuIds);
  3161. if (!$modelResult->isSuccess()) {
  3162. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  3163. }
  3164. $skuData = $modelResult->getData();
  3165. unset($modelResult);
  3166. foreach ($orderGoodsData as $key => $value) {
  3167. $saleOutData['materielNum']++;
  3168. $totalMoney = bcsub(bcsub($value['totalMoney'], $value['vipDiscount']), $value['preferential']);//销售总价 !优惠后
  3169. $saleOutData['orderGoodsData'][] = [
  3170. 'materielId' => $value['goodsBasicId'],
  3171. 'materielName' => $value['goodsName'],
  3172. 'materielCode' => createCode(StatusCode::$code['goodsBasic']['prefix'], $value['goodsBasicId'], StatusCode::$code['goodsBasic']['length']),
  3173. 'skuId' => $value['skuId'],
  3174. 'num' => $value['buyNum'],
  3175. 'otherNum' => $value['otherNum'],
  3176. 'outNum' => 0,
  3177. 'total' => $value['buyNum'],
  3178. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  3179. 'skuName' => isset($skuData[$value['skuId']]) ? $skuData[$value['skuId']]['skuName'] : '',
  3180. 'unitPrice' => $value['price'],//单价 不优惠
  3181. 'totalPrice' => $totalMoney,//销售总价 !优惠后
  3182. 'extend' => $value['extends'],
  3183. 'isEq' => $value['isEq'],
  3184. ];
  3185. }
  3186. $dbResult = $objMInventoryOut->addInventoryOut($saleOutData);
  3187. if (!$dbResult->isSuccess()) {
  3188. Logger::logs(E_USER_ERROR, 'sql错误', __CLASS__, __LINE__, $dbResult->getData());
  3189. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  3190. }
  3191. self::noticeStatistics([
  3192. 'userCenterId' => $thisOnlineUserId,
  3193. 'enterpriseId' => $this->onlineEnterpriseId,
  3194. 'customerId' => $orderData['customerId'],
  3195. 'no' => $orderData['no'],
  3196. 'noticeType' => 'audit',//审核
  3197. ], 'MOrderStatistics');
  3198. //添加日志
  3199. parent::saveLog([
  3200. 'no' => $orderData['no'],
  3201. 'actionType' => '审核通过',
  3202. 'operationData' => '',
  3203. 'userCenterId' => $this->onlineUserId,
  3204. 'enterpriseId' => $this->onlineEnterpriseId,
  3205. 'createTime' => time(),
  3206. ]);
  3207. self::sendMessage($this->onlineEnterpriseId,'NewOrder','stockOut');
  3208. return ResultWrapper::success($dbResult->getData());
  3209. }
  3210. /**
  3211. * 批量审核
  3212. * @param array $params
  3213. * @return ResultWrapper
  3214. * @throws \Exception
  3215. */
  3216. public function batchUpdateAuditStatus(array $params)
  3217. {
  3218. $auditParam = [
  3219. 'audit' => $params['audit'],
  3220. 'auditId' => $params['auditId'],
  3221. 'auditStatus' => $params['auditStatus']
  3222. ];
  3223. foreach ($params['ids'] as $id) {
  3224. $auditParam['id'] = $id;
  3225. $result = self::updateAuditStatus($auditParam);
  3226. if (!$result->isSuccess()) {
  3227. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3228. }
  3229. }
  3230. return ResultWrapper::success("审核成功");
  3231. }
  3232. /**
  3233. * Doc: (des="修改订单的状态,orderStatus")
  3234. * User: XMing
  3235. * Date: 2020/7/14
  3236. * Time: 5:25 下午
  3237. * @param $id
  3238. * @param $selectParams
  3239. * @param array $header
  3240. * @return ResultWrapper
  3241. * @throws \Exception
  3242. */
  3243. public function updateOrderStatus($id, $selectParams, array $header)
  3244. {
  3245. // 查询订单索引表数据
  3246. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  3247. $orderIndex = $this->objDOrderIndex->get(['id' => $id], 'userCenterId,payStatus,createTime,customerId,no,updateTime');
  3248. if ($orderIndex === false) {
  3249. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3250. }
  3251. if (empty($orderIndex)) {
  3252. return ResultWrapper::fail('订单信息不存在', ErrorCode::$paramError);
  3253. }
  3254. // 后台设置的审核通过不能取消订单
  3255. $objEnterpriseCache = new EnterpriseCache();
  3256. $enterSettingData = $objEnterpriseCache->getEnterpriseSetting($this->onlineEnterpriseId);
  3257. if(isset($enterSettingData['cancelOrder']) && $enterSettingData['cancelOrder'] == StatusCode::$delete && $orderIndex['auditStatus'] == StatusCode::$auditStatus['auditPass'] && $selectParams['orderStatus'] == StatusCode::$orderStatus['close']){
  3258. return ResultWrapper::fail('当前订单已经审核通过,暂不支持取消,请联系客服处理', ErrorCode::$notAllowAccess);
  3259. }
  3260. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close']
  3261. && isset($orderIndex['outStatus']) && $orderIndex['outStatus'] == StatusCode::$standard) {
  3262. return ResultWrapper::fail('已经发货订单不能取消', ErrorCode::$paramError);
  3263. }
  3264. // 切换订单分表,查询订单主单据数据
  3265. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);;
  3266. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  3267. $orderData = $this->objDOrder->get(['id' => $id]);
  3268. if($orderData === false) {
  3269. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3270. }
  3271. if(empty($orderData)){
  3272. return ResultWrapper::fail('要操作的订单不存在', ErrorCode::$contentNotExists);
  3273. }
  3274. $this->objDOrderIndex->beginTransaction();
  3275. // 更新订单表
  3276. $orderData['extends'] = json_decode($orderData['extends'], true);
  3277. if( !empty($selectParams['cancelReason']) ){
  3278. $orderData['extends']['cancelReason'] = $selectParams['cancelReason'];
  3279. $orderData['extends']['cancelbeforeOrderStatus'] = $selectParams['cancelbeforeOrderStatus'];
  3280. $selectParams['successFullyTime'] = time();
  3281. }
  3282. if( !empty($selectParams['cancelRejectReason']) ){
  3283. $orderData['extends']['cancelRejectReason'] = $selectParams['cancelRejectReason'];
  3284. $selectParams['orderStatus'] = $orderData['extends']['cancelbeforeOrderStatus']; // 取消被拒恢复到取消之前的订单状态
  3285. }
  3286. // 更新索引表
  3287. $orderIndexUpdate = $this->objDOrderIndex->update([
  3288. 'orderStatus' => $selectParams['orderStatus'],
  3289. 'updateTime' => time()
  3290. ], ['id' => $id]);
  3291. if ($orderIndexUpdate === false) {
  3292. $this->objDOrderIndex->rollBack();
  3293. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3294. }
  3295. $selectParams['extends'] = json_encode($orderData['extends']);
  3296. $selectParams['updateTime'] = time();
  3297. unset($selectParams['cancelReason']);
  3298. unset($selectParams['cancelRejectReason']);
  3299. unset($selectParams['cancelbeforeOrderStatus']);
  3300. $orderUpdate = $this->objDOrder->update($selectParams, ['id' => $id]);
  3301. if ($orderUpdate === false) {
  3302. $this->objDOrderIndex->rollBack();
  3303. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3304. }
  3305. // 取消订单
  3306. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close']) {
  3307. // 解锁库存
  3308. $unlockResult = self::unlockInventory($id, $orderData);
  3309. if (!$unlockResult->isSuccess()) {
  3310. $this->objDOrderIndex->rollBack();
  3311. return ResultWrapper::fail($unlockResult->getData(), $unlockResult->getErrorCode());
  3312. }
  3313. // 已经支付订单做自动退款处理
  3314. if($orderData['payStatus'] == StatusCode::$standard){
  3315. // 生成财务退款单
  3316. $financeRefundData = [
  3317. 'originId' => getArrayItem($orderData,'id',0),
  3318. 'originNo' => getArrayItem($orderData,'no',''),
  3319. 'sourceId' => getArrayItem($orderData,'id',0),
  3320. 'sourceNo' => getArrayItem($orderData,'no',''),
  3321. 'refundTime' => time(),
  3322. 'createTime' => time(),
  3323. 'unitId' => getArrayItem($orderData,'customerId',0),
  3324. 'unitName' => getArrayItem($orderData,'customerName',0),
  3325. 'currentAccountName' => getArrayItem($orderData,'customerName',''),
  3326. 'financeType' => '订单取消退款',
  3327. 'financeTypeId' => 1,
  3328. 'payType' =>getArrayItem($orderData,'payType',''),
  3329. 'shopId' => getArrayItem($orderData,'shopId',0),
  3330. 'shopName' => getArrayItem($orderData,'shopName',0),
  3331. 'money' => $orderData['payAmount'],
  3332. 'operatorId' => $this->onlineUserId,
  3333. 'type' => StatusCode::$standard,
  3334. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3335. 'remark' => '订单取消,订单编号:'. getArrayItem($orderData,'no','').'需退款金额:'.$orderData['payAmount'],
  3336. ];
  3337. // 根据订单支付方式规划退款账户
  3338. $objMAccount = new MAccount($this->onlineEnterpriseId,$this->onlineUserId);
  3339. $extends = json_decode($orderData['extends'], true);
  3340. if(isset($extends['admixPayData'])){ // 组合支付
  3341. foreach ($extends['admixPayData'] as $key => $value){
  3342. $financeAccountData = $objMAccount->getDefaultAccount($value['payType']);
  3343. if(!$financeAccountData->isSuccess()){
  3344. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  3345. }
  3346. $financeAccountData = $financeAccountData->getData();
  3347. $financeRefundData['accountList'][] = [
  3348. 'accountId' => $financeAccountData['id'],
  3349. 'accountNumber' => $financeAccountData['accountNumber'],
  3350. 'accountName' => $financeAccountData['name'],
  3351. 'money' => $value['payMoney'],
  3352. ];
  3353. }
  3354. }else{
  3355. $financeAccountData = $objMAccount->getDefaultAccount($orderData['payType']);
  3356. if(!$financeAccountData->isSuccess()){
  3357. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  3358. }
  3359. $financeAccountData = $financeAccountData->getData();
  3360. $financeRefundData['accountList'] = [
  3361. [
  3362. 'accountId' => $financeAccountData['id'],
  3363. 'accountNumber' => $financeAccountData['accountNumber'],
  3364. 'accountName' => $financeAccountData['name'],
  3365. 'money' => $orderData['payAmount'],
  3366. ]
  3367. ];
  3368. }
  3369. $objMRefund = new MRefund($this->onlineEnterpriseId,$this->onlineUserId);
  3370. $result = $objMRefund->addRefund($financeRefundData);
  3371. if(!$result->isSuccess()){
  3372. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  3373. }
  3374. // 自动审核退款单
  3375. $result = $objMRefund->updateRefundStatus(['id'=>$result->getData(),'createTime'=>time()]);
  3376. if(!$result->isSuccess()){
  3377. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  3378. }
  3379. }
  3380. // 订单审核待出库时取消订单 同步删除销售出库单
  3381. if($orderData['auditStatus'] == StatusCode::$auditStatus['auditPass']){
  3382. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  3383. $inventoryOutResult = $objMInventoryOut->delInventoryOutStatus(['originId' => $orderData['id']]);
  3384. if (!$inventoryOutResult->isSuccess()) {
  3385. $this->objDOrderIndex->rollBack();
  3386. return ResultWrapper::fail($inventoryOutResult->getData(), $inventoryOutResult->getErrorCode());
  3387. }
  3388. }
  3389. $customerData = $this->objDCustomer->get(['id'=>$orderData['customerId']]);
  3390. if ($customerData === false) {
  3391. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3392. }
  3393. if(isset($customerData['openId']) && !empty($customerData['openId'])){
  3394. // 后台取消订单小程序订阅消息
  3395. $sendMessageData = [
  3396. 'character_string13' => [ 'value' => StatusCode::$noPrefix[1] . '-' . $orderData['no']], // 订单编号
  3397. 'date10' => [ 'value' => date('Y-m-d H:i:s',$orderData['createTime']) ], // 下单时间
  3398. 'thing14' => [ 'value' => substr($orderData['shopName'],0,30)], // 门店名称
  3399. 'date2' => [ 'value' => date('Y-m-d H:i:s',$orderData['updateTime']) ], // 取消时间
  3400. ];
  3401. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  3402. $result = $objMSystemPushMessage->sendWeiXinPushMessage(5, $customerData['openId'], $sendMessageData);
  3403. if(!$result->isSuccess()){
  3404. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/quxiao.log',date('Y-m-d H:i:s').'bb'.var_export($result->getData(),true).PHP_EOL,FILE_APPEND);
  3405. }
  3406. }
  3407. }
  3408. //订单完成
  3409. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['finish'] && !empty($header)) {
  3410. // 计算分销订单提成
  3411. $i = 1;
  3412. do {
  3413. $postData = [
  3414. 'topicName' => 'MyJob',
  3415. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  3416. 'topicMethon' => 'updateBalance',
  3417. 'topicMethonParams' => [
  3418. 'Authorization' => $header['Authorization'],
  3419. 'Token' => $header['Token'],
  3420. 'orderId' => $id,
  3421. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  3422. ],
  3423. ];
  3424. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  3425. $result = request($url, $postData);
  3426. $i++;
  3427. } while ($result['httpcode'] != 200 && $i <= 3);
  3428. // 计算用户积分 start
  3429. // 查询客户信息
  3430. $customerData = $this->objDCustomer->get($orderIndex['customerId']);
  3431. if ($customerData === false) {
  3432. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3433. }
  3434. // 查询订单商品数据
  3435. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  3436. $this->objDOrderGoods->setTable('qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $fix);
  3437. $orderGoodsData = $this->objDOrderGoods->select(['deleteStatus'=>StatusCode::$standard,'orderId'=>$id]);
  3438. if ($orderGoodsData === false) {
  3439. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  3440. }
  3441. // 调用计算积分方法
  3442. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  3443. $result = $objMCustomer->addCustomerIntegralByOrder(0, $customerData, $orderData, $orderGoodsData);
  3444. if(!$result->isSuccess()){
  3445. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3446. }
  3447. //调用计算提成方法
  3448. $objMStaff = new MStaff($this->onlineEnterpriseId, $this->onlineUserId);
  3449. $result = $objMStaff->addStaffRewardByOrder(0, $customerData, $orderData, $orderGoodsData);
  3450. if(!$result->isSuccess()){
  3451. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3452. }
  3453. //订单完成商户结算金额
  3454. $objMMerchantSettlement = new MMerchantSettlement($this->onlineEnterpriseId, $this->onlineUserId);
  3455. $updateMerchantSettlement = $objMMerchantSettlement->updateMerchantSettlement(['orderId'=>$orderData['id']]);
  3456. if(!$updateMerchantSettlement->isSuccess()){
  3457. return ResultWrapper::fail($updateMerchantSettlement->getData(), $updateMerchantSettlement->getErrorCode());
  3458. }
  3459. }
  3460. //取消订单
  3461. if ($selectParams['orderStatus'] == StatusCode::$orderStatus['close'] && !empty($header)) {
  3462. $i = 1;
  3463. do {
  3464. $postData = [
  3465. 'topicName' => 'MyJob',
  3466. 'topicClass' => 'Jobs\Model\MTopic\Order\MCommissionOrder',
  3467. 'topicMethon' => 'cancelSubCommission',
  3468. 'topicMethonParams' => [
  3469. 'Authorization' => $header['Authorization'],
  3470. 'Token' => $header['Token'],
  3471. 'orderId' => $id,
  3472. 'PROJECT_DOMAIN' => PROJECT_DOMAIN
  3473. ],
  3474. ];
  3475. $url = QIANNIAO_QUEUE . '/CAddJob/add';
  3476. $result = request($url, $postData);
  3477. $i++;
  3478. } while ($result['httpcode'] != 200 && $i <= 3);
  3479. }
  3480. /*
  3481. //ES更新
  3482. $_id = self::createEsDocumentId($id);
  3483. $this->objDOrder->esupdateTypeFieldVaule(['orderStatus' => $selectParams['orderStatus']], $_id);*/
  3484. $this->objDOrderIndex->commit();
  3485. return ResultWrapper::success('操作成功');
  3486. }
  3487. /**
  3488. * Doc: (des="取消订单解锁库存")
  3489. * User: XMing
  3490. * Date: 2020/7/14
  3491. * Time: 5:54 下午
  3492. * @param int $id 订单id
  3493. * @param array $params 订单数据
  3494. * @return ResultWrapper
  3495. */
  3496. private function unlockInventory(int $id, array $params)
  3497. {
  3498. //解锁库存
  3499. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  3500. $unlockResult = $objMInventory->unlockInventory([$id], StatusCode::$orderType['saleOrder'], $params['createTime']);
  3501. if (!$unlockResult->isSuccess()) {
  3502. return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  3503. }
  3504. self::noticeStatistics([
  3505. 'userCenterId' => $this->onlineUserId,
  3506. 'enterpriseId' => $this->onlineEnterpriseId,
  3507. 'customerId' => $params['customerId'],
  3508. 'no' => $params['no'],
  3509. 'data' => $params,
  3510. 'noticeType' => 'close',//取消订单
  3511. ], 'MOrderStatistics');
  3512. //记录日志
  3513. parent::saveLog([
  3514. 'no' => $params['no'],
  3515. 'actionType' => '取消订单',
  3516. 'operationData' => '',
  3517. 'userCenterId' => $this->onlineUserId,
  3518. 'enterpriseId' => $this->onlineEnterpriseId,
  3519. 'createTime' => time(),
  3520. ]);
  3521. return ResultWrapper::success($unlockResult->getData());
  3522. }
  3523. /**
  3524. * Doc: (des="订单出库状态")
  3525. * User: XMing
  3526. * Date: 2020/12/28
  3527. * Time: 10:38 上午
  3528. * @param array $params
  3529. * @param array $where
  3530. * @param array $outInventoryMap
  3531. * @return ResultWrapper
  3532. * @throws \Exception
  3533. * @oaram $outInventoryMap
  3534. */
  3535. public function updateOutStatus(array $params,array $where,array $outInventoryMap): ResultWrapper
  3536. {
  3537. if (empty($where)) {
  3538. return ResultWrapper::fail('参数为空', ErrorCode::$paramError);
  3539. }
  3540. $orderIndex = $this->objDOrderIndex->get($where);
  3541. if ($orderIndex === false){
  3542. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  3543. }
  3544. if (empty($orderIndex)){
  3545. return ResultWrapper::fail('未获取到指定的订单信息',ErrorCode::$paramError);
  3546. }
  3547. $orderId = getArrayItem($orderIndex,'id',0);
  3548. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  3549. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  3550. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  3551. $this->objDOrderIndex->beginTransaction();
  3552. foreach ($outInventoryMap as $skuId => $outNum){
  3553. $row = $this->objDOrderGoods->get(['orderId' => $orderId, 'skuId' => $skuId, 'deleteStatus' => StatusCode::$standard]);
  3554. if ($row === false){
  3555. $this->objDOrderIndex->rollback();
  3556. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  3557. }
  3558. $update = [
  3559. 'outNum' => bcadd($row['outNum'],$outNum,2),
  3560. 'outOfNum' => bcsub($row['outOfNum'],$outNum,2),
  3561. 'updateTime' => time(),
  3562. ];
  3563. if ($update['outOfNum'] < 0){
  3564. Logger::logs(E_USER_ERROR,'企业:'.$this->onlineEnterpriseId.' 订单:'.$orderId.' 出库数量异常',__CLASS__,__LINE__,$row);
  3565. $this->objDOrderIndex->rollback();
  3566. return ResultWrapper::fail('出库数量异常',ErrorCode::$paramError);
  3567. }
  3568. $updateGoodsResult = $this->objDOrderGoods->update($update,['id' => $row['id']]);
  3569. if ($updateGoodsResult === false){
  3570. Logger::logs(E_USER_ERROR,'sql error',__CLASS__,__LINE__,$this->objDOrderGoods->error());
  3571. $this->objDOrderIndex->rollback();
  3572. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$paramError);
  3573. }
  3574. }
  3575. $outStatusResult = self::checkStockOutStatus($orderId);
  3576. if (!$outStatusResult->isSuccess()){
  3577. $this->objDOrderIndex->rollback();
  3578. return ResultWrapper::fail($outStatusResult->getData(),$outStatusResult->getErrorCode());
  3579. }
  3580. $outStatus = (int)$outStatusResult->getData();
  3581. $params['outStatus'] = $outStatus;//出库状态
  3582. $updateIndex = $this->objDOrderIndex->update($params,$orderId);
  3583. if ($updateIndex === false){
  3584. $this->objDOrderIndex->rollback();
  3585. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  3586. }
  3587. $updateOrder = $this->objDOrder->update($params,$orderId);
  3588. if ($updateOrder === false){
  3589. $this->objDOrderIndex->rollback();
  3590. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  3591. }
  3592. /*
  3593. $_id = self::createEsDocumentId($orderId);
  3594. $this->objDOrder->esupdateTypeFieldVaule($params, $_id);*/
  3595. $this->objDOrderIndex->commit();
  3596. return ResultWrapper::success($orderId);
  3597. }
  3598. /**
  3599. * Doc: (des="返回订单的出库")
  3600. * User: XMing
  3601. * Date: 2021/3/10
  3602. * Time: 10:35 上午
  3603. * @param int $orderId
  3604. * @return ResultWrapper
  3605. */
  3606. public function checkStockOutStatus(int $orderId): ResultWrapper
  3607. {
  3608. //检测是否都已经出库
  3609. $lists = $this->objDOrderGoods->select(['orderId' => $orderId,'deleteStatus' => StatusCode::$standard]);
  3610. if ($lists === false){
  3611. Logger::logs(E_USER_ERROR,'sql error',__CLASS__,__LINE__,$this->objDOrderGoods->error());
  3612. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  3613. }
  3614. if (empty($lists)){
  3615. return ResultWrapper::fail('订单商品获取失败',ErrorCode::$paramError);
  3616. }
  3617. foreach ($lists as $item){
  3618. if ($item['outOfNum'] > 0){
  3619. //还有未出库商品
  3620. return ResultWrapper::success(6);
  3621. }
  3622. }
  3623. return ResultWrapper::success(5);
  3624. }
  3625. /**
  3626. * Doc: (des="修改订单的支付状态")
  3627. * User: XMing
  3628. * Date: 2020/7/14
  3629. * Time: 5:18 下午
  3630. * @param $orderData
  3631. * @param $condition
  3632. * @param bool $isNotify
  3633. * @return ResultWrapper
  3634. * @throws \Exception
  3635. */
  3636. public function updateOrderPayData($orderData, $condition, $isNotify = false): ResultWrapper
  3637. {
  3638. $total_fel = 0;
  3639. if ($isNotify) {
  3640. $total_fel = $orderData['total_fel'];
  3641. unset($orderData['total_fel']);
  3642. }
  3643. if (isset($orderData['pay_way'])) {
  3644. $pay_way = $orderData['pay_way'];
  3645. unset($orderData['pay_way']);
  3646. }
  3647. // 查询订单数据
  3648. $orderInfoData = $this->objDOrder->select($condition);
  3649. if (empty($orderInfoData)) {
  3650. return ResultWrapper::fail('查询订单数据为空', ErrorCode::$paramError);
  3651. }
  3652. if ($orderInfoData === false) {
  3653. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3654. }
  3655. // 回调通知判断订单是否已经修改过订单状态
  3656. if ($isNotify == true && $orderInfoData[0]['payStatus'] == StatusCode::$standard) {
  3657. return ResultWrapper::fail('支付状态已经修改过了', ErrorCode::$notAllowAccess);
  3658. }
  3659. $this->objDOrder->beginTransaction();
  3660. // 如果之前是组合支付方式,修改支付方式的时候不能直接修改
  3661. if( in_array(StatusCode::$payType['balance'], explode(',', $orderInfoData[0]['payType'])) ){
  3662. $orderData['payType'] = $orderData['payType'].','.StatusCode::$payType['balance'];
  3663. $orderData['notPayMoney'] = bcsub($orderData['notPayMoney'], $orderData['total_fel'], 2);
  3664. }
  3665. $dbResult = $this->objDOrder->update($orderData, $condition);
  3666. if ($dbResult === false) {
  3667. $this->objDOrder->rollBack();
  3668. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3669. }
  3670. unset($dbResult);
  3671. if (!isset($condition['id'])) {
  3672. //查询订单id
  3673. $dbResult = $this->objDOrder->get($condition, 'id');
  3674. if ($dbResult === false) {
  3675. $this->objDOrder->rollBack();
  3676. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  3677. }
  3678. if (empty($dbResult) || !isset($dbResult['id'])) {
  3679. $this->objDOrder->rollBack();
  3680. return ResultWrapper::fail('订单数据为空', ErrorCode::$dberror);
  3681. }
  3682. $condition['id'][] = $dbResult['id'];
  3683. unset($dbResult);
  3684. }
  3685. unset($orderData['notPayMoney']);
  3686. $dbResult = self::updateOrderIndex($orderData, $condition);
  3687. if (!$dbResult->isSuccess()) {
  3688. $this->objDOrder->rollBack();
  3689. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  3690. }
  3691. if (!is_array($condition['id'])){
  3692. $condition['id'] = [$condition['id']];
  3693. }
  3694. /*
  3695. foreach ($condition['id'] as $key => $value) {
  3696. $_id = self::createEsDocumentId($value);
  3697. $this->objDOrder->esupdateTypeFieldVaule($orderData, $_id);
  3698. }*/
  3699. //线上支付生成收款单$orderData['payStatus'] $condition['id'] 支付完成后回调这两个有值
  3700. if (isset($pay_way) && isset($orderData['payStatus']) && isset($condition['id'])) {
  3701. if ($orderData['payStatus'] == StatusCode::$standard) {
  3702. //拿到微信默认账户
  3703. $defaultAccountResult = $this->objMAccount->getDefaultAccount($pay_way);
  3704. if ($defaultAccountResult->isSuccess() == false) {
  3705. $this->objDOrder->rollBack();
  3706. return ResultWrapper::fail($defaultAccountResult->getData(), $defaultAccountResult->getErrorCode());
  3707. }
  3708. $defaultAccount = $defaultAccountResult->getData();
  3709. if(empty($defaultAccount)){
  3710. return ResultWrapper::fail('支付方式对应的银行账户为空', ErrorCode::$contentNotExists);
  3711. }
  3712. foreach ($orderInfoData as $orderInfo) {
  3713. // 组合支付,收款单金额重新计算
  3714. if( in_array(StatusCode::$payType['balance'], explode(',', $orderInfoData[0]['payType'])) ){
  3715. $orderInfo['extends'] = json_decode($orderInfo['extends'], true);
  3716. if( isset($orderInfo['extends']['admixPayData']) ){
  3717. foreach ($orderInfo['extends']['admixPayData'] as $key => $value){
  3718. if($value['payType'] == StatusCode::$payType['wxPay']){
  3719. $orderInfo['payAmount'] = $value['payMoney'];
  3720. }
  3721. }
  3722. }
  3723. }
  3724. //循环订单数据,拼接生成收款单
  3725. $receivedData = [
  3726. 'customerId' => $orderInfo['customerId'],
  3727. 'customerName' => $orderInfo['customerName'],
  3728. 'currentAccountName' => $orderInfo['shopName'],
  3729. 'financeType' => '线上支付收款',
  3730. 'financeTypeId' => StatusCode::$systemFinanceType['saleReceipt'],
  3731. 'shopId' => $orderInfo['shopId'],
  3732. 'shopName' => $orderInfo['shopName'],
  3733. 'receiptTime' => time(),
  3734. 'operatorId' => 0,
  3735. 'originId' => $orderInfo['id'],
  3736. 'originNo' => $orderInfo['no'],
  3737. 'sourceId' => $orderInfo['id'],
  3738. 'sourceNo' => $orderInfo['no'],
  3739. 'sourceNoMoney' => $orderInfo['payAmount'],
  3740. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  3741. 'offsetMoney' => 0,
  3742. 'notOffsetMoney' => 0,
  3743. 'offsetStatus' => StatusCode::$delete,
  3744. 'createTime' => time(),
  3745. 'updateTime' => time(),
  3746. 'accountList' => [
  3747. [
  3748. "accountId" => isset($defaultAccount['id']) ? $defaultAccount['id'] : 0,
  3749. "accountNumber" => isset($defaultAccount['accountNumber']) ? $defaultAccount['accountNumber'] : '请设置默认的收款账户',
  3750. "money" => $orderInfo['payAmount'],
  3751. "discountMoney" => 0,
  3752. "finalMoney" => $orderInfo['payAmount'],
  3753. "payWay" => isset($pay_way) ? $pay_way . "支付" : '在线支付',
  3754. "remark" => "在线支付自动生成收款单"
  3755. ]
  3756. ],
  3757. ];
  3758. $result = $this->objMReceived->addReceived($receivedData, true);
  3759. if ($result->isSuccess() == false) {
  3760. $this->objDOrder->rollBack();
  3761. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  3762. }
  3763. // 微信生成的收款单自动审核
  3764. if( in_array(StatusCode::$payType['wxPay'], explode(',', $orderInfoData[0]['payType'])) ){
  3765. $updateReceived = $this->objMReceived->updateReceivedStatus(['id'=>$result->getData(),'createTime'=>time()]);
  3766. if (!$updateReceived->isSuccess()) {
  3767. $this->objDOrder->rollBack();
  3768. return ResultWrapper::fail($updateReceived->getData(), $updateReceived->getErrorCode());
  3769. }
  3770. }
  3771. unset($receivedData);
  3772. unset($result);
  3773. }
  3774. }
  3775. }
  3776. if ($isNotify) {
  3777. self::runProcessNextAudit($condition['id']);
  3778. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  3779. $customer = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  3780. if (!$customer->isSuccess()) {
  3781. return ResultWrapper::fail($customer->getData(), $customer->getErrorCode());
  3782. }
  3783. $customer = $customer->getData();
  3784. parent::coupon([
  3785. 'userCenterId' => $this->onlineUserId,
  3786. 'enterpriseId' => $this->onlineEnterpriseId,
  3787. 'customerId' => isset($customer['id']) ? $customer['id'] : '',
  3788. 'payAmount' => isset($total_fel) ? $total_fel : 0,
  3789. ], 'MOnlinePayCoupon');
  3790. $objCustomerCache = new CustomerCache();
  3791. $objCustomerCache->delInterestCustomerAfterPay($customer['id'], $this->onlineEnterpriseId);
  3792. if (isset($customer['openId']) && !empty($customer['openId'])) {
  3793. /* $payment = '';
  3794. //判断支付方式
  3795. switch ($orderInfoData[0]['payType']) {
  3796. case StatusCode::$payType['wxPay']:
  3797. $payment = StatusCode::$payType[1];
  3798. break;
  3799. case StatusCode::$payType['balance']:
  3800. $payment = StatusCode::$payType[7];
  3801. break;
  3802. case StatusCode::$payType['cashPay']:
  3803. $payment = StatusCode::$payType[3];
  3804. break;
  3805. case StatusCode::$payType['bankLoans']:
  3806. $payment = StatusCode::$payType[4];
  3807. break;
  3808. }
  3809. $orderInfoData[0]['extends'] = json_decode($orderInfoData[0]['extends'], true);
  3810. if (isset($orderInfoData[0]['extends']['admixPayData'])) {
  3811. $payment = '组合支付';
  3812. }*/
  3813. // 发送小程序订阅消息
  3814. $sendMessageData = [
  3815. 'character_string3' => ['value' => StatusCode::$noPrefix[1] . '-' . $orderInfoData[0]['no']], // 订单编号
  3816. 'date10' => ['value' => date('Y-m-d H:i:s', $orderInfoData[0]['createTime'])], // 下单时间
  3817. 'time4' => ['value' => date('Y-m-d H:i:s', time())], // 支付时间
  3818. 'thing7' => ['value' => '微信支付'], // 支付方式
  3819. 'name8' => ['value' => substr($orderInfoData[0]['shopName'],0,30)] // 商家名称
  3820. ];
  3821. $objMSystemPushMessage = new MSystemPushMessage($this->onlineUserId, $this->onlineEnterpriseId);
  3822. $result = $objMSystemPushMessage->sendWeiXinPushMessage(3, $customer['openId'], $sendMessageData);
  3823. if (!$result->isSuccess()) {
  3824. file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/systemPushMessage.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
  3825. }
  3826. }
  3827. }
  3828. $this->objDOrder->commit();
  3829. $objMMerchantFlow = new MMerchantFlow($this->onlineEnterpriseId,$this->onlineUserId);
  3830. if ($isNotify == true || $orderData['payStatus'] == StatusCode::$standard){
  3831. foreach ($condition['id'] as $key => $id) {
  3832. $objMMerchantFlow->calculation($id);
  3833. }
  3834. }
  3835. return ResultWrapper::success('操作成功');
  3836. }
  3837. /**
  3838. * 更新索引表订单状态,支付状态,支付方式
  3839. * @param $orderData
  3840. * @param $params
  3841. * @return ResultWrapper
  3842. * @throws \Exception
  3843. */
  3844. private function updateOrderIndex($orderData, $params)
  3845. {
  3846. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  3847. $updateData = [];
  3848. isset($orderData['payType']) && $updateData['payType'] = $orderData['payType'];
  3849. isset($orderData['payStatus']) && $updateData['payStatus'] = $orderData['payStatus'];
  3850. isset($orderData['orderStatus']) && $updateData['orderStatus'] = $orderData['orderStatus'];
  3851. isset($orderData['outStatus']) && $updateData['outStatus'] = $orderData['outStatus'];
  3852. $where['id'] = $params['id'];
  3853. $dbResult = $this->objDOrderIndex->update($updateData, $where);
  3854. if ($dbResult === false) {
  3855. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  3856. }
  3857. return ResultWrapper::success($dbResult);
  3858. }
  3859. /**
  3860. * 格式化返回数据
  3861. * @param $data
  3862. * @return array
  3863. * @throws \Exception
  3864. * @return ResultWrapper
  3865. */
  3866. private function format($data): ResultWrapper
  3867. {
  3868. // 提取所有订单id
  3869. $allOrderIds = [];
  3870. $allShopIds = [];
  3871. $allOrderNo = [];
  3872. $customerIds = [];
  3873. $allCustomerTypeIds = [];
  3874. if (isset($data['id'])) {
  3875. $dimension = $data;
  3876. unset($data);
  3877. $data[] = $dimension;
  3878. }
  3879. foreach ($data as $key => $value) {
  3880. $allOrderNo[] = $value['no'];
  3881. $allOrderIds[] = $value['id'];
  3882. $allShopIds[] = $value['shopId'];
  3883. $allCustomerTypeIds = $value['customerType'];
  3884. $customerIds[] = $value['customerId'];
  3885. $this->onlineUserId = $value['userCenterId'];
  3886. if ($value['auditStatus'] == StatusCode::$auditStatus['auditing']) {
  3887. $data[$key]['orderMsg'] = '待审核';
  3888. }
  3889. if ($value['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  3890. $data[$key]['orderMsg'] = '待出库';
  3891. if ($value['orderStatus'] == StatusCode::$orderStatus['waitReceive']) {
  3892. $data[$key]['orderMsg'] = '已出库';
  3893. if ($value['outStatus'] == 6 && $value['isRet'] != StatusCode::$standard){
  3894. $data[$key]['orderMsg'] = '部分出库';
  3895. }
  3896. }
  3897. if ($value['orderStatus'] == StatusCode::$orderStatus['finish']) {
  3898. $data[$key]['orderMsg'] = '已完成';
  3899. }
  3900. }
  3901. switch ($value['orderStatus']){
  3902. case StatusCode::$orderStatus['close']:
  3903. $data[$key]['orderMsg'] = '已关闭';
  3904. break;
  3905. case StatusCode::$orderStatus['cancelIng'];
  3906. $data[$key]['orderMsg'] = '待取消';
  3907. break;
  3908. }
  3909. if (isset($value['payType'])) {
  3910. $data[$key]['payTypeMsg'] = isset(StatusCode::$payType[$value['payType']]) ? StatusCode::$payType[$value['payType']] : '';
  3911. }
  3912. }
  3913. //获取客户类型
  3914. $customerTypeMap = [];
  3915. if (!empty($allCustomerTypeIds)) {
  3916. $objDCustomerSource = new DCustomerSource();
  3917. $customerSourceLists = $objDCustomerSource->select(['id' => $allCustomerTypeIds], 'id,name');
  3918. if ($customerSourceLists != false) {
  3919. foreach ($customerSourceLists as $val) {
  3920. $customerTypeMap[$val['id']] = $val['name'];
  3921. }
  3922. }
  3923. }
  3924. //获取店铺信息
  3925. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  3926. $shopData = $objMShop->getShopName($allShopIds);
  3927. /********************************订单商品 start****************************/
  3928. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  3929. $dbResult = $objMOrderGoods->getOrderGoodsByOrderIds(['orderId' => $allOrderIds, 'deleteStatus' => StatusCode::$standard]);
  3930. $orderGoodsData = [];//订单商品信息
  3931. if (!$dbResult->isSuccess()) {
  3932. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  3933. }
  3934. $orderGoodsData = $dbResult->getData();
  3935. unset($dbResult);
  3936. //查询sku信息
  3937. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  3938. //查询商品数据
  3939. $allGoodsIds = array_unique(array_column($orderGoodsData, 'goodsId'));
  3940. $allGoodsBasicIds = array_unique(array_column($orderGoodsData, 'goodsBasicId'));
  3941. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  3942. $goodsData = $objMGoods->getGoodsNames($allGoodsIds);
  3943. //获取商品的库存
  3944. $inventorySelectParams = [];
  3945. $objMInventory = new MInventory($this->onlineEnterpriseId, '');
  3946. foreach ($orderGoodsData as $item){
  3947. $inventorySelectParams[$item['shopId']][] = $item['skuId'];
  3948. }
  3949. $inventoryMap = [];
  3950. foreach ($inventorySelectParams as $shopId => $skuIds){
  3951. $inventoryResult = $objMInventory->getInventoryByShopIdAndSkuIds($shopId,$skuIds);
  3952. if (!$inventoryResult->isSuccess()) {
  3953. return ResultWrapper::fail($inventoryResult->getData(),$inventoryResult->getErrorCode());
  3954. }
  3955. $inventoryMap[$shopId] = $inventoryResult->getData();
  3956. }
  3957. //sku信息
  3958. $skuResult = $objMSku->getSpecNameBySkuId(array_column($orderGoodsData, 'skuId'));
  3959. if (!$skuResult->isSuccess()) {
  3960. return ResultWrapper::fail($skuResult->getData(),$skuResult->getErrorCode());
  3961. }
  3962. $allSku = $skuResult->getData();
  3963. $goods = [];
  3964. $allSkuIds = [];
  3965. foreach ($orderGoodsData as $val){
  3966. if (!in_array($val['skuId'],$allSkuIds)){
  3967. $allSkuIds[] = $val['skuId'];
  3968. }
  3969. }
  3970. foreach ($orderGoodsData as $key => &$value) {
  3971. $value['isNew'] = isset($allSku[$value['skuId']]['isNew']) ? $allSku[$value['skuId']]['isNew'] : StatusCode::$delete;
  3972. $value['barCode'] = isset($allSku[$value['skuId']]['barCode']) ? $allSku[$value['skuId']]['barCode'] : '';
  3973. $value['unitName'] = isset($allSku[$value['skuId']]['unitName']) ? $allSku[$value['skuId']]['unitName'] : '';
  3974. $value['specGroup'] = isset($allSku[$value['skuId']]['specGroup']) ? $allSku[$value['skuId']]['specGroup'] : [];
  3975. $value['images'] = isset($goodsData[$value['goodsId']]['images']) ? json_decode($goodsData[$value['goodsId']]['images'], true) : '';
  3976. $value['returnPrice'] = bcdiv(bcsub(bcsub($value['totalMoney'], $value['preferential']), $value['vipDiscount']), $value['buyNum']);
  3977. $value['isMater'] = isset($allSku[$value['skuId']]['isMaster']) ? $allSku[$value['skuId']]['isMaster'] : StatusCode::$delete;
  3978. $value['conversion'] = isset($allSku[$value['skuId']]['conversion']) ? $allSku[$value['skuId']]['conversion'] : 0;
  3979. $value['inventory'] = isset($inventoryMap[$value['shopId']][$value['skuId']]['num']) ? $inventoryMap[$value['shopId']][$value['skuId']]['num'] : 0;
  3980. // 处理订单商品表扩展字段
  3981. if( !empty($value['extends']) ){
  3982. $extends = json_decode($value['extends'], true);
  3983. if(!empty($extends)){
  3984. foreach($extends as $keys => $item){
  3985. $value[$keys] = $item;
  3986. }
  3987. }
  3988. }
  3989. $allOrderGoodsData[$value['orderId']][] = $value;
  3990. if (!isset($goods[$value['orderId']]['goodsPreferential'])) {
  3991. $goods[$value['orderId']]['goodsPreferential'] = 0;
  3992. }
  3993. $goods[$value['orderId']]['goodsPreferential'] = bcadd($goods[$value['orderId']]['goodsPreferential'], bcmul($value['preferential'], $value['buyNum']), 2);
  3994. }
  3995. unset($dbResult);
  3996. /********************************收货信息 start******************************/
  3997. $objMOrderReceive = new MOrderReceive($this->onlineUserId, $this->onlineEnterpriseId);
  3998. $dbResult = $objMOrderReceive->getOrderReceiveByOrderIds(['orderId' => $allOrderIds]);
  3999. $orderReceiveData = [];//订单收货信息
  4000. if (!$dbResult->isSuccess()) {
  4001. return ResultWrapper::fail($dbResult->getData(),$dbResult->getErrorCode());
  4002. }
  4003. $orderReceiveData = self::formatSysArea($dbResult->getData());
  4004. foreach ($orderReceiveData as $key => $value) {
  4005. $allOrderReceiveData[$value['orderId']] = $value;
  4006. }
  4007. unset($dbResult);
  4008. /*********************************订单操作记录*********************************/
  4009. $objMOrderLog = new MOrderLog($this->onlineEnterpriseId);
  4010. $orderLog = $objMOrderLog->getOrderLog(['no' => $allOrderNo]);
  4011. /**********************************获取基本配置*********************************/
  4012. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  4013. $setupResult = $objMBasicSetup->getBasicField('allowReturnDay');
  4014. if (!$setupResult->isSuccess()) {
  4015. return ResultWrapper::fail($setupResult->getData(),$setupResult->getErrorCode());
  4016. }
  4017. $setupResult = $setupResult->getData();
  4018. $allowReturnDay = empty($setupResult['allowReturnDay']) ? 0 : $setupResult['allowReturnDay'];
  4019. /********************************映射数据 start******************************/
  4020. $nowTime = time();
  4021. foreach ($data as $key => $value) {
  4022. $data[$key]['no'] = StatusCode::$noPrefix[1].'-'.$value['no'];
  4023. $data[$key]['extends'] = !empty($value['extends']) ? json_decode($value['extends'], true) : (object)[];
  4024. $data[$key]['goodsData'] = isset($allOrderGoodsData[$value['id']]) ? $allOrderGoodsData[$value['id']] : [];
  4025. $data[$key]['receiveData'] = isset($allOrderReceiveData[$value['id']]) ? $allOrderReceiveData[$value['id']] : [];
  4026. $data[$key]['deliveryNo'] = isset($value['deliveryNo']) ? $value['deliveryNo'] : '';
  4027. $data[$key]['payAmount'] = bcsub($value['payAmount'],$value['retMoney'],2);
  4028. $data[$key]['expressMoney'] = isset($value['expressMoney']) ? $value['expressMoney'] : '';
  4029. $data[$key]['expressName'] = isset($value['expressName']) ? $value['expressName'] : '';
  4030. $data[$key]['deliveryName'] = isset(StatusCode::$deliveryType[$value['deliveryType']]) ? StatusCode::$deliveryType[$value['deliveryType']] : '';//配送方式名称
  4031. $data[$key]['orderPreferential'] = bcsub($data[$key]['totalMoney'], bcsub($data[$key]['payAmount'], $data[$key]['expressMoney'], 2), 2);//订单优惠
  4032. $data[$key]['goodsPreferential'] = isset($goods[$value['id']]['goodsPreferential']) ? $goods[$value['id']]['goodsPreferential'] : '';//商品优惠
  4033. $data[$key]['coupon'] = '0.00';
  4034. $data[$key]['salesman'] = $value['salesManName'];
  4035. $data[$key]['shopName'] = isset($shopData[$value['shopId']]['name']) ? $shopData[$value['shopId']]['name'] : '';
  4036. $data[$key]['shopLogo'] = isset($shopData[$value['shopId']]['logo']) ? $shopData[$value['shopId']]['logo'] : '';
  4037. $data[$key]['orderLog'] = isset($orderLog[$value['no']]) ? $orderLog[$value['no']] : [];
  4038. $data[$key]['allowReturn'] = StatusCode::$standard;//允许退货
  4039. if ($allowReturnDay == 0) {
  4040. //TODO(没有设置可退货时间,默认都可以退)
  4041. $data[$key]['allowReturn'] = StatusCode::$standard;//允许退货
  4042. } else {
  4043. $expire = ($allowReturnDay * 86400) + $value['successFullyTime'];
  4044. if ($nowTime > $expire) {
  4045. $data[$key]['allowReturn'] = StatusCode::$delete;//不允许退货
  4046. }
  4047. }
  4048. $data[$key]['allowReturnDay'] = $allowReturnDay;
  4049. if ($value['source'] == StatusCode::$source['manage']){
  4050. $data[$key]['orderPreferential'] = isset($value['totalReduceMoney']) ? $value['totalReduceMoney'] : 0;
  4051. }else{
  4052. $data[$key]['orderPreferential'] = bcsub($value['totalMoney'], bcsub($value['payAmount'], $value['expressMoney'], 2), 2);//订单总优惠
  4053. }
  4054. $data[$key]['paidAmount'] = $value['payStatus'] == StatusCode::$standard ? $value['payAmount'] : '0';//已付款金额
  4055. $data[$key]['customerTypeName'] = isset($customerTypeMap[$value['customerType']]) ? $customerTypeMap[$value['customerType']] : '';
  4056. $data[$key]['cashierName'] = $value['cashierName'];
  4057. $data[$key]['customerMobile'] = $value['customerMobile'];//客户手机号码
  4058. $data[$key]['guideName'] = $value['guideName'];
  4059. $data[$key]['changeAmount'] = $value['changeSubMoney'];
  4060. $data[$key]['accountList'] = empty($value['accountList']) ? [] : json_decode($value['accountList'], true);
  4061. $data[$key]['receivedName'] = isset($allOrderReceiveData[$value['id']]['realName']) ? $allOrderReceiveData[$value['id']]['realName'] : '';//收货人
  4062. $data[$key]['receivedMobile'] = isset($allOrderReceiveData[$value['id']]['mobile']) ? $allOrderReceiveData[$value['id']]['mobile'] : '';//收货电话
  4063. $data[$key]['reservoir'] = !empty($value['reservoir']) ? json_decode($value['reservoir'],true) : [];
  4064. //$data[$key]['selfRuleData'] = empty($value['selfRuleData']) ? (object)[] : json_decode($value['selfRuleData'],true);
  4065. }
  4066. $data = array_shift($data);
  4067. if ($this->isFront === false) {
  4068. $data['expressData'] = (object)[];
  4069. if ($data['deliveryType'] == StatusCode::$deliveryType['goodsDelivery'] && $data['deliveryNo']) {
  4070. $expressResult = self::getExpressInfoByOrderId($data['id']);
  4071. if ($expressResult->isSuccess()) {
  4072. $data['expressData'] = $expressResult->getData();
  4073. }
  4074. }
  4075. }
  4076. return ResultWrapper::success($data);
  4077. }
  4078. /**
  4079. * 地区
  4080. * @param $data
  4081. * @return mixed
  4082. */
  4083. public function formatSysArea($data)
  4084. {
  4085. if (empty($data)) {
  4086. return $data;
  4087. }
  4088. $objMSysAreaChina = new MSysAreaChina();
  4089. foreach ($data as $key => $val) {
  4090. if (isset($val['provinceCode']) && isset($val['cityCode']) && isset($val['districtCode'])) {
  4091. $areaName = $objMSysAreaChina->getNameByCode([
  4092. $val['provinceCode'],
  4093. $val['cityCode'],
  4094. $val['districtCode']
  4095. ]);
  4096. $data[$key]['area']['provinceName'] = isset($areaName[$val['provinceCode']]) ? $areaName[$val['provinceCode']] : '';
  4097. $data[$key]['area']['cityName'] = isset($areaName[$val['cityCode']]) ? $areaName[$val['cityCode']] : '';
  4098. $data[$key]['area']['districtName'] = isset($areaName[$val['districtCode']]) ? $areaName[$val['districtCode']] : '';
  4099. }
  4100. }
  4101. return $data;
  4102. }
  4103. /**
  4104. * 查询订单
  4105. * 全部 {"page": 1,"pageSize": 10,"orderStatus": 0}
  4106. * 待付款 {"page": 1,"pageSize": 10,"orderStatus": 2}
  4107. * 待发货 {"page": 1,"pageSize": 10,"orderStatus": 3}
  4108. * 待收货 {"page": 1,"pageSize": 10,"orderStatus": 4}
  4109. * @param $selectParams
  4110. * @return ResultWrapper
  4111. * @throws \Exception
  4112. */
  4113. public function getOrderSelect($selectParams)
  4114. {
  4115. $limit = $selectParams['limit'];
  4116. unset($selectParams['limit']);
  4117. $offset = $selectParams['offset'];
  4118. unset($selectParams['offset']);
  4119. unset($selectParams['page']);
  4120. unset($selectParams['pageSize']);
  4121. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  4122. $customerId = $objMCustomer->getCustomerIdByUserCenterId($this->onlineUserId);
  4123. if (empty($customerId)) {
  4124. return ResultWrapper::fail('没有找到客户信息', ErrorCode::$paramError);
  4125. }
  4126. $selectParams['customerId'] = $customerId;
  4127. $selectParams['deleteStatus'] = StatusCode::$standard;
  4128. $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);
  4129. if ($dbResult === false) {
  4130. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4131. }
  4132. $total = $this->objDOrder->count($selectParams);
  4133. $return = [
  4134. 'data' => self::formatAndGoods($dbResult),
  4135. 'total' => ($total) ? intval($total) : 0,
  4136. ];
  4137. return ResultWrapper::success($return);
  4138. }
  4139. /**
  4140. * 格式化商品数据
  4141. *
  4142. * @param $data
  4143. * @return mixed
  4144. * @throws \Exception
  4145. */
  4146. private function formatAndGoods($data)
  4147. {
  4148. $allOrderIds = [];
  4149. $allShopIds = [];
  4150. foreach ($data as $key => $value) {
  4151. $allShopIds[] = $value['shopId'];
  4152. $allOrderIds[] = $value['id'];
  4153. }
  4154. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  4155. $selectParams = [
  4156. 'orderId' => $allOrderIds,
  4157. 'deleteStatus' => StatusCode::$standard,
  4158. ];
  4159. $dbResult = $objMOrderGoods->getOrderGoodsByOrderIds($selectParams);
  4160. $orderGoodsData = [];//订单商品信息
  4161. if ($dbResult->isSuccess()) {
  4162. $orderGoodsData = $dbResult->getData();
  4163. }
  4164. $allGoodsIds = array_unique(array_column($orderGoodsData, 'goodsId'));
  4165. unset($dbResult);
  4166. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  4167. $goodsData = $objMGoods->getGoodsNames($allGoodsIds);
  4168. if (empty($goodsData)) {
  4169. return $data;
  4170. }
  4171. $allOrderGoodsData = [];
  4172. foreach ($orderGoodsData as $key => &$value) {
  4173. $value['extends'] = !empty($value['extends']) ? json_decode($value['extends'], true) : [];
  4174. $value['images'] = isset($goodsData[$value['goodsId']]['images']) ? json_decode($goodsData[$value['goodsId']]['images'], true) : '';
  4175. // 如果是抄码商品,订单商品购买数量按照件算
  4176. if( $value['isEq'] == StatusCode::$standard){
  4177. $value['buyNum'] = isset($value['extends']['u_1_buy']) ? $value['extends']['u_1_buy'] : $value['buyNum'];
  4178. }
  4179. $allOrderGoodsData[$value['orderId']][] = $value;
  4180. }
  4181. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  4182. $shopData = $objMShop->getShopName($allShopIds);
  4183. foreach ($data as $key => $val) {
  4184. $data[$key]['deliveryTypeMsg'] = isset(StatusCode::$deliveryType[$val['deliveryType']]) ? StatusCode::$deliveryType[$val['deliveryType']] : '';
  4185. $data[$key]['goodsNum'] = isset($allOrderGoodsData[$val['id']]) ? array_sum(array_column($allOrderGoodsData[$val['id']], 'buyNum')) : '';
  4186. $data[$key]['shopName'] = isset($shopData[$val['shopId']]['name']) ? $shopData[$val['shopId']]['name'] : '';
  4187. $data[$key]['shopLogo'] = isset($shopData[$val['shopId']]['logo']) ? $shopData[$val['shopId']]['logo'] : '';
  4188. $data[$key]['goodsData'] = isset($allOrderGoodsData[$val['id']]) ? array_values($allOrderGoodsData[$val['id']]) : '';
  4189. }
  4190. return $data;
  4191. }
  4192. /**
  4193. * Doc: (des="订单检索条件")
  4194. * User: XMing
  4195. * Date: 2020/7/11
  4196. * Time: 9:48 上午
  4197. * @param $selectParams
  4198. * @param bool $is_export
  4199. * @return ResultWrapper
  4200. * @throws \Exception
  4201. */
  4202. public function search($selectParams, $is_export = false)
  4203. {
  4204. $defaultDSL = [
  4205. 'sort' => [
  4206. 'createTime' => [
  4207. 'order' => 'desc'
  4208. ],
  4209. ],
  4210. ];
  4211. if ($is_export === false) {
  4212. $defaultDSL['from'] = $selectParams['offset'];
  4213. $defaultDSL['size'] = $selectParams['limit'];
  4214. }
  4215. $dsl = [];
  4216. $dsl['query']['bool']['must'][] = [
  4217. 'term' => ['enterpriseId' => $this->onlineEnterpriseId],
  4218. ];
  4219. //订单编号,收货人,商品名称
  4220. if (!empty($selectParams['keyword'])) {
  4221. $dsl['query']['bool']['must'][] = [
  4222. 'multi_match' => [
  4223. 'fields' => ['no', 'verifyCode', 'mobile', 'goodsName', 'salesManName', 'customerName', 'remark'],
  4224. 'query' => $selectParams['keyword'],
  4225. //'fuzziness' => 'AUTO',
  4226. "type" => "best_fields",
  4227. "tie_breaker" => 0.3,
  4228. "minimum_should_match" => "100%"
  4229. ],
  4230. ];
  4231. }
  4232. //销售单/订单
  4233. if (isset($selectParams['orderType']) && !empty($selectParams['orderType'])) {
  4234. $dsl['query']['bool']['filter'][] =
  4235. ['term' => ['orderType' => $selectParams['orderType']]];
  4236. }
  4237. //订单状态
  4238. if (isset($selectParams['orderStatus']) && !empty($selectParams['orderStatus'])) {
  4239. $dsl['query']['bool']['filter'][] =
  4240. ['term' => ['orderStatus' => $selectParams['orderStatus']]];
  4241. }
  4242. //出库状态
  4243. if (isset($selectParams['outStatus']) && !empty($selectParams['outStatus'])) {
  4244. $dsl['query']['bool']['filter'][] =
  4245. ['term' => ['outStatus' => $selectParams['outStatus']]];
  4246. }
  4247. //退货状态
  4248. if (isset($selectParams['returnStatus']) && !empty($selectParams['returnStatus'])) {
  4249. $dsl['query']['bool']['filter'][] =
  4250. ['term' => ['returnStatus' => $selectParams['returnStatus']]];
  4251. }
  4252. //配送方式
  4253. if (isset($selectParams['deliveryType']) && !empty($selectParams['deliveryType'])) {
  4254. $dsl['query']['bool']['filter'][] =
  4255. ['term' => ['deliveryType' => $selectParams['deliveryType']]];
  4256. }
  4257. //支付状态
  4258. if (isset($selectParams['payType']) && !empty($selectParams['payType'])) {
  4259. $dsl['query']['bool']['filter'][] =
  4260. ['term' => ['payType' => $selectParams['payType']]];
  4261. }
  4262. //店铺id
  4263. parent::getAccessShopIds();
  4264. if (parent::$shopIds) {
  4265. $dsl['query']['bool']['filter'][] = [
  4266. 'terms' => ['shopId' => parent::$shopIds]
  4267. ];
  4268. }
  4269. //省code
  4270. if (isset($selectParams['provinceCode']) && !empty($selectParams['provinceCode'])) {
  4271. $dsl['query']['bool']['filter'][] =
  4272. ['term' => ['provinceCode' => $selectParams['provinceCode']]];
  4273. }
  4274. //市code
  4275. if (isset($selectParams['cityCode']) && !empty($selectParams['cityCode'])) {
  4276. $dsl['query']['bool']['filter'][] =
  4277. ['term' => ['cityCode' => $selectParams['cityCode']]];
  4278. }
  4279. //区code
  4280. if (isset($selectParams['districtCode']) && !empty($selectParams['districtCode'])) {
  4281. $dsl['query']['bool']['filter'][] =
  4282. ['term' => ['districtCode' => $selectParams['districtCode']]];
  4283. }
  4284. if (!empty($selectParams['start']) && !empty($selectParams['end'])) {
  4285. $dsl['query']['bool']['must'][] = [
  4286. 'range' => [
  4287. 'createTime' => [
  4288. 'gte' => $selectParams['start'],
  4289. 'lte' => $selectParams['end'],
  4290. ]
  4291. ]
  4292. ];
  4293. } else {
  4294. if (isset($selectParams['start']) && !empty($selectParams['start'])) {
  4295. $dsl['query']['bool']['must'][] = [
  4296. 'range' => [
  4297. 'createTime' => [
  4298. 'gte' => $selectParams['start'],
  4299. ]
  4300. ]
  4301. ];
  4302. }
  4303. if (isset($selectParams['end']) && !empty($selectParams['end'])) {
  4304. $dsl['query']['bool']['must'][] = [
  4305. 'range' => [
  4306. 'createTime' => [
  4307. 'lte' => $selectParams['end'],
  4308. ]
  4309. ]
  4310. ];
  4311. }
  4312. }
  4313. //店铺id
  4314. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  4315. $dsl['query']['bool']['filter'][] =
  4316. ['term' => ['shopId' => $selectParams['shopId']]];
  4317. }
  4318. //客户id
  4319. if (isset($selectParams['customerId']) && !empty($selectParams['customerId'])) {
  4320. $dsl['query']['bool']['filter'][] =
  4321. ['term' => ['customerId' => $selectParams['customerId']]];
  4322. }
  4323. //客户类型
  4324. if (isset($selectParams['customerType']) && !empty($selectParams['customerType'])) {
  4325. $dsl['query']['bool']['filter'][] =
  4326. ['term' => ['customerType' => $selectParams['customerType']]];
  4327. }
  4328. $flag = true;
  4329. //业务员id
  4330. if (isset($selectParams['salesManId']) && !empty($selectParams['salesManId'])) {
  4331. $dsl['query']['bool']['filter'][] =
  4332. ['term' => ['salesManId' => $selectParams['salesManId']]];
  4333. }
  4334. //销售员id
  4335. parent::getAccessSalesManIds();
  4336. if (!empty(parent::$salesManIds) && empty($selectParams['salesManId'])) {
  4337. $dsl['query']['bool']['filter'][] = [
  4338. 'terms' => ['salesManId' => parent::$salesManIds]
  4339. ];
  4340. }
  4341. if (!empty(parent::$salesManIds) && !empty($selectParams['salesManId'])) {
  4342. if (!in_array($selectParams['salesManId'], parent::$salesManIds)) {
  4343. $flag = false;
  4344. }
  4345. }
  4346. //订单来源
  4347. if (isset($selectParams['source']) && !empty($selectParams['source'])) {
  4348. $dsl['query']['bool']['filter'][] =
  4349. ['term' => ['source' => $selectParams['source']]];
  4350. }
  4351. //按照标示进行检索,等级最高
  4352. if (isset($selectParams['state']) && !empty($selectParams['state'])) {
  4353. $dsl = self::setOrderStatusDslAttr($dsl, $selectParams['state']);
  4354. }
  4355. $dsl = array_merge($defaultDSL, $dsl);
  4356. //导出
  4357. if ($is_export === true) self::exportSearch($dsl);
  4358. //V($dsl);
  4359. $result = $flag ? $this->objDOrder->getSearchQueryDsl($dsl) : [];
  4360. if (isset($result['status']) && $result['status'] == 400) {
  4361. //return ResultWrapper::fail('获取数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  4362. return ResultWrapper::success([
  4363. 'data' => [],
  4364. 'total' => 0
  4365. ]);
  4366. }
  4367. if (!isset($result['hits']) || $result['hits']['total'] == 0) {
  4368. return ResultWrapper::success([
  4369. 'data' => [],
  4370. 'total' => 0
  4371. ]);
  4372. }
  4373. $total = $result['hits']['total'];
  4374. $dbResult = $result['hits']['hits'];
  4375. $list = [];
  4376. foreach ($dbResult as $key => &$value) {
  4377. $data = [];
  4378. $data = $value['_source'];
  4379. //$data['id'] = $value['_id'];
  4380. $data['receiveData'] = [
  4381. 'realName' => $data['realName'],
  4382. 'mobile' => $data['mobile']
  4383. ];
  4384. unset($data['realName']);
  4385. unset($data['mobile']);
  4386. $list[] = $data;
  4387. }
  4388. $buildData = self::shiftEsReceiveData($list);
  4389. $formatResult = self::formatManageOrderList($buildData['allOrderData'], $buildData['allOrderReceiveData']);
  4390. if (!$formatResult->isSuccess()) {
  4391. return ResultWrapper::fail($formatResult->getData(), $formatResult->getErrorCode());
  4392. }
  4393. $return = [
  4394. 'data' => $formatResult->getData(),
  4395. 'total' => ($total) ? intval($total) : 0,
  4396. ];
  4397. return ResultWrapper::success($return);
  4398. }
  4399. /**
  4400. * Doc: (des="将es中查询出来的数据,统一转化为标准格式进行格式化")
  4401. * User: XMing
  4402. * Date: 2020/7/11
  4403. * Time: 6:13 下午
  4404. * @param $data
  4405. * @return array
  4406. */
  4407. private static function shiftEsReceiveData($data)
  4408. {
  4409. $orderData = [];
  4410. $orderReceiveData = [];
  4411. foreach ($data as $item) {
  4412. $orderData[] = $item;
  4413. $orderReceiveData[] = [
  4414. 'orderId' => $item['id'],
  4415. 'customerId' => $item['customerId'],
  4416. 'address' => $item['address'],
  4417. 'realName' => $item['receiveData']['realName'],
  4418. 'mobile' => $item['receiveData']['mobile'],
  4419. 'provinceCode' => $item['provinceCode'],
  4420. 'cityCode' => $item['cityCode'],
  4421. 'districtCode' => $item['districtCode']
  4422. ];
  4423. }
  4424. return [
  4425. 'allOrderData' => $orderData,
  4426. 'allOrderReceiveData' => $orderReceiveData
  4427. ];
  4428. }
  4429. /**
  4430. * 格式化订单状态
  4431. * @param $data
  4432. * @return mixed
  4433. */
  4434. private static function formatOrderStatus($data)
  4435. {
  4436. if (empty($data)) return $data;
  4437. foreach ($data as $key => $value) {
  4438. if ($value['auditStatus'] == StatusCode::$auditStatus['auditing']) {
  4439. $data[$key]['orderMsg'] = '待审核';
  4440. }
  4441. if ($value['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  4442. $data[$key]['orderMsg'] = '待出库';
  4443. if ($value['orderStatus'] == StatusCode::$orderStatus['waitReceive']) {
  4444. $data[$key]['orderMsg'] = '已出库';
  4445. if ($value['outStatus'] == 6 && $value['isRet'] != StatusCode::$standard){
  4446. $data[$key]['orderMsg'] = '部分出库';
  4447. }
  4448. }
  4449. if ($value['orderStatus'] == StatusCode::$orderStatus['finish']) {
  4450. $data[$key]['orderMsg'] = '已完成';
  4451. }
  4452. }
  4453. switch ($value['orderStatus']){
  4454. case StatusCode::$orderStatus['close']:
  4455. $data[$key]['orderMsg'] = '已关闭';
  4456. break;
  4457. case StatusCode::$orderStatus['cancelIng'];
  4458. $data[$key]['orderMsg'] = '待取消';
  4459. break;
  4460. // case StatusCode::$orderStatus['waitReceive'];
  4461. // $data[$key]['orderMsg'] = '待收货';
  4462. // break;
  4463. }
  4464. if (isset($value['payStatus'])) {
  4465. $data[$key]['payMsg'] = $value['payStatus'] == StatusCode::$standard ? '已支付' : '未支付';
  4466. }
  4467. if (isset($value['deliveryType'])) {
  4468. $data[$key]['deliveryMsg'] = isset(StatusCode::$deliveryType[$value['deliveryType']]) ? StatusCode::$deliveryType[$value['deliveryType']] : '';
  4469. }
  4470. if (isset($value['payType'])) {
  4471. $payTypeMsg = '';
  4472. if( isset(StatusCode::$payType[$value['payType']]) ){
  4473. $payTypeMsg = StatusCode::$payType[$value['payType']];
  4474. }else{// 组合支付渲染金额
  4475. if($value['extends']){
  4476. $admixPayData = json_decode($value['extends'],true);
  4477. $payTypeMsg = '组合支付(';
  4478. foreach ($admixPayData['admixPayData'] as $admixKey => $admixValue){
  4479. $payTypeMsg .= $admixValue['title'].'支付'.$admixValue['payMoney'].',';
  4480. }
  4481. $payTypeMsg .= ")";
  4482. }
  4483. }
  4484. $data[$key]['payTypeMsg'] = $payTypeMsg;
  4485. //$data[$key]['payTypeMsg'] = isset(StatusCode::$payType[$value['payType']]) ? StatusCode::$payType[$value['payType']] : '组合支付';
  4486. }
  4487. if (isset($value['source'])) {
  4488. $data[$key]['sourceMsg'] = isset(StatusCode::$source[$value['source']]) ? StatusCode::$source[$value['source']] : '';
  4489. }
  4490. if (isset($value['auditStatus'])) {
  4491. $data[$key]['auditMsg'] = isset(StatusCode::$auditStatus[$value['auditStatus']]) ? StatusCode::$auditStatus[$value['auditStatus']] : '';
  4492. }
  4493. }
  4494. return $data;
  4495. }
  4496. /**
  4497. * Doc: (des="订单标示的dsl拼接")
  4498. * User: XMing
  4499. * Date: 2020/7/11
  4500. * Time: 9:15 上午
  4501. * @param array $dsl
  4502. *
  4503. * @waitAudit:等待审核 orderStatus != 6 auditStatus = 1
  4504. * @waitOutStock:待出库 orderStatus != 6 auditPass = 2
  4505. * @hasOutStock:已出库 orderStatus = 4 auditPass = 2
  4506. * @finish:已完成 orderStatus = 5 auditPass 2
  4507. * @close:已关闭 orderStatus = 6
  4508. * @param string $states
  4509. * @return array|mixed
  4510. */
  4511. public static function setOrderStatusDslAttr(array $dsl, $states)
  4512. {
  4513. if (is_array($states)) {
  4514. $allAuditStatus = [];
  4515. $allOrderStatus = [];
  4516. foreach ($states as $state) {
  4517. $auditStatus = self::auditStatusAttrDsl($state);
  4518. $orderStatus = self::orderStatusAttrDsl($state);
  4519. $allAuditStatus = array_merge($auditStatus, $allAuditStatus);
  4520. $allOrderStatus = array_merge($orderStatus, $allOrderStatus);
  4521. }
  4522. } else {
  4523. $allAuditStatus = self::auditStatusAttrDsl($states);
  4524. $allOrderStatus = self::orderStatusAttrDsl($states);
  4525. }
  4526. if (!empty($allAuditStatus)) {
  4527. $dsl['query']['bool']['filter'][] = [
  4528. 'terms' => [
  4529. 'auditStatus' => $allAuditStatus
  4530. ]
  4531. ];
  4532. }
  4533. if (!empty($allOrderStatus)) {
  4534. $dsl['query']['bool']['filter'][] = [
  4535. 'terms' => [
  4536. 'orderStatus' => $allOrderStatus
  4537. ]
  4538. ];
  4539. }
  4540. return $dsl;
  4541. }
  4542. /**
  4543. * Doc: (des="state对应审核状态映射")
  4544. * User: XMing
  4545. * Date: 2020/7/13
  4546. * Time: 10:36 上午
  4547. * @param string $state
  4548. * @return array|mixed
  4549. */
  4550. public static function auditStatusAttrDsl(string $state)
  4551. {
  4552. $map = [
  4553. 'waitAudit' => [StatusCode::$auditStatus['auditing']],
  4554. 'waitOutStock' => [StatusCode::$auditStatus['auditPass']],
  4555. 'hasOutStock' => [StatusCode::$auditStatus['auditPass']],
  4556. 'finish' => [StatusCode::$auditStatus['auditPass']],
  4557. 'close' => [],
  4558. 'all' => []
  4559. ];
  4560. return isset($map[$state]) ? $map[$state] : [];
  4561. }
  4562. /**
  4563. * Doc: (des="state对应订单状态映射")
  4564. * User: XMing
  4565. * Date: 2020/7/13
  4566. * Time: 10:43 上午
  4567. * @param string $state
  4568. * @return array|mixed
  4569. */
  4570. public static function orderStatusAttrDsl(string $state)
  4571. {
  4572. $map = [
  4573. 'waitAudit' => [StatusCode::$orderStatus['waitPay'], StatusCode::$orderStatus['waitDelivery']],
  4574. 'waitOutStock' => [StatusCode::$orderStatus['waitPay'], StatusCode::$orderStatus['waitDelivery']],
  4575. 'hasOutStock' => [StatusCode::$orderStatus['waitReceive']],
  4576. 'finish' => [StatusCode::$orderStatus['finish']],
  4577. 'close' => [StatusCode::$orderStatus['close']],
  4578. 'all' => []
  4579. ];
  4580. return isset($map[$state]) ? $map[$state] : [];
  4581. }
  4582. /**
  4583. * 再次支付
  4584. *
  4585. * @param $params
  4586. * @param $ip
  4587. * @return ResultWrapper
  4588. * @throws \Exception
  4589. */
  4590. public function payOrder($params, $ip)
  4591. {
  4592. // file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/pay_params.log', date('Y-m-d H:i:s') . '再次支付订单数据:' . var_export($params, true) . PHP_EOL, FILE_APPEND);
  4593. //order表切表
  4594. $fix = 1;
  4595. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  4596. $this->objDOrderIndex->setTable('qianniao_order_index_'.$this->onlineEnterpriseId);
  4597. $status = $this->objDOrder->beginTransaction();
  4598. //再次支付更新extend值
  4599. $extend = [];
  4600. // 处理混合支付数据
  4601. if( !empty($params['admixPayData']) ){
  4602. $extend['admixPayData'] = $params['admixPayData'];
  4603. }
  4604. // 处理银行打款数据
  4605. if( !empty($params['bankData']) ){
  4606. $extend['bankData'] = $params['bankData'];
  4607. }
  4608. $extend = json_encode($extend);
  4609. //再次付款更新extend(付款信息)
  4610. $updateExtend = $this->objDOrder->update(['extends'=>$extend],['no' => $params['no']]);
  4611. if ($updateExtend === false) {
  4612. $this->objDOrderIndex->rollBack();
  4613. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4614. }
  4615. if($status){
  4616. $this->objDOrder->commit();
  4617. }
  4618. $orderData = $this->objDOrder->get(['no' => $params['no']]);
  4619. if ($orderData === false) {
  4620. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4621. }
  4622. if (empty($orderData)) {
  4623. return ResultWrapper::fail('没有找到订单', ErrorCode::$paramError);
  4624. }
  4625. $params['payType'] = explode(',', $params['payType']);
  4626. $this->objDOrder->beginTransaction();
  4627. //再次支付时订单支付方式改为了货到付款
  4628. //if ($params['payType'] == StatusCode::$payType['cashPay']) {
  4629. if ( in_array(StatusCode::$payType['cashPay'], $params['payType']) || in_array(StatusCode::$payType['bankLoans'],$params['payType'])) {
  4630. //修改订单的支付方式
  4631. if(in_array(StatusCode::$payType['cashPay'], $params['payType'])){//货到付款 订单状态为待发货
  4632. $update = [
  4633. 'payType' => StatusCode::$payType['cashPay'],
  4634. 'orderStatus' => StatusCode::$orderStatus['waitDelivery']
  4635. ];
  4636. } else{//银行打款 订单状态为代发货
  4637. $update = [
  4638. 'payType' => StatusCode::$payType['bankLoans'],
  4639. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  4640. 'payStatus' => StatusCode::$delete
  4641. ];
  4642. }
  4643. $dbResult = $this->objDOrder->update($update, ['no' => $params['no']]);
  4644. if ($dbResult === false) {
  4645. $this->objDOrderIndex->rollBack();
  4646. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4647. }
  4648. unset($dbResult);
  4649. //修改索引表支付方式
  4650. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  4651. $dbResult = $this->objDOrderIndex->update($update, ['id' => $orderData['id']]);
  4652. if ($dbResult === false) {
  4653. $this->objDOrderIndex->rollBack();
  4654. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  4655. }
  4656. /*
  4657. //修改ES,支付方式
  4658. $_id = self::createEsDocumentId($orderData['id']);
  4659. $this->objDOrder->esupdateTypeFieldVaule(['payType' => StatusCode::$payType['cashPay']], $_id);*/
  4660. $this->objDOrder->commit();
  4661. //订单是否自动审核
  4662. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  4663. //获取基本配置
  4664. $setupResult = $objMBasicSetup->getBasicField('autoAuditOrder');
  4665. $autoAuditOrder = [];
  4666. if ($setupResult->isSuccess()) {
  4667. $autoAuditOrder = $setupResult->getData();//自动审核配置数据
  4668. $autoAuditOrder = isset($autoAuditOrder['autoAuditOrder']) ? $autoAuditOrder['autoAuditOrder'] : [];
  4669. }
  4670. //货到付款是否开启了自动审核
  4671. $autoAudit = isset($autoAuditOrder['cashPay']) ? $autoAuditOrder['cashPay'] : StatusCode::$delete;
  4672. if ($autoAudit == StatusCode::$standard) {
  4673. //开启了自动审核,审核订单
  4674. $auditResult = self::updateAuditStatus([
  4675. 'id' => $orderData['id'],
  4676. 'audit' => '自动审核',
  4677. 'auditId' => $this->onlineUserId,
  4678. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  4679. ]);
  4680. }
  4681. return ResultWrapper::success($dbResult);
  4682. }
  4683. //获取客户信息
  4684. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  4685. $customerData = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  4686. if (!$customerData->isSuccess()) {
  4687. return ResultWrapper::fail($customerData->getData(), $customerData->getErrorCode());
  4688. }
  4689. $customerData = $customerData->getData();
  4690. $payType = $params['payType'];
  4691. rsort($payType);
  4692. $payment = [];
  4693. $payParams = '';
  4694. $payStatus = StatusCode::$partion;
  4695. $orderStatus = StatusCode::$orderStatus['waitPay'];
  4696. if( in_array(StatusCode::$payType['bankLoans'],$payType) ){
  4697. $payStatus = StatusCode::$delete;
  4698. $orderStatus = StatusCode::$orderStatus['waitPay'];
  4699. }
  4700. foreach($payType as $k => $v){
  4701. // 除了余额支付其他方式都要获取支付配置
  4702. if($v != StatusCode::$payType['balance']){
  4703. $objMPaymentSetting = new MPaymentSetting($this->onlineUserId, $this->onlineEnterpriseId);
  4704. $result = $objMPaymentSetting->getPayData($v);
  4705. if (!$result->isSuccess() || empty($result->getData())) {
  4706. return ResultWrapper::fail('获取微信配置错误', ErrorCode::$configEroor);
  4707. }
  4708. $payment = $result->getData();
  4709. }
  4710. switch (true){
  4711. case in_array(StatusCode::$payType['balance'], $payType):
  4712. //余额支付
  4713. //$objMCustomer = new MCustomer($this->onlineEnterpriseId,$this->onlineUserId);
  4714. //减少余额()
  4715. $status = $this->objDOrderIndex->beginTransaction();
  4716. //新增会员流水记录
  4717. $memberBalanceDetailData = [
  4718. 'customerId' => $orderData['customerId'],
  4719. 'type' => StatusCode::$delete,
  4720. 'userCenterId' => $this->onlineUserId,
  4721. 'purpose' => '创建订单消费',
  4722. 'orderIds' =>implode(',',[$orderData['id']]),
  4723. 'remark' => '订单id'.implode(',',[$orderData['id']]),
  4724. 'financeType' => '会员余额消费'
  4725. ];
  4726. // 组合支付方式
  4727. if( !empty($params['admixPayData']) ) {
  4728. foreach ($params['admixPayData'] as $key => $value) {
  4729. if ($value['payType'] == StatusCode::$payType['balance']) {
  4730. // 本次混合支付余额支付金额
  4731. $memberBalanceDetailData['money'] = $value['payMoney'];
  4732. // 总金额 - 余额支付金额 = 剩余需要搭配支付金额
  4733. $orderData['payAmount'] = bcsub($orderData['payAmount'], $value['payMoney'], 2);
  4734. }
  4735. }
  4736. }else{
  4737. $payStatus = StatusCode::$standard;
  4738. $orderStatus = StatusCode::$orderStatus['waitDelivery'];
  4739. $memberBalanceDetailData['money'] = $orderData['payAmount'];
  4740. }
  4741. $objMMemberBalanceDetail = new MMemberBalanceDetail($this->onlineEnterpriseId,$this->onlineUserId);
  4742. $memberBalanceDbResult = $objMMemberBalanceDetail->addMemberBalanceDetail($memberBalanceDetailData);
  4743. if (!$memberBalanceDbResult->isSuccess()) {
  4744. $this->objDOrderIndex->rollBack();
  4745. return ResultWrapper::fail($memberBalanceDbResult->getData(), $memberBalanceDbResult->getErrorCode());
  4746. }
  4747. //扣除失败->订单未支付
  4748. if ($memberBalanceDbResult->isSuccess()){
  4749. $time = time();
  4750. //扣除成功->订单支付成功\
  4751. foreach ([$orderData['id']] as $orderId){
  4752. $updateIndexResult = $this->objDOrderIndex->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'updateTime' => $time],$orderId);
  4753. if ($updateIndexResult === false){
  4754. $this->objDOrderIndex->rollBack();
  4755. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  4756. }
  4757. $updateIndex = $this->objDOrder->update(['payStatus' => $payStatus,'orderStatus' => $orderStatus,'payTime'=> $time,'updateTime' => $time,'payAmount'=>$memberBalanceDetailData['money']],$orderId);
  4758. if ($updateIndex === false){
  4759. $this->objDOrderIndex->rollBack();
  4760. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  4761. }
  4762. }
  4763. }
  4764. $status && $this->objDOrderIndex->commit();
  4765. $payParams = ResultWrapper::success([]);
  4766. break;
  4767. case in_array(StatusCode::$payType['aliPay'], $payType):
  4768. //ali
  4769. /*********读取支付宝支付参数(原配置)*********/
  4770. /**$aliPayConfigData = Factory::config()->get('alipay');
  4771. * if (empty($aliPayConfigData)) {
  4772. * return ResultWrapper::fail('支付宝配置错误', ErrorCode::$configEroor);
  4773. * }*/
  4774. $payOrderData = [
  4775. 'subject' => '千鸟云商',
  4776. 'out_trade_no' => $orderData['no'],
  4777. 'total_amount' => $orderData['payAmount'],
  4778. 'passback_params' => $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', [$orderData['id']]),
  4779. ];
  4780. $aliPayConfigData = [
  4781. 'appid' => $payment['appid'],
  4782. 'rsaPrivateKey' => $payment['rsaPrivateKey'],
  4783. 'alipayrsaPublicKey' => $payment['alipayrsaPublicKey'],
  4784. ];
  4785. $objAliPay = new aliPay($aliPayConfigData['appid'], $aliPayConfigData['rsaPrivateKey'], $aliPayConfigData['alipayrsaPublicKey']);
  4786. $payParams = $objAliPay->appPay($payOrderData);
  4787. break;
  4788. case in_array(StatusCode::$payType['wxPay'], $payType):
  4789. //wx
  4790. /********************生成小程序唤起支付用到的参数(原配置)*****/
  4791. /**$weixinConfigData = Factory::config()->get('weixin');
  4792. * if (empty($weixinConfigData)) {
  4793. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  4794. * }*/
  4795. // 获取当前登录企业的小程序配置
  4796. $objSystemCache = new SystemCache();
  4797. $miniprogramSetting = $objSystemCache->getAppIdByEnterpriseId($this->onlineEnterpriseId);
  4798. if (empty($miniprogramSetting)) {
  4799. return ResultWrapper::fail('后台小程序配置项为空', ErrorCode::$configEroor);
  4800. }
  4801. $miniprogramSetting = json_decode($miniprogramSetting, true);//获取小程序appid
  4802. // 获取配置文件微信公众号
  4803. /**$weixinConfigData = Factory::config()->get('weixin');
  4804. * if (empty($weixinConfigData)) {
  4805. * return ResultWrapper::fail('微信配置错误', ErrorCode::$configEroor);
  4806. * }*/
  4807. switch ($params['source']) {
  4808. case StatusCode::$source['ByteProgram'];
  4809. //$appid = $weixinConfigData['offiaccount']['appid'];
  4810. $appid = $miniprogramSetting['appid'];
  4811. $paySource = 'byteDanceH5';
  4812. break;
  4813. case StatusCode::$source['miniProgram'];
  4814. $appid = $miniprogramSetting['appid'];
  4815. $paySource = 'miniProgram';
  4816. break;
  4817. default :
  4818. $appid = $payment['mobileAppid'];
  4819. $paySource = 'APP';
  4820. break;
  4821. }
  4822. $weixinConfigData = [
  4823. 'mch_id' => $payment['mchId'],
  4824. 'apiPartnerKey' => $payment['apiPartnerKey'],
  4825. 'appid' => $appid
  4826. ];
  4827. $attach = $this->onlineEnterpriseId . '|' . $this->onlineUserId . '|' . implode('|', [$orderData['id']]);
  4828. //$objPay = new Pay($appid, $weixinConfigData['pay']['mch_id'], $weixinConfigData['pay']['apiPartnerKey']);//old
  4829. $objPay = new Pay($appid, $weixinConfigData['mch_id'], $weixinConfigData['apiPartnerKey']);
  4830. $payParams = $objPay->unifiedorder($orderData['no'],$orderData['payAmount'], $ip, $paySource, '千鸟云商', $customerData['openId'], $attach);
  4831. break;
  4832. case in_array(StatusCode::$payType['byte'],$payType):
  4833. //字节跳动
  4834. $mweb_url = '';
  4835. //读取缓存配置
  4836. //$objSystemCache->getByteDanceSetting($this->onlineEnterpriseId);
  4837. // 获取配置文件字节小程序
  4838. $byteDanceConfigData = Factory::config()->getAppoint('byteDance', 'pay');
  4839. if (empty($byteDanceConfigData)) {
  4840. return ResultWrapper::fail('字节跳动配置错误', ErrorCode::$configEroor);
  4841. }
  4842. $objbytePay = new bytePay($byteDanceConfigData['appid'], $byteDanceConfigData['merchant_id'], $byteDanceConfigData['app_secret']);
  4843. unset($payParams);
  4844. $payParams = $objbytePay->pay($orderData['no'],$orderData['payAmount'], '千鸟云商', $ip, $mweb_url);
  4845. break;
  4846. case in_array(StatusCode::$payType['bankLoans'], $payType):
  4847. $payParams = ResultWrapper::success([$orderData['id']]);
  4848. break;
  4849. default:
  4850. //TODO
  4851. return ResultWrapper::fail('暂未开放的支付方式',ErrorCode::$paramError);
  4852. break;
  4853. }
  4854. unset($payType[$k]);
  4855. if (!$payParams->isSuccess()) {
  4856. return ResultWrapper::fail($payParams->getData(), $payParams->getErrorCode());
  4857. }
  4858. }
  4859. return ResultWrapper::success($payParams->getData());
  4860. }
  4861. /**
  4862. * 增加打印次数
  4863. * @param $id
  4864. * @return ResultWrapper
  4865. */
  4866. public function printIncr($id)
  4867. {
  4868. $dbResult = $this->objDOrder->set_inc('printingNum', ['id' => $id]);
  4869. if ($dbResult === false) {
  4870. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4871. }
  4872. return ResultWrapper::success($dbResult);
  4873. }
  4874. /**
  4875. * todo(保存编辑(废弃))
  4876. *
  4877. * @param $params
  4878. * @return ResultWrapper
  4879. * @throws \Exception
  4880. */
  4881. public function saveEdit($params)
  4882. {
  4883. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  4884. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  4885. $objMShippingAddress = new MShippingAddress($this->onlineEnterpriseId);
  4886. $objMOrderReceive = new MOrderReceive($this->onlineUserId, $this->onlineEnterpriseId);
  4887. $order = $this->objDOrder->get(['id' => $params['orderId']]);
  4888. if ($order === false) {
  4889. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4890. }
  4891. if (empty($order)) {
  4892. return ResultWrapper::fail('订单不存在', ErrorCode::$paramError);
  4893. }
  4894. if (!isset($order['auditStatus'])
  4895. || $order['auditStatus'] == StatusCode::$auditStatus['auditPass']
  4896. || $order['payStatus'] == StatusCode::$standard
  4897. ) {
  4898. return ResultWrapper::fail('订单不能编辑', ErrorCode::$paramError);
  4899. }
  4900. //根据地址id获取地址信息
  4901. $dbResult = $objMShippingAddress->getShippingAddressInfo($params['receiveAddressId']);
  4902. if (!$dbResult->isSuccess()) {
  4903. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4904. }
  4905. $addressData = $dbResult->getData();
  4906. if (empty($addressData)) {
  4907. return ResultWrapper::fail('收货地址信息不存在', ErrorCode::$dberror);
  4908. }
  4909. //锁定库存 查询商铺对应的仓库
  4910. $objMWarehouse = new MWarehouse($this->onlineEnterpriseId);
  4911. $warehouseData = $objMWarehouse->getWarehouseInfo(['shopId' => $params['goodsData']['goodsData'][0]['shopId']]);
  4912. if (!$warehouseData->isSuccess()) {
  4913. return ResultWrapper::fail($params['goodsData']['goodsData'][0]['shopId'] . $warehouseData->getData(), $warehouseData->getErrorCode());
  4914. }
  4915. $warehouse = $warehouseData->getData();
  4916. $commonData = $params['goodsData'];
  4917. $this->objDOrder->beginTransaction();
  4918. //先解锁库存
  4919. // $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  4920. // $unlockResult = $objMInventory->unlockInventory([$order['id']], StatusCode::$orderType['saleOrder'], $order['createTime']);
  4921. // if (!$unlockResult->isSuccess()) {
  4922. // $this->objDOrder->rollBack();
  4923. // return ResultWrapper::fail($unlockResult->getData(), ErrorCode::$dberror);
  4924. // }
  4925. $dbResult = $this->objDOrderIndex->update(['deliveryType' => $params['deliveryType']], ['id' => $params['orderId']]);
  4926. if ($dbResult === false) {
  4927. $this->objDOrder->rollBack();
  4928. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  4929. }
  4930. //修改Order表中的数据
  4931. $dbResult = $this->objDOrder->update([
  4932. 'totalMoney' => $commonData['totalMoney'],
  4933. 'payAmount' => $commonData['payMoney'],
  4934. 'deliveryType' => $params['deliveryType'],
  4935. 'buyTotal' => array_sum(array_column($commonData['goodsData'], 'buyNum'))
  4936. ], ['id' => $params['orderId']]);
  4937. if ($dbResult === false) {
  4938. $this->objDOrder->rollBack();
  4939. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  4940. }
  4941. unset($dbResult);
  4942. //修改OrderGoods表中的数据
  4943. if (!empty($params['delOrderGoodsIds'])) {
  4944. $dbResult = $objMOrderGoods->updateDetails(['deleteStatus' => StatusCode::$delete], ['id' => $params['delOrderGoodsIds']]);
  4945. if (!$dbResult->isSuccess()) {
  4946. $this->objDOrder->rollBack();
  4947. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4948. }
  4949. unset($dbResult);
  4950. }
  4951. //查询当前订单商品,进行比对
  4952. $dbResult = $objMOrderGoods->getDetails([
  4953. 'orderId' => $params['orderId'],
  4954. 'deleteStatus' => StatusCode::$standard,
  4955. ]);
  4956. if (!$dbResult->isSuccess()) {
  4957. $this->objDOrder->rollBack();
  4958. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4959. }
  4960. $oldGoodsData = $dbResult->getData();
  4961. $hash = [];
  4962. foreach ($oldGoodsData as $goods) {
  4963. $hash[] = md5($goods['goodsId'] . $goods['skuId']);
  4964. }
  4965. $lockInventoryData = [];
  4966. foreach ($commonData['goodsData'] as $value) {
  4967. foreach ($value['shopGoodsData'] as $key => $val) {
  4968. $rowHash = md5($val['goodsId'] . $val['skuId']);
  4969. if (in_array($rowHash, $hash)) {
  4970. //update
  4971. $dbResult = $objMOrderGoods->updateDetails(
  4972. [
  4973. 'buyNum' => $val['buyNum'],
  4974. 'price' => $val['price'],
  4975. 'originPrice' => $val['originPrice'],
  4976. 'totalMoney' => $val['totalMoney'],
  4977. ],
  4978. ['orderId' => $params['orderId'], 'goodsId' => $val['goodsId'], 'skuId' => $val['skuId']]
  4979. );
  4980. if (!$dbResult->isSuccess()) {
  4981. $this->objDOrder->rollBack();
  4982. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  4983. }
  4984. } else {
  4985. //insert
  4986. $dbResult = $objMOrderGoods->addOrderGoods([
  4987. 'no' => $order['no'],
  4988. 'orderId' => $params['orderId'],
  4989. 'goodsId' => $val['goodsId'],
  4990. 'goodsName' => $val['goodsName'],
  4991. 'shopId' => $val['shopId'],//商铺id
  4992. 'shopName' => $val['shopName'],//商铺名称
  4993. 'originPrice' => $val['originPrice'],
  4994. 'price' => $val['price'],
  4995. 'buyNum' => $val['buyNum'],
  4996. 'totalMoney' => $val['totalMoney'],
  4997. 'skuId' => $val['skuId'],
  4998. 'goodsBasicId' => $val['goodsBasicId'],
  4999. 'goodsCode' => $val['goodsCode'],
  5000. 'deliverNum' => $val['buyNum'],//发货数量=购买数量
  5001. 'unitName' => $val['unitName'],//单位名称
  5002. 'conversion' => $val['conversion'],//换算比率
  5003. 'preferential' => $val['preferential'],//优惠券优惠金额
  5004. 'vipDiscount' => $val['vipDiscount'],//会员卡优惠金额
  5005. ]);
  5006. if (!$dbResult->isSuccess()) {
  5007. $this->objDOrder->rollBack();
  5008. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  5009. }
  5010. }
  5011. //锁定库存数据
  5012. $lockInventoryData[] = [
  5013. 'warehouseId' => $warehouse['id'],
  5014. 'materielId' => $val['goodsBasicId'],
  5015. 'lockingNum' => empty((float)($val['conversion'])) ? $val['buyNum'] : bcdiv($val['buyNum'], $val['conversion']),
  5016. 'originId' => $params['orderId'],
  5017. 'originNo' => $order['no'],
  5018. 'source' => StatusCode::$orderType['saleOrder'],
  5019. 'sourceNo' => $order['no'],
  5020. 'operatorId' => $order['customerId'],
  5021. 'operatorName' => $order['customerName'],
  5022. 'skuId' => $val['skuId'],
  5023. ];
  5024. }
  5025. }
  5026. //锁定库存
  5027. // $lockInventoryResult = $objMInventory->updateLockInventory($lockInventoryData);
  5028. // if (!$lockInventoryResult->isSuccess()) {
  5029. // $this->objDOrder->rollBack();
  5030. // return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  5031. // }
  5032. //修改收货人
  5033. $dbResult = $objMOrderReceive->updateReceive(
  5034. [
  5035. 'customerCode' => $addressData['customerCode'],//客户编码
  5036. 'realName' => $addressData['name'],//收货人姓名
  5037. 'mobile' => $addressData['mobile'],//收货人电话
  5038. 'address' => $addressData['address'],//收货人详细地址
  5039. 'provinceCode' => $addressData['provinceCode'],
  5040. 'cityCode' => $addressData['cityCode'],
  5041. 'districtCode' => $addressData['districtCode'],
  5042. ],
  5043. [
  5044. 'orderId' => $params['orderId']
  5045. ]
  5046. );
  5047. if (!$dbResult->isSuccess()) {
  5048. $this->objDOrder->rollBack();
  5049. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  5050. }
  5051. $this->objDOrder->commit();
  5052. /*
  5053. $_id = self::createEsDocumentId($params['orderId']);
  5054. $this->objDOrder->esupdateTypeFieldVaule([
  5055. 'totalMoney' => $commonData['totalMoney'],
  5056. 'payAmount' => $commonData['payMoney'],
  5057. 'buyTotal' => array_sum(array_column($commonData['goodsData'], 'buyNum')),//购买总数
  5058. 'deliveryType' => $params['deliveryType'],
  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. ], $_id);
  5066. //修改es中的数据*/
  5067. return ResultWrapper::success('操作成功');
  5068. }
  5069. /**
  5070. * 订单编辑(现在只能编辑订单支付金额)
  5071. * @param $params
  5072. * @return ResultWrapper
  5073. */
  5074. public function orderEdit($params)
  5075. {
  5076. $order = $this->objDOrder->get(['id' => $params['orderId']]);
  5077. if ($order === false) {
  5078. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5079. }
  5080. if (empty($order)) {
  5081. return ResultWrapper::fail('订单不存在', ErrorCode::$paramError);
  5082. }
  5083. if (!isset($order['auditStatus'])
  5084. || $order['auditStatus'] == StatusCode::$auditStatus['auditPass']
  5085. || $order['payStatus'] == StatusCode::$standard
  5086. ) {
  5087. return ResultWrapper::fail('订单不能编辑', ErrorCode::$paramError);
  5088. }
  5089. //修改payAmount,将payAmount复制到字段originPayAmount
  5090. $update = [
  5091. 'payAmount' => sprintf("%.2f", $params['editAmount']),
  5092. 'originPayAmount' => $order['payAmount'],//原付款金额
  5093. ];
  5094. $dbResult = $this->objDOrder->update($update, ['id' => $params['orderId']]);
  5095. if ($dbResult === false) {
  5096. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5097. }
  5098. /*
  5099. //修改es中的数据
  5100. $_id = self::createEsDocumentId($params['orderId']);
  5101. $this->objDOrder->esupdateTypeFieldVaule([
  5102. 'payAmount' => $update['payAmount'],
  5103. 'originPayAmount' => $update['originPayAmount'],//原付款金额
  5104. ], $_id);*/
  5105. return ResultWrapper::success('操作成功');
  5106. }
  5107. /**
  5108. * Doc: (des="")
  5109. * User: XMing
  5110. * Date: 2020/9/2
  5111. * Time: 9:16 上午
  5112. * @param array $params
  5113. * @return ResultWrapper
  5114. *
  5115. * @throws \Exception
  5116. */
  5117. public function cashierOrder(array $params)
  5118. {
  5119. $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
  5120. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  5121. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  5122. $objMCart = new MCart($this->onlineUserId, $this->onlineEnterpriseId);
  5123. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  5124. $objDStaff = new DStaff();
  5125. $objStockCache = new Stock($this->onlineEnterpriseId);
  5126. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  5127. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5128. $goodsCommonData = $params['goodsData'];
  5129. //锁定库存 查询商铺对应的仓库
  5130. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  5131. $modelResult = $objMShop->getShopDataByShopIds(array_column($goodsCommonData['goodsData'], 'shopId'));
  5132. if (!$modelResult->isSuccess()) {
  5133. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  5134. }
  5135. $shopData = $modelResult->getData();
  5136. if (empty($shopData)) {
  5137. return ResultWrapper::fail('获取店铺数据失败', ErrorCode::$paramError);
  5138. }
  5139. //获取收银员信息
  5140. $allUids = [$this->loginUserCenterId];
  5141. if (isset($params['guideUids']) && !empty($params['guideUids'])) {
  5142. $ids = explode(',', $params['guideUids']);
  5143. $allUids = array_merge($allUids, $ids);
  5144. }
  5145. $userMap = [];
  5146. if (!empty($allUids)) {
  5147. $staffList = $objDStaff->select(['userCenterId' => $allUids], 'userCenterId,staffName');
  5148. if ($staffList === false) {
  5149. return ResultWrapper::fail($objDStaff->error(), ErrorCode::$dberror);
  5150. }
  5151. foreach ($staffList as $value) {
  5152. $userMap[$value['userCenterId']] = $value['staffName'];
  5153. }
  5154. }
  5155. $params['cashierName'] = isset($userMap[$this->loginUserCenterId]) ? $userMap[$this->loginUserCenterId] : '超级管理员';
  5156. $nameStr = '';
  5157. if (!empty($ids)) {
  5158. foreach ($ids as $uid) {
  5159. if (!empty($nameStr)) {
  5160. $nameStr .= ',';
  5161. }
  5162. $nameStr .= isset($userMap[$uid]) ? $userMap[$uid] : '';
  5163. }
  5164. }
  5165. $params['guideName'] = $nameStr;
  5166. $params['customerMobile'] = '';
  5167. //获取客户信息
  5168. $customerOwe = 0;
  5169. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  5170. $customerData = [
  5171. 'id' => StatusCode::$noneCustomer,
  5172. 'name' => '匿名客户'
  5173. ];
  5174. } else {
  5175. $customerDataResult = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  5176. if (!$customerDataResult->isSuccess()) {
  5177. return ResultWrapper::fail($customerDataResult->getData(), $customerDataResult->getErrorCode());
  5178. }
  5179. $customerData = $customerDataResult->getData();
  5180. //获取客户当前欠款
  5181. if (isset($customerData['id'])) {
  5182. $customerOwe = $objMCustomerBalance->getCustomerBalance($customerData['id']);
  5183. }
  5184. //获取客户手机号
  5185. $objDUserCenter = new DUserCenter();
  5186. $userInfo = $objDUserCenter->get(['id' => $this->onlineUserId], 'mobile');
  5187. if ($userInfo === false) {
  5188. return ResultWrapper::fail($objDUserCenter->error(), ErrorCode::$dberror);
  5189. }
  5190. $params['customerMobile'] = isset($userInfo['mobile']) ? $userInfo['mobile'] : '';
  5191. }
  5192. // 生成一个临时三方流水号,用来支持多个子订单作为一个订单支付,支付成功之后更新为对应的实际外部支付流水号
  5193. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['cashierOrder'], $this->onlineUserId);
  5194. $lockInventoryData = [];//锁定库存物料
  5195. $goodsSaleData = [];//销售数据
  5196. $allSn = [];//所有单号
  5197. $allOrderIds = [];//所有订单
  5198. $mapDetails = [];//订单商品
  5199. $createTime = time();
  5200. $allCartIds = [];
  5201. $shopName = '';
  5202. $shopId = 0;//目前只有一个
  5203. $this->objDOrder->beginTransaction();
  5204. foreach ($goodsCommonData['goodsData'] as $key => $val) {
  5205. $sn = createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  5206. //将数据写入索引表
  5207. $shopId = $val['shopId'];
  5208. $orderIndexData = [
  5209. 'shopId' => $val['shopId'],
  5210. 'userCenterId' => $params['userCenterId'],
  5211. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  5212. 'createTime' => time(),
  5213. 'updateTime' => time(),
  5214. 'deleteStatus' => StatusCode::$standard,
  5215. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5216. 'payStatus' => StatusCode::$delete,
  5217. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  5218. 'outStatus' => StatusCode::$delete,
  5219. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  5220. 'deliveryType' => $params['deliveryType'],
  5221. 'payType' => $params['payType'],
  5222. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  5223. 'no' => $sn,
  5224. 'orderType' => StatusCode::$orderType['cashierOrder'],
  5225. 'selfRuleId' => 0,
  5226. 'cashierUid' => $this->loginUserCenterId,
  5227. 'guideUids' => $params['guideUids']
  5228. ];
  5229. //1. 先写索引表
  5230. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5231. $orderId = $this->objDOrderIndex->insert($orderIndexData);
  5232. if ($orderId === false) {
  5233. $this->objDOrder->rollBack();
  5234. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  5235. }
  5236. //3。上门自提订单,生成核销码
  5237. $verifyCode = self::createVerifyCode($orderId);
  5238. //兼容以前代码
  5239. $updateRes = $this->objDOrderIndex->update(['verifyCode' => $verifyCode], ['id' => $orderId]);
  5240. if ($updateRes === false) {
  5241. $this->objDOrder->rollBack();
  5242. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  5243. }
  5244. //订单数据
  5245. $shopName = $val['shopName'];//现在就一个店铺
  5246. $masterOrder = [
  5247. 'id' => $orderId,//订单id
  5248. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  5249. 'userCenterId' => $params['userCenterId'],
  5250. 'shopId' => $val['shopId'],
  5251. 'shopName' => $val['shopName'],
  5252. 'no' => $sn,
  5253. 'outerTradeNo' => $tmpOuterTradeNo,
  5254. 'totalMoney' => $goodsCommonData['totalMoney'],
  5255. 'payAmount' => $goodsCommonData['payMoney'],
  5256. 'customerName' => isset($customerData['name']) ? $customerData['name'] : '',
  5257. 'remark' => $params['remark'],
  5258. 'deliveryType' => $params['deliveryType'],//配送方式
  5259. 'payType' => $params['payType'],//支付方式
  5260. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  5261. 'salesManName' => isset($customerData['salesManName']) ? $customerData['salesManName'] : '',
  5262. 'customerType' => isset($customerData['type']) ? $customerData['type'] : 0,
  5263. 'buyTotal' => array_sum(array_column($val['shopGoodsData'], 'buyNum')),
  5264. 'source' => $params['source'],//来源
  5265. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  5266. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  5267. 'outStatus' => StatusCode::$delete,
  5268. 'createTime' => time(),
  5269. 'updateTime' => time(),
  5270. 'customerOwe' => $customerOwe,//客户当前欠款
  5271. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5272. 'preferential' => $goodsCommonData['preferential'],//优惠券优惠金额
  5273. 'vipDiscount' => isset($goodsCommonData['vipDiscount']) ? $goodsCommonData['vipDiscount'] : 0,//会员卡优惠金额
  5274. 'vipDoubleDiscount' => isset($goodsCommonData['vipDoubleDiscount']) ? $goodsCommonData['vipDoubleDiscount'] : 0,//会员卡折上折优惠金额
  5275. 'originPayAmount' => $goodsCommonData['payMoney'],//原支付金额,
  5276. 'orderType' => StatusCode::$orderType['cashierOrder'],
  5277. 'verifyCode' => $verifyCode,
  5278. 'expressMoney' => isset($goodsCommonData['expressMoney']) ? $goodsCommonData['expressMoney'] : 0,
  5279. 'cashierUid' => $this->loginUserCenterId,
  5280. 'guideUids' => $params['guideUids'],
  5281. 'cashierName' => $params['cashierName'],
  5282. 'guideName' => $params['guideName'],
  5283. 'remMoney' => isset($goodsCommonData['rem_money']) ? $goodsCommonData['rem_money'] : 0,
  5284. 'changeSubMoney' => isset($goodsCommonData['subPrice']) ? $goodsCommonData['subPrice'] : 0,
  5285. 'isNoneUser' => $this->onlineUserId == StatusCode::$noneUserCenter ? StatusCode::$standard : StatusCode::$delete,
  5286. 'customerMobile' => $params['customerMobile'],
  5287. 'serialNum' => $objStockCache->createSerialSn(0,'Order'),
  5288. 'operatorName' => isset($params['operatorName']) ? $params['operatorName'] : '',
  5289. 'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : 0,
  5290. ];
  5291. $allOrderIds[] = $orderId;
  5292. //2。订单表
  5293. $orderId = $this->objDOrder->insert($masterOrder);
  5294. if ($orderId === false) {
  5295. $this->objDOrder->rollBack();
  5296. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5297. }
  5298. $masterOrder['goodsName'] = '';
  5299. foreach ($val['shopGoodsData'] as $k => &$v) {
  5300. $addOrderGoods = [
  5301. 'no' => $sn,
  5302. 'orderId' => $orderId,
  5303. 'goodsId' => $v['goodsId'],
  5304. 'goodsName' => $v['goodsName'],
  5305. 'shopId' => $val['shopId'],//商铺id
  5306. 'shopName' => $val['shopName'],//商铺名称
  5307. 'originPrice' => $v['originPrice'],
  5308. 'price' => $v['price'],
  5309. 'buyNum' => $v['buyNum'],
  5310. 'totalMoney' => $v['totalMoney'],
  5311. 'skuId' => $v['skuId'],
  5312. 'goodsBasicId' => $v['goodsBasicId'],
  5313. 'goodsCode' => $v['goodsCode'],
  5314. 'deliverNum' => $v['buyNum'],//发货数量=购买数量
  5315. 'unitName' => $v['unitName'],//单位名称
  5316. 'conversion' => $v['conversion'],//换算比率
  5317. 'preferential' => $v['preferential'],//优惠券优惠金额
  5318. 'vipDiscount' => $v['vipDiscount'],//会员卡优惠金额
  5319. 'categoryPath' => isset($v['categoryPath']) ? $v['categoryPath'] : '',//分类路径
  5320. 'brandId' => isset($v['brandId']) ? $v['brandId'] : 0,//品牌id
  5321. 'specGroup' => isset($v['specGroup']) && !empty($v['specGroup']) ? json_encode($v['specGroup']) : NULL,
  5322. 'goodsImages' => isset($v['goodsImages']) && is_string($v['goodsImages']) ? $v['goodsImages'] : '',
  5323. 'barCode' => isset($v['barCode']) ? $v['barCode'] : '',
  5324. 'storageCode' => isset($v['storageCode']) ? $v['storageCode'] : '',
  5325. 'categoryName' => isset($v['categoryName']) ? $v['categoryName'] : '',
  5326. 'brandName' => isset($v['brandName']) ? $v['brandName'] : '',
  5327. 'expressMoney' => isset($v['expressMoney']) ? $v['expressMoney'] : 0,
  5328. ];
  5329. $lockInventoryData[] = [
  5330. 'warehouseId' => $shopData[$v['shopId']]['warehouseId'],
  5331. 'materielId' => $v['goodsBasicId'],
  5332. 'materielCode' => $v['goodsCode'],
  5333. 'lockingNum' => $v['buyNum'],
  5334. 'originId' => $orderId,
  5335. 'originNo' => $sn,
  5336. 'source' => StatusCode::$orderType['saleOrder'],
  5337. 'sourceNo' => $sn,
  5338. 'operatorId' => $masterOrder['customerId'],
  5339. 'operatorName' => $masterOrder['customerName'],
  5340. 'skuId' => $v['skuId'],
  5341. ];
  5342. $goodsSaleData [] = [
  5343. 'goodsId' => $addOrderGoods['goodsId'],
  5344. 'skuId' => $addOrderGoods['skuId'],
  5345. 'buyNum' => $addOrderGoods['buyNum'],
  5346. ];
  5347. //活动商品数据
  5348. if ($this->isFront) {
  5349. if (isset($v['activityId']) && $v['activityId'] != 0) {
  5350. $activityData[] = [
  5351. 'goodsId' => $v['goodsId'],
  5352. 'skuId' => $v['skuId'],
  5353. 'activityId' => $v['activityId'],
  5354. 'buyNum' => $v['buyNum']
  5355. ];
  5356. }
  5357. }
  5358. $masterOrder['goodsName'] .= $v['goodsName'] . ' ';
  5359. $result = $objMOrderGoods->addOrderGoods($addOrderGoods);
  5360. if (!$result->isSuccess()) {
  5361. $this->objDOrder->rollBack();
  5362. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5363. }
  5364. $allCartIds[] = $v['cartId'];
  5365. }
  5366. //存入ES
  5367. $masterOrder['verifyCode'] = isset($verifyCode) ? $verifyCode : '';
  5368. self::updateEsData($orderId, $masterOrder, [], $masterOrder['goodsName']);
  5369. $allSn[] = $sn;//所有订单号
  5370. }
  5371. $this->objDOrder->commit();
  5372. $this->objDOrder->beginTransaction();
  5373. //删除购物车内已生成订单商品
  5374. $objMCashierCart = new MCashierCart($this->onlineUserId, $this->onlineEnterpriseId, $this->loginUserCenterId);
  5375. $result = $objMCashierCart->delCart($allCartIds, true);
  5376. if (!$result->isSuccess()) {
  5377. $this->objDOrder->rollBack();
  5378. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5379. }
  5380. //将优惠券改为已使用
  5381. if (isset($goodsCommonData['useCoupon']) && !empty($goodsCommonData['useCoupon'])) {
  5382. $result = $objMUserCoupon->updateIsUse(['id' => $goodsCommonData['useCoupon']['id']], ['isUse' => StatusCode::$delete, 'useTime' => time()]);
  5383. if (!$result->isSuccess()) {
  5384. $this->objDOrder->rollBack();
  5385. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  5386. }
  5387. }
  5388. //锁定库存商品数量
  5389. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  5390. //$shopId,
  5391. $lockInventoryResult = $objMInventory->updateLockInventory($lockInventoryData);
  5392. if (!$lockInventoryResult->isSuccess()) {
  5393. $this->objDOrder->rollBack();
  5394. return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  5395. }
  5396. //增加销量
  5397. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  5398. if (!empty($goodsSaleData)) {
  5399. foreach ($goodsSaleData as $value) {
  5400. $res = $objMGoods->updateSalesNum($value['goodsId'], $value['skuId'], $value['buyNum']);
  5401. if ($res === false) {
  5402. Logger::logs(E_USER_ERROR, '错误', __CLASS__, __LINE__, '商品增加销量失败');
  5403. }
  5404. }
  5405. }
  5406. //file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/MSaleOrder_error.log', date('Y-m-d H:i:s') . '数据:' . var_export($mapDetails, true) . PHP_EOL, FILE_APPEND);
  5407. $this->objSaleOrder->setGoodsDetails($mapDetails);
  5408. //统计订单信息
  5409. self::noticeStatistics([
  5410. 'userCenterId' => $params['userCenterId'],
  5411. 'enterpriseId' => $this->onlineEnterpriseId,
  5412. 'customerId' => $params['customerId'],
  5413. 'no' => $allSn,
  5414. 'noticeType' => 'create',
  5415. ], 'MOrderStatistics');
  5416. //写日志
  5417. foreach ($allSn as $sn) {
  5418. parent::saveLog([
  5419. 'no' => $sn,
  5420. 'actionType' => '创建订单',//创建订单
  5421. 'operationData' => '',
  5422. 'userCenterId' => $params['userCenterId'],
  5423. 'enterpriseId' => $this->onlineEnterpriseId,
  5424. 'createTime' => time(),
  5425. ]);
  5426. }
  5427. //自动审核订单
  5428. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  5429. foreach ($allOrderIds as $key => $id) {
  5430. //自动审核订单
  5431. $auditResult = self::updateAuditStatus([
  5432. 'id' => $id,
  5433. 'audit' => '自动审核',
  5434. 'auditId' => $this->onlineUserId,
  5435. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  5436. ]);
  5437. if (!$auditResult->isSuccess()) {
  5438. $this->objDOrder->rollBack();
  5439. return ResultWrapper::fail($auditResult->getData(), $auditResult->getErrorCode());
  5440. }
  5441. $outId = $auditResult->getData();//出库单id
  5442. //自动出库
  5443. $dbResult = $objMInventoryOut->updateInventoryOutStatus(['id' => $outId, 'auditId' => $this->loginUserCenterId, 'auditName' => '销售自动审核']);
  5444. if (!$dbResult->isSuccess()) {
  5445. $this->objDOrder->rollBack();
  5446. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5447. }
  5448. }
  5449. //确认收款
  5450. $dbResult = self::updateOrderPayData(['payStatus' => StatusCode::$standard, 'payTime' => time()], ['id' => $allOrderIds]);
  5451. if (!$dbResult->isSuccess()) {
  5452. $this->objDOrder->rollBack();
  5453. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5454. }
  5455. //确认收货
  5456. foreach ($allOrderIds as $orderId) {
  5457. $dbResult = self::updateOrderStatus($orderId, ['orderStatus' => StatusCode::$orderStatus['finish']], []);
  5458. if (!$dbResult->isSuccess()) {
  5459. $this->objDOrder->rollBack();
  5460. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  5461. }
  5462. $objMCashier = new MCashier($this->onlineUserId, $this->onlineEnterpriseId);
  5463. $cashierResult = $objMCashier->calculatePushMoney($orderId);
  5464. if (!$cashierResult->isSuccess()) {
  5465. Logger::logs(E_USER_ERROR, '订单提成计算失败', __CLASS__, __LINE__, $cashierResult->getData());
  5466. }
  5467. }
  5468. //创建收款单
  5469. $received = [
  5470. 'currentAccountName' => $params['currentAccountName'],
  5471. 'financeType' => '销售收款',
  5472. 'financeTypeId' => 2,
  5473. 'shopId' => $shopId,
  5474. 'shopName' => $shopName,
  5475. 'receiptTime' => time(),
  5476. 'operatorId' => $this->loginUserCenterId,
  5477. 'accountList' => $params['accountList'],
  5478. 'customerId' => $customerData['id'],
  5479. 'customerName' => $customerData['name'],
  5480. 'sourceNo' => $sn,
  5481. 'sourceNoMoney' => $goodsCommonData['payMoney'],
  5482. 'createTime' => time(),
  5483. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  5484. 'updateTime' => time(),
  5485. ];
  5486. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->loginUserCenterId);
  5487. $receivedResult = $objMReceived->addReceived($received, true);
  5488. if (!$receivedResult->isSuccess()) {
  5489. $this->objDOrder->rollBack();
  5490. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  5491. }
  5492. $this->objDOrder->commit();
  5493. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  5494. $objDCashierCustomerPrice = new DCashierCustomerPrice();
  5495. $objDCashierCustomerPrice->setTable('qianniao_cashier_customer_price_' . $this->onlineEnterpriseId);
  5496. $objDCashierCustomerPrice->delete(['cashierUid' => $this->loginUserCenterId, 'customerUid' => StatusCode::$noneUserCenter]);
  5497. }
  5498. return ResultWrapper::success($orderId);
  5499. }
  5500. /**
  5501. * 订单打印小票
  5502. */
  5503. public function printOrder()
  5504. {
  5505. $data = [];
  5506. $goodsDetails = $this->objSaleOrder->getGoodsDetails();
  5507. foreach ($goodsDetails as $value) {
  5508. $data[$value['goodsId']]['title'] = $value['goodsName'];
  5509. $data[$value['goodsId']]['skuData'][] = [
  5510. 'skuName' => isset($value['specName']) ? $value['specName'] : '',
  5511. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  5512. 'unitPrice' => isset($value['unitPrice']) ? $value['unitPrice'] : 0.00,
  5513. 'num' => isset($value['buyNum']) ? $value['buyNum'] : 0,
  5514. 'amountPrice' => isset($value['totalMoney']) ? $value['totalMoney'] : 0
  5515. ];
  5516. }
  5517. $printData = [
  5518. 'createTime' => $this->objSaleOrder->getCreateTime(),
  5519. 'shopName' => $this->objSaleOrder->getShopName(),
  5520. 'title' => $this->objSaleOrder->getReceiptTitle(),
  5521. 'codeName' => $this->objSaleOrder->getCodeName(),
  5522. 'code' => $this->objSaleOrder->getNo(),
  5523. 'userName' => $this->objSaleOrder->getCustomerName(),
  5524. 'mobile' => $this->objSaleOrder->getCustomerMobile(),
  5525. 'preferential' => $this->objSaleOrder->getPreferentialAmount(), //优惠金额
  5526. 'totalMoney' => $this->objSaleOrder->getTotalAmount(),
  5527. 'payAmount' => $this->objSaleOrder->getPayAmount(),
  5528. 'address' => $this->objSaleOrder->getAddress(),
  5529. 'details' => $data
  5530. ];
  5531. $formatPrint = parent::formatMsg($printData);
  5532. $objCloudPrint = new CloudPrint();
  5533. $objCloudPrint->sendMsg($formatPrint, $this->onlineEnterpriseId);
  5534. }
  5535. /**
  5536. * 将所有商品库存转换为主单位sku
  5537. * @param $data
  5538. * @return array|ResultWrapper
  5539. * @throws \Exception
  5540. */
  5541. public function formatMerge($data)
  5542. {
  5543. //将相同的商品合并到一起并启用到主单位的
  5544. $allMapping = [];
  5545. if (empty($data)) return $data;
  5546. $allMapping = [];
  5547. $all = [];
  5548. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  5549. $res = $objMSku->getMaterSkuId(['goodsId' => array_values(array_unique(array_column($data, 'goodsBasicId'))), 'isMaster' => StatusCode::$standard, 'deleteStatus' => StatusCode::$standard]);
  5550. if (!$res->isSuccess()) {
  5551. return ResultWrapper::fail($res->getData(), ErrorCode::$dberror);
  5552. }
  5553. $skuData = $res->getData();
  5554. foreach ($data as &$goods) {
  5555. $goods['masterSkuId'] = $skuData[$goods['goodsBasicId']];
  5556. $allMapping[$goods['goodsId']][] = [
  5557. 'buyNum' => $goods['conversion'] == 0 ? $goods['buyNum'] : bcdiv($goods['buyNum'], $goods['conversion'], 2),
  5558. 'skuId' => $goods['skuId'],
  5559. 'conversion' => $goods['conversion'],
  5560. 'goodsId' => $goods['goodsId'],
  5561. 'masterSkuId' => $goods['masterSkuId']
  5562. ];
  5563. }
  5564. unset($goods);
  5565. foreach ($allMapping as $key => $goods) {
  5566. $all[] = [
  5567. 'buyNum' => array_sum(array_column($allMapping[$key], 'buyNum')),
  5568. 'goodsId' => $goods[0]['goodsId'],
  5569. 'skuId' => $goods[0]['masterSkuId'],//都换算成主单位的
  5570. ];
  5571. }
  5572. return ResultWrapper::success($all);
  5573. }
  5574. /**
  5575. * 确认收款检测出库状态
  5576. * @param $id
  5577. * @return ResultWrapper
  5578. */
  5579. public function checkOutOrderStatus($id)
  5580. {
  5581. $dbResult = $this->objDOrder->get_field('outStatus', ['id' => $id]);
  5582. if ($dbResult === false) {
  5583. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5584. }
  5585. if (empty($dbResult)) {
  5586. return ResultWrapper::fail('没有找到订单信息', ErrorCode::$paramError);
  5587. }
  5588. if ($dbResult == StatusCode::$delete) {
  5589. return ResultWrapper::fail('订单未出库暂时不能确认收款', ErrorCode::$paramError);
  5590. }
  5591. return ResultWrapper::success($dbResult);
  5592. }
  5593. /**
  5594. * 销售订单毛利明细
  5595. * @param $params
  5596. * @return ResultWrapper
  5597. * @throws \Exception
  5598. */
  5599. public function getOrderProfit($params,$export = 0)
  5600. {
  5601. $limit = $params['limit'];
  5602. unset($params['limit']);
  5603. $offset = $params['offset'];
  5604. unset($params['offset']);
  5605. if($export){
  5606. $limit = 999;
  5607. $offset = 0;
  5608. }
  5609. $modelResult = self::formatOrderTableName($params);
  5610. if (!$modelResult->isSuccess()) {
  5611. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  5612. }
  5613. $tables = $modelResult->getData();
  5614. if (empty($tables)) {
  5615. return ResultWrapper::fail('表后缀计算失败', ErrorCode::$paramError);
  5616. }
  5617. $whereSql = ' where o.shopId = ' . $params['shopId'] . ' and g.goodsId = ' . $params['goodsId'] . ' and o.createTime between ' . $params['start'] . ' and ' . $params['end'];
  5618. if (isset($params['customerId']) && !empty($params['customerId'])) {
  5619. $whereSql .= ' and customerId = ' . $params['customerId'];
  5620. }
  5621. $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';
  5622. $sql = '';
  5623. foreach ($tables as $value) {
  5624. !empty($sql) && $sql = $sql . ' union all ';
  5625. $orderTableName = 'qianniao_order_' . $this->onlineEnterpriseId . '_' . $value;
  5626. $orderGoodsTableName = 'qianniao_order_goods_' . $this->onlineEnterpriseId . '_' . $value;
  5627. $sql = '(select ' . $field . ' from ' . $orderGoodsTableName . ' g left join ' . $orderTableName . ' o on o.id = g.orderId ' . $whereSql . ')';
  5628. }
  5629. $twoField = 'orderId,no,customerId,customerName,createTime,shopId,shopName,orderStatus,outStatus,orderType,goodsId,goodsCode,goodsName,price,buyNum,discount,outCostPrice,goodsBasicId,skuId,totalMoney';
  5630. $sql = 'select ' . $twoField . ' from (' . $sql . ') as details ';
  5631. $selectSql = $sql . 'order by createTime desc limit ' . $offset . ',' . $limit;
  5632. $dbResult = $this->objDOrder->query($selectSql);
  5633. if ($dbResult === false) {
  5634. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$paramError);
  5635. }
  5636. //提取客户数据
  5637. if (empty($dbResult)) {
  5638. return ResultWrapper::fail('查询结果为空', ErrorCode::$dberror);
  5639. }
  5640. $customerData = [];
  5641. foreach ($dbResult as &$value) {
  5642. if (!isset($customerData[$value['customerId']])) {
  5643. $customerData[$value['customerId']] = [
  5644. 'id' => $value['customerId'],
  5645. 'name' => $value['customerName'],
  5646. ];
  5647. }
  5648. //销售成本
  5649. $value['saleCostAmount'] = bcmul($value['buyNum'], $value['outCostPrice'], 4);
  5650. //销售毛利
  5651. $value['saleProfitAmount'] = bcsub($value['totalMoney'], $value['saleCostAmount'], 8);
  5652. //毛利率
  5653. $value['saleProfitRate'] = "0.00";
  5654. if ($value['saleProfitAmount'] > 0 && $value['saleCostAmount'] > 0) {
  5655. $value['saleProfitRate'] = bcmul(bcdiv($value['saleProfitAmount'], $value['totalMoney'], 8), 100, 4);
  5656. }
  5657. }
  5658. unset($value);
  5659. if($export){
  5660. self::exportOrderProfit($dbResult);
  5661. exit;
  5662. }
  5663. $countSql = 'select count(orderId) as count from ( ' . $sql . ' ) as selectDetails';
  5664. $totalDbResult = $this->objDOrder->query($countSql);
  5665. if ($totalDbResult === false) {
  5666. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5667. }
  5668. $total = array_shift($totalDbResult)['count'];
  5669. $return['data']['customerData'] = array_values($customerData);
  5670. $return['data']['data'] = $dbResult;
  5671. $return['total'] = ($total) ? intval($total) : 0;
  5672. return ResultWrapper::success($return);
  5673. }
  5674. /**
  5675. * 计算表名后缀
  5676. * @param $params
  5677. * @return ResultWrapper
  5678. * @throws \Exception
  5679. */
  5680. public function formatOrderTableName($params)
  5681. {
  5682. $whereSql = '';
  5683. if (isset($params['shopId']) && !empty($params['shopId'])) {
  5684. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5685. $whereSql .= ' shopId = ' . $params['shopId'];
  5686. }
  5687. if (isset($params['customerId']) && !empty($params['customerId'])) {
  5688. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5689. $whereSql .= ' customerId = ' . $params['customerId'];
  5690. }
  5691. if (isset($params['start']) && !empty($params['start']) && isset($params['end']) && !empty($params['end'])) {
  5692. $whereSql = empty($whereSql) ? $whereSql . ' where ' : $whereSql . ' and ';
  5693. $whereSql .= ' createTime between ' . $params['start'] . ' and ' . $params['end'];
  5694. }
  5695. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  5696. $indexSql = 'select userCenterId from ' . $this->objDOrderIndex->get_Table() . $whereSql;
  5697. $dbResult = $this->objDOrderIndex->query($indexSql);
  5698. if ($dbResult === false) {
  5699. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$paramError);
  5700. }
  5701. if (empty($dbResult)) {
  5702. return ResultWrapper::success([]);
  5703. }
  5704. $tables = [];
  5705. foreach ($dbResult as $value) {
  5706. //格式化数据 根据userCenterId 计算所有goods表名
  5707. $num = (int)ceil($value['userCenterId'] / $this->cutTable);
  5708. $tableName = 'qianniao_order_' . $this->onlineEnterpriseId . '_' . $num;
  5709. $existsTable = $this->objDOrder->existsTable($tableName);
  5710. if ($existsTable && !in_array($num, $tables)) {
  5711. $tables[] = $num;
  5712. }
  5713. }
  5714. return ResultWrapper::success($tables);
  5715. }
  5716. /************************************************统计项 start******************************************************/
  5717. /**
  5718. * @param $key
  5719. * @param $shopId
  5720. * @return ResultWrapper
  5721. */
  5722. public function businessOverview($key, $shopId)
  5723. {
  5724. $result = $this->objOverviewCache->getBusinessOverview($this->onlineEnterpriseId, $key, $shopId);
  5725. return $result;
  5726. }
  5727. /**
  5728. * 客单价
  5729. * @param $key
  5730. * @param $shopId
  5731. * @return int|string
  5732. */
  5733. public function customerAverageMoney($key, $shopId)
  5734. {
  5735. $objCustomerCache = new CustomerCache();
  5736. $orderConfirmedMoney = $this->objOverviewCache->getBusinessOverview($this->onlineEnterpriseId, 'orderConfirmedMoney', $shopId);//营业额
  5737. $customerNum = array_sum($objCustomerCache->getTodayCustomerOrderInfo($this->onlineEnterpriseId, null, $shopId));
  5738. if ($orderConfirmedMoney == 0 || $customerNum == 0) return 0;
  5739. return bcdiv($orderConfirmedMoney, $customerNum, 2);
  5740. }
  5741. /**
  5742. * 后置操作
  5743. */
  5744. public function __destruct()
  5745. {
  5746. // TODO: Implement __destruct() method.
  5747. if ($this->isEnablePrint) self::printOrder();
  5748. }
  5749. /**
  5750. * 今日下单客户数量
  5751. * @param $shopId
  5752. * @return int
  5753. */
  5754. public function getTodayCustomerOrderNum($shopId = null)
  5755. {
  5756. $todayStart = date('Y-m-d 00:00:00', time());
  5757. $todayEnd = date('Y-m-d 23:59:59', time());
  5758. $fields = 'id';
  5759. $sql = 'SELECT ' . $fields . ' FROM qianniao_order_index_' . $this->onlineEnterpriseId . '
  5760. WHERE auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' AND
  5761. createTime BETWEEN ' . strtotime($todayStart) . ' AND ' . strtotime($todayEnd);
  5762. if (!empty($shopId)) {
  5763. $sql .= ' and shopId = ' . $shopId;
  5764. }
  5765. $sql .= ' GROUP BY customerId';
  5766. $result = $this->objDOrder->query($sql);
  5767. if ($result === false) {
  5768. Logger::logs(E_USER_ERROR, '查询错误', __CLASS__, __LINE__, $this->objDOrder->error());
  5769. return 0;
  5770. }
  5771. return count((array)$result);
  5772. }
  5773. /**
  5774. * 今日客单价
  5775. * @param null $shopId
  5776. * @return int|string|null
  5777. */
  5778. public function getTodayOrder($shopId = null)
  5779. {
  5780. $todayStart = date('Y-m-d 00:00:00', time());
  5781. $todayEnd = date('Y-m-d 23:59:59', time());
  5782. $fields = 'userCenterId';
  5783. if (!empty($shopId)) {
  5784. $shopId = ' and shopId = ' . $shopId;
  5785. }else{
  5786. $shopId = '';
  5787. }
  5788. $sql = 'select count(distinct '.$fields.') as num ,sum(payAmount) as money from qianniao_order_'. $this->onlineEnterpriseId .'_1' .
  5789. ' where auditStatus = ' . StatusCode::$auditStatus['auditPass'] .'
  5790. and createTime BETWEEN '.strtotime($todayStart). ' and '. strtotime($todayEnd).$shopId;
  5791. $result = $this->objDOrder->query($sql);
  5792. if ($result === false) {
  5793. return 0;
  5794. }
  5795. $num = $result[0]['num'];
  5796. $money = $result[0]['money'];
  5797. if (empty($money) || empty($num)) {
  5798. return 0;
  5799. }
  5800. return bcdiv($money, $num, 2);
  5801. }
  5802. /**
  5803. * Doc: (des="订单分配业务员")
  5804. * User: XMing
  5805. * Date: 2020/8/26
  5806. * Time: 3:39 下午
  5807. * @param array $params
  5808. * @return ResultWrapper
  5809. * @throws \Exception
  5810. */
  5811. public function setSalesMan(array $params)
  5812. {
  5813. //在索引表中查询订单
  5814. $orderIndex = $this->objDOrderIndex->get(['id' => $params['orderId']]);
  5815. if ($orderIndex === false) {
  5816. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5817. }
  5818. if (empty($orderIndex)) {
  5819. return ResultWrapper::fail('未查询到指定订单', ErrorCode::$paramError);
  5820. }
  5821. if (!empty($orderIndex['salesManId'])) {
  5822. return ResultWrapper::fail('已分配过业务员', ErrorCode::$paramError);
  5823. }
  5824. $dbResult = $this->objDCustomer->get(['id' => $orderIndex['customerId']]);
  5825. if ($dbResult === false) {
  5826. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  5827. }
  5828. $customerInfo = $dbResult;
  5829. if (empty($customerInfo)) {
  5830. return ResultWrapper::fail('未查询到指定客户', ErrorCode::$dberror);
  5831. }
  5832. if($params['ifSalesMan'] == StatusCode::$delete){
  5833. if ( !empty($customerInfo['salesManId']) && $customerInfo['salesManId'] != $params['salesManId'] ) {
  5834. return ResultWrapper::fail('客户只能分配当前 -'.$customerInfo['salesManName'].' -业务员', ErrorCode::$paramError);
  5835. }
  5836. $salesManId = $params['salesManId'];
  5837. $salesManName = $params['salesManName'];
  5838. }else{
  5839. $salesManId = $customerInfo['salesManId'];
  5840. $salesManName = $customerInfo['salesManName'];
  5841. }
  5842. //更新数据
  5843. $time = time();
  5844. $beginStatus = $this->objDOrderIndex->beginTransaction();
  5845. //给客户分配业务员
  5846. if($params['ifSalesMan'] == StatusCode::$delete){
  5847. $dbResult = $this->objDCustomer->update(['salesManId' => $salesManId, 'salesManName' => $salesManName], ['id' => $orderIndex['customerId']]);
  5848. if ($dbResult === false) {
  5849. $this->objDOrderIndex->rollBack();
  5850. return ResultWrapper::fail($this->objDCustomer->error(), ErrorCode::$dberror);
  5851. }
  5852. }
  5853. //更新订单表
  5854. //只更新该订单
  5855. $dbResult = $this->objDOrderIndex->update(['salesManId' => $salesManId, 'updateTime' => $time], ['id' => $params['orderId']]);
  5856. if($dbResult === false){
  5857. $this->objDOrderIndex->rollBack();
  5858. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5859. }
  5860. $updateData = ['salesManId' => $salesManId, 'salesManName' => $salesManName, 'updateTime' => $time];
  5861. $dbResult = $this->objDOrder->update($updateData, ['id' => $params['orderId']]);
  5862. if($dbResult === false){
  5863. $this->objDOrderIndex->rollBack();
  5864. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5865. }
  5866. /* //获取此客户未分配业务员的订单
  5867. $orderIndexLists = $this->objDOrderIndex->select(['salesManId' => 0, 'customerId' => $orderIndex['customerId']]);
  5868. if ($orderIndexLists === false) {
  5869. $this->objDOrderIndex->rollBack();
  5870. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5871. }
  5872. if (empty($orderIndexLists)) {
  5873. $this->objDOrderIndex->rollBack();
  5874. return ResultWrapper::fail('未查询到需要更新的数据', ErrorCode::$paramError);
  5875. }
  5876. //计算数据的分表
  5877. $updateData = ['salesManId' => $params['salesManId'], 'salesManName' => $params['salesManName'], 'updateTime' => $time];
  5878. $allGroupData = [];
  5879. $allOrderIds = [];
  5880. foreach ($orderIndexLists as $key => $val) {
  5881. $tableNum = ceil($val['userCenterId'] / $this->cutTable);
  5882. $allGroupData[$tableNum][] = $val['id'];
  5883. $allOrderIds[] = $val['id'];
  5884. }
  5885. //更新订单索引表
  5886. $updateOrderIndex = $this->objDOrderIndex->update(['salesManId' => $params['salesManId'], 'updateTime' => $time], ['id' => $allOrderIds]);
  5887. if ($updateOrderIndex === false) {
  5888. $this->objDOrderIndex->rollBack();
  5889. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5890. }
  5891. //在对应分表中更新数据
  5892. foreach ($allGroupData as $k => $orderIds) {
  5893. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $k);
  5894. $updateOrder = $this->objDOrder->update($updateData, ['id' => $orderIds]);
  5895. if ($updateOrder === false) {
  5896. $this->objDOrderIndex->rollBack();
  5897. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  5898. }
  5899. }*/
  5900. /*
  5901. //修改es
  5902. foreach ($allOrderIds as $orderId) {
  5903. $_id = self::createEsDocumentId($orderId);
  5904. $this->objDOrder->esupdateTypeFieldVaule($updateData, $_id);
  5905. }*/
  5906. $beginStatus && $this->objDOrderIndex->commit();
  5907. return ResultWrapper::success('操作成功');
  5908. }
  5909. /**
  5910. * Doc: (des="")
  5911. * User: XMing
  5912. * Date: 2020/9/4
  5913. * Time: 12:21 下午
  5914. * @param string $verifyCode
  5915. * @return ResultWrapper
  5916. * @throws \Exception
  5917. */
  5918. public function getOrderByVerifyCode(string $verifyCode)
  5919. {
  5920. $orderId = $this->objDOrderIndex->get_field('id', ['verifyCode' => $verifyCode]);
  5921. if ($orderId === false) {
  5922. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5923. }
  5924. if (empty($orderId)) {
  5925. return ResultWrapper::fail('核销码已失效或不存在', ErrorCode::$paramError);
  5926. }
  5927. $orderInfoResult = self::getOrderInfoById($orderId);
  5928. if (!$orderInfoResult->isSuccess()) {
  5929. return ResultWrapper::fail($orderInfoResult->getData(), $orderInfoResult->getErrorCode());
  5930. }
  5931. return ResultWrapper::success($orderInfoResult->getData());
  5932. }
  5933. /**
  5934. * Doc: (des="核销订单")
  5935. * User: XMing
  5936. * Date: 2020/9/4
  5937. * Time: 2:34 下午
  5938. * @param int $id
  5939. * @param array $header
  5940. * @return ResultWrapper
  5941. * @throws \Exception
  5942. */
  5943. public function verification(int $id, $header)
  5944. {
  5945. $orderInfo = $this->objDOrderIndex->get(['id' => $id]);
  5946. if ($orderInfo === false) {
  5947. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5948. }
  5949. if (empty($orderInfo)) {
  5950. return ResultWrapper::fail('未获取到指定订单', ErrorCode::$paramError);
  5951. }
  5952. if ($orderInfo['orderStatus'] == StatusCode::$orderStatus['close']) {
  5953. return ResultWrapper::fail('订单已取消', ErrorCode::$paramError);
  5954. }
  5955. if ($orderInfo['orderStatus'] == StatusCode::$orderStatus['finish']) {
  5956. return ResultWrapper::fail('订单已经核销过了', ErrorCode::$paramError);
  5957. }
  5958. if ($orderInfo['auditStatus'] != StatusCode::$auditStatus['auditPass']) {
  5959. return ResultWrapper::fail('订单尚未审核', ErrorCode::$paramError);
  5960. }
  5961. if ($orderInfo['outStatus'] != StatusCode::$standard) {
  5962. return ResultWrapper::fail('订单还没有出库,不能进行核销操作', ErrorCode::$paramError);
  5963. }
  5964. $orderResult = self::updateOrderStatus($id, ['orderStatus' => StatusCode::$standard], $header);
  5965. if (!$orderResult->isSuccess()) {
  5966. return ResultWrapper::fail($orderResult->getData(), $orderResult->getErrorCode());
  5967. }
  5968. return ResultWrapper::success($orderResult->getData());
  5969. }
  5970. /**
  5971. * Doc: (des="")
  5972. * User: XMing
  5973. * Date: 2020/9/8
  5974. * Time: 7:14 下午
  5975. * @param int $id
  5976. * @return ResultWrapper
  5977. */
  5978. public function getExpressInfoByOrderId(int $id)
  5979. {
  5980. $orderIndex = $this->objDOrderIndex->get(['id' => $id]);
  5981. if ($orderIndex === false) {
  5982. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  5983. }
  5984. if (empty($orderIndex)) {
  5985. return ResultWrapper::fail('为获取到指定订单', ErrorCode::$paramError);
  5986. }
  5987. if (empty($orderIndex['deliveryNo']) || empty($orderIndex['expressId'])) {
  5988. return ResultWrapper::success([]);
  5989. }
  5990. $objDExpressCode = new DExpressCode();
  5991. $expressCode = $objDExpressCode->get(['id' => $orderIndex['expressId']]);
  5992. if ($expressCode === false) {
  5993. return ResultWrapper::fail($objDExpressCode->error(), ErrorCode::$dberror);
  5994. }
  5995. if (empty($expressCode)) {
  5996. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  5997. }
  5998. $objMBasicSetup = new MBasicSetup($this->onlineEnterpriseId);
  5999. $basicSetupResult = $objMBasicSetup->getBasicField('logistics_form');
  6000. if (!$basicSetupResult->isSuccess()) {
  6001. return ResultWrapper::fail($basicSetupResult->getData(), $basicSetupResult->getErrorCode());
  6002. }
  6003. $basicSetup = $basicSetupResult->getData();
  6004. $basicSetup = isset($basicSetup['logistics_form']) ? $basicSetup['logistics_form'] : [];
  6005. if (!isset($basicSetup['express_type']) || empty($basicSetup['express_type'])) {
  6006. return ResultWrapper::fail('未配置物流接口', ErrorCode::$paramError);
  6007. }
  6008. $map = [];
  6009. $return = [
  6010. 'list' => [],
  6011. 'stateMsg' => '',
  6012. 'nu' => $orderIndex['deliveryNo'],
  6013. 'expressName' => $expressCode['name']
  6014. ];
  6015. switch ($basicSetup['express_type']) {
  6016. case 'express_hundred':
  6017. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6018. $this->objDOrderReceive->setTable('qianniao_order_receive_' . $this->onlineEnterpriseId . '_' . $fix);
  6019. $mobile = $this->objDOrderReceive->get_field('mobile', ['orderId' => $orderIndex['id']]);
  6020. if ($mobile === false) {
  6021. return ResultWrapper::fail($this->objDOrderReceive->error(), ErrorCode::$dberror);
  6022. }
  6023. if (!isset($basicSetup['express_hundred'])) {
  6024. return ResultWrapper::fail('快递100未进行配置', ErrorCode::$paramError);
  6025. }
  6026. $express_hundred = $basicSetup['express_hundred'];
  6027. if (!isset($express_hundred['customerCode']) || empty($express_hundred['customerCode']) ||
  6028. !isset($express_hundred['accessKey']) || empty($express_hundred['accessKey'])) {
  6029. return ResultWrapper::fail('快递100配置有误', ErrorCode::$paramError);
  6030. }
  6031. /*$kuaidi100Config = Factory::config()->get('kuaidi100');
  6032. if(empty($kuaidi100Config) || !isset($kuaidi100Config['customer']) || !isset($kuaidi100Config['key']) ){
  6033. return ResultWrapper::fail('快递100配置有误',ErrorCode::$paramError);
  6034. }*/
  6035. //$objQuery = new Query($kuaidi100Config['customer'], $kuaidi100Config['key']);
  6036. /*$kuaidiData = [
  6037. 'com' => 'yunda',
  6038. 'num' => '3103922659603',
  6039. 'phone' => 17600105150,
  6040. ];*/
  6041. $objQuery = new Query($express_hundred['customerCode'], $express_hundred['accessKey']);
  6042. $kuaidiData = [
  6043. 'com' => $expressCode['kuaidi100'],
  6044. 'num' => $orderIndex['deliveryNo'],
  6045. 'phone' => $mobile,
  6046. ];
  6047. $result = $objQuery->pollQuery($kuaidiData);
  6048. if (!$result->isSuccess()) {
  6049. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  6050. }
  6051. $resultData = $result->getData();
  6052. $list = isset($resultData['data']) ? $resultData['data'] : [];
  6053. $return['stateMsg'] = $objQuery->getState(isset($resultData['state']) ? $resultData['state'] : 0);
  6054. $map = self::formatExpressList($list, 'express_hundred');
  6055. break;
  6056. case 'express_bird':
  6057. if (!isset($basicSetup['express_bird'])) {
  6058. return ResultWrapper::fail('快递鸟未进行配置', ErrorCode::$paramError);
  6059. }
  6060. $express_bird = $basicSetup['express_bird'];
  6061. if (!isset($express_bird['userId']) || empty($express_bird['userId']) ||
  6062. !isset($express_bird['apiKey']) || empty($express_bird['apiKey'])) {
  6063. return ResultWrapper::fail('快递鸟配置有误', ErrorCode::$paramError);
  6064. }
  6065. /*$kdniaoConfig = Factory::config()->get('kdniao');
  6066. if(empty($kdniaoConfig) || !isset($kdniaoConfig['EBusinessID']) || !isset($kdniaoConfig['key']) ){
  6067. return ResultWrapper::fail('快递鸟配置错误', ErrorCode::$configEroor);
  6068. }*/
  6069. //$objQuery = new KDNiaoQuery($kdniaoConfig['EBusinessID'], $kdniaoConfig['key']);
  6070. /*$kuaidiData = [
  6071. 'com' => 'HTKY',
  6072. 'num' => '557021498255630',
  6073. ];*/
  6074. $objQuery = new KDNiaoQuery($express_bird['userId'], $express_bird['apiKey']);
  6075. $kuaidiData = [
  6076. 'com' => $expressCode['kdniao'],
  6077. 'num' => $orderIndex['deliveryNo'],
  6078. ];
  6079. $result = $objQuery->EbusinessOrderHandle($kuaidiData);
  6080. if (!$result->isSuccess()) {
  6081. return ResultWrapper::fail('获取物流信息失败', ErrorCode::$paramError);
  6082. }
  6083. $resultData = $result->getData();
  6084. $list = isset($resultData['Traces']) ? $resultData['Traces'] : [];
  6085. $return['stateMsg'] = $objQuery->getState(isset($resultData['State']) ? $resultData['State'] : 0);
  6086. $map = self::formatExpressList($list, 'express_bird');
  6087. break;
  6088. }
  6089. $return['list'] = $map;
  6090. return ResultWrapper::success($return);
  6091. }
  6092. /**
  6093. * Doc: (des="修改订单的发货信息")
  6094. * User: XMing
  6095. * Date: 2020/9/9
  6096. * Time: 11:12 上午
  6097. * @param string $no
  6098. * @param array $params
  6099. * @param int $orderId
  6100. * @return ResultWrapper
  6101. * @throws \Exception
  6102. */
  6103. public function editOrderExpress(string $no, array $params, int $orderId = 0)
  6104. {
  6105. if (empty($orderId)) {
  6106. $orderIndex = $this->objDOrderIndex->get(['no' => $no]);
  6107. } else {
  6108. $orderIndex = $this->objDOrderIndex->get(['id' => $orderId]);
  6109. }
  6110. if ($orderIndex === false) {
  6111. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6112. }
  6113. if (empty($orderIndex)) {
  6114. return ResultWrapper::fail('未获取到指定订单信息' . $no, ErrorCode::$paramError);
  6115. }
  6116. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6117. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  6118. $this->objDOrderIndex->beginTransaction();
  6119. if (isset($params['deliveryType']) && $params['deliveryType'] == StatusCode::$deliveryType['logistics']){
  6120. $update = [
  6121. 'logisticsData' => json_encode($params['logisticsData']),
  6122. 'updateTime' => time(),
  6123. ];
  6124. }else{
  6125. $update = [
  6126. 'deliveryNo' => isset($params['deliveryNo']) ? $params['deliveryNo'] : '',
  6127. 'expressName' => isset($params['expressName']) ? $params['expressName'] : '',
  6128. 'expressId' => isset($params['expressId']) ? $params['expressId'] : 0,
  6129. 'updateTime' => time(),
  6130. ];
  6131. $updateIndex = $this->objDOrderIndex->update($update, ['id' => $orderIndex['id']]);
  6132. if ($updateIndex === false) {
  6133. $this->objDOrderIndex->rollBack();
  6134. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6135. }
  6136. }
  6137. $updateOrder = $this->objDOrder->update($update, ['id' => $orderIndex['id']]);
  6138. if ($updateOrder === false) {
  6139. $this->objDOrderIndex->rollBack();
  6140. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6141. }
  6142. //记录司机id
  6143. $driverId = isset($params['logisticsData']['id']) ? $params['logisticsData']['id'] : '';
  6144. $updatedriverId = $this->objDOrder->update(['driverId'=>$driverId],['id' => $orderIndex['id']]);
  6145. if ($updatedriverId === false) {
  6146. $this->objDOrderIndex->rollBack();
  6147. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6148. }
  6149. /*
  6150. $_id = self::createEsDocumentId($orderIndex['id']);
  6151. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  6152. $this->objDOrderIndex->commit();
  6153. return ResultWrapper::success(true);
  6154. }
  6155. /**
  6156. * Doc: (des="")
  6157. * User: XMing
  6158. * Date: 2020/9/8
  6159. * Time: 8:47 下午
  6160. * @param array $list
  6161. * @param string $type
  6162. * @return array
  6163. */
  6164. private function formatExpressList(array $list, string $type)
  6165. {
  6166. $map = [];
  6167. switch ($type) {
  6168. case 'express_hundred':
  6169. foreach ($list as $value) {
  6170. $map[] = [
  6171. 'context' => $value['context'],
  6172. 'time' => $value['time']
  6173. ];
  6174. }
  6175. break;
  6176. case 'express_bird':
  6177. foreach ($list as $value) {
  6178. $map[] = [
  6179. 'context' => $value['AcceptStation'],
  6180. 'time' => $value['AcceptTime']
  6181. ];
  6182. }
  6183. $map = array_reverse($map);
  6184. break;
  6185. }
  6186. return $map;
  6187. }
  6188. /**
  6189. * Doc: (des="")
  6190. * User: XMing
  6191. * Date: 2020/10/12
  6192. * Time: 5:31 下午
  6193. * @param array $params
  6194. * @return ResultWrapper
  6195. * @throws \Exception
  6196. */
  6197. public function create(array $params)
  6198. {
  6199. $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
  6200. $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
  6201. $objMCustomerBalance = new MCustomerBalance($this->onlineEnterpriseId, $this->onlineUserId);
  6202. $objMCart = new MCart($this->onlineUserId, $this->onlineEnterpriseId);
  6203. $objMOrderGoods = new MOrderGoods($this->onlineUserId, $this->onlineEnterpriseId);
  6204. $objDStaff = new DStaff();
  6205. $objStockCache = new Stock($this->onlineEnterpriseId);
  6206. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  6207. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  6208. $goodsCommonData = $params['goodsData'];
  6209. //锁定库存 查询商铺对应的仓库
  6210. $objMShop = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
  6211. $modelResult = $objMShop->getShopDataByShopIds(array_column($goodsCommonData['goodsData'], 'shopId'));
  6212. if (!$modelResult->isSuccess()) {
  6213. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  6214. }
  6215. $shopData = $modelResult->getData();
  6216. if (empty($shopData)) {
  6217. return ResultWrapper::fail('获取店铺数据失败', ErrorCode::$paramError);
  6218. }
  6219. $paramsResult = self::getIdsCashierMap($params);
  6220. if (!$paramsResult->isSuccess()) {
  6221. return ResultWrapper::fail($paramsResult->getData(), $paramsResult->getErrorCode());
  6222. }
  6223. $params = $paramsResult->getData();
  6224. //获取客户信息
  6225. $customerOwe = 0;
  6226. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  6227. $customerData = [
  6228. 'id' => StatusCode::$noneCustomer,
  6229. 'name' => '匿名客户'
  6230. ];
  6231. } else {
  6232. $customerDataResult = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
  6233. if (!$customerDataResult->isSuccess()) {
  6234. return ResultWrapper::fail($customerDataResult->getData(), $customerDataResult->getErrorCode());
  6235. }
  6236. $customerData = $customerDataResult->getData();
  6237. //获取客户当前欠款
  6238. if (isset($customerData['id'])) {
  6239. $customerOwe = $objMCustomerBalance->getCustomerBalance($customerData['id']);
  6240. }
  6241. //获取客户手机号
  6242. $objDUserCenter = new DUserCenter();
  6243. $userInfo = $objDUserCenter->get(['id' => $this->onlineUserId], 'mobile');
  6244. if ($userInfo === false) {
  6245. return ResultWrapper::fail($objDUserCenter->error(), ErrorCode::$dberror);
  6246. }
  6247. $params['customerMobile'] = isset($userInfo['mobile']) ? $userInfo['mobile'] : '';
  6248. }
  6249. // 生成一个临时三方流水号,用来支持多个子订单作为一个订单支付,支付成功之后更新为对应的实际外部支付流水号
  6250. $tmpOuterTradeNo = 'tmp' . createOrderSn($params['source'], StatusCode::$orderType['cashierOrder'], $this->onlineUserId);
  6251. $lockInventoryData = [];//锁定库存物料
  6252. $goodsSaleData = [];//销售数据
  6253. $allSn = [];//所有单号
  6254. $allOrderIds = [];//所有订单
  6255. $mapDetails = [];//订单商品
  6256. $createTime = time();
  6257. $allCartIds = [];
  6258. $shopName = '';
  6259. $shopId = 0;//目前只有一个
  6260. $this->objDOrder->beginTransaction();
  6261. foreach ($goodsCommonData['goodsData'] as $key => $val) {
  6262. $sn = createOrderSn($params['source'], StatusCode::$orderType['saleOrder'], $this->onlineUserId);
  6263. //将数据写入索引表
  6264. $shopId = $val['shopId'];
  6265. $orderIndexData = [
  6266. 'shopId' => $val['shopId'],
  6267. 'userCenterId' => $params['userCenterId'],
  6268. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  6269. 'createTime' => time(),
  6270. 'updateTime' => time(),
  6271. 'deleteStatus' => StatusCode::$standard,
  6272. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6273. 'payStatus' => StatusCode::$delete,
  6274. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  6275. 'outStatus' => StatusCode::$delete,
  6276. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  6277. 'deliveryType' => $params['deliveryType'],
  6278. 'payType' => $params['payType'],
  6279. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  6280. 'no' => $sn,
  6281. 'orderType' => StatusCode::$orderType['cashierOrder'],
  6282. 'selfRuleId' => 0,
  6283. 'cashierUid' => $this->loginUserCenterId,
  6284. 'guideUids' => isset($params['guideUids']) ? $params['guideUids'] : '',
  6285. ];
  6286. //1. 先写索引表
  6287. $this->objDOrderIndex->setTable('qianniao_order_index_' . $this->onlineEnterpriseId);
  6288. $orderId = $this->objDOrderIndex->insert($orderIndexData);
  6289. if ($orderId === false) {
  6290. $this->objDOrder->rollBack();
  6291. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  6292. }
  6293. //3。上门自提订单,生成核销码
  6294. $verifyCode = self::createVerifyCode($orderId);
  6295. //兼容以前代码
  6296. $updateRes = $this->objDOrderIndex->update(['verifyCode' => $verifyCode], ['id' => $orderId]);
  6297. if ($updateRes === false) {
  6298. $this->objDOrder->rollBack();
  6299. return ResultWrapper::fail($$this->objDOrderIndex->error(), ErrorCode::$dberror);
  6300. }
  6301. //订单数据
  6302. $shopName = $val['shopName'];//现在就一个店铺
  6303. $masterOrder = [
  6304. 'id' => $orderId,//订单id
  6305. 'customerId' => isset($customerData['id']) ? $customerData['id'] : 0,
  6306. 'userCenterId' => $params['userCenterId'],
  6307. 'shopId' => $val['shopId'],
  6308. 'shopName' => $val['shopName'],
  6309. 'no' => $sn,
  6310. 'outerTradeNo' => $tmpOuterTradeNo,
  6311. 'totalMoney' => $goodsCommonData['totalMoney'],
  6312. 'payAmount' => $goodsCommonData['payMoney'],
  6313. 'customerName' => isset($customerData['name']) ? $customerData['name'] : '',
  6314. 'remark' => $params['remark'],
  6315. 'deliveryType' => $params['deliveryType'],//配送方式
  6316. 'payType' => $params['payType'],//支付方式
  6317. 'salesManId' => isset($customerData['salesManId']) ? $customerData['salesManId'] : 0,
  6318. 'salesManName' => isset($customerData['salesManName']) ? $customerData['salesManName'] : '',
  6319. 'customerType' => isset($customerData['type']) ? $customerData['type'] : 0,
  6320. 'buyTotal' => array_sum(array_column($val['shopGoodsData'], 'buyNum')),
  6321. 'source' => $params['source'],//来源
  6322. 'orderStatus' => StatusCode::$orderStatus['waitPay'],
  6323. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  6324. 'outStatus' => StatusCode::$delete,
  6325. 'createTime' => time(),
  6326. 'updateTime' => time(),
  6327. 'customerOwe' => $customerOwe,//客户当前欠款
  6328. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6329. 'preferential' => $goodsCommonData['preferential'],//优惠券优惠金额
  6330. 'vipDiscount' => isset($goodsCommonData['vipDiscount']) ? $goodsCommonData['vipDiscount'] : 0,//会员卡优惠金额
  6331. 'vipDoubleDiscount' => isset($goodsCommonData['vipDoubleDiscount']) ? $goodsCommonData['vipDoubleDiscount'] : 0,//会员卡折上折优惠金额
  6332. 'originPayAmount' => $goodsCommonData['payMoney'],//原支付金额,
  6333. 'orderType' => StatusCode::$orderType['cashierOrder'],
  6334. 'verifyCode' => $verifyCode,
  6335. 'expressMoney' => isset($goodsCommonData['expressMoney']) ? $goodsCommonData['expressMoney'] : 0,
  6336. 'cashierUid' => $this->loginUserCenterId,
  6337. 'guideUids' => isset($params['guideUids']) ? $params['guideUids'] : '',
  6338. 'cashierName' => $params['cashierName'],
  6339. 'guideName' => $params['guideName'],
  6340. 'remMoney' => isset($goodsCommonData['rem_money']) ? $goodsCommonData['rem_money'] : 0,
  6341. 'changeSubMoney' => isset($goodsCommonData['subPrice']) ? $goodsCommonData['subPrice'] : 0,
  6342. 'isNoneUser' => $this->onlineUserId == StatusCode::$noneUserCenter ? StatusCode::$standard : StatusCode::$delete,
  6343. 'customerMobile' => $params['customerMobile'],
  6344. 'serialNum' => $objStockCache->createSerialSn(0,'Order'),
  6345. 'operatorName' => isset($params['operatorName']) ? $params['operatorName'] : '',
  6346. 'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : 0,
  6347. ];
  6348. $allOrderIds[] = $orderId;
  6349. //2。订单表
  6350. $orderId = $this->objDOrder->insert($masterOrder);
  6351. if ($orderId === false) {
  6352. $this->objDOrder->rollBack();
  6353. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6354. }
  6355. $masterOrder['goodsName'] = '';
  6356. foreach ($val['shopGoodsData'] as $k => &$v) {
  6357. $addOrderGoods = [
  6358. 'no' => $sn,
  6359. 'orderId' => $orderId,
  6360. 'goodsId' => $v['goodsId'],
  6361. 'goodsName' => $v['goodsName'],
  6362. 'shopId' => $val['shopId'],//商铺id
  6363. 'shopName' => $val['shopName'],//商铺名称
  6364. 'originPrice' => $v['originPrice'],
  6365. 'price' => $v['price'],
  6366. 'buyNum' => $v['buyNum'],
  6367. 'totalMoney' => $v['totalMoney'],
  6368. 'skuId' => $v['skuId'],
  6369. 'goodsBasicId' => $v['goodsBasicId'],
  6370. 'goodsCode' => $v['goodsCode'],
  6371. 'deliverNum' => $v['buyNum'],//发货数量=购买数量
  6372. 'unitName' => $v['unitName'],//单位名称
  6373. 'conversion' => $v['conversion'],//换算比率
  6374. 'preferential' => $v['preferential'],//优惠券优惠金额
  6375. 'vipDiscount' => $v['vipDiscount'],//会员卡优惠金额
  6376. 'categoryPath' => isset($v['categoryPath']) ? $v['categoryPath'] : '',//分类路径
  6377. 'brandId' => isset($v['brandId']) ? $v['brandId'] : 0,//品牌id
  6378. 'specGroup' => isset($v['specGroup']) && !empty($v['specGroup']) ? json_encode($v['specGroup']) : NULL,
  6379. 'goodsImages' => isset($v['goodsImages']) && is_string($v['goodsImages']) ? $v['goodsImages'] : '',
  6380. 'barCode' => isset($v['barCode']) ? $v['barCode'] : '',
  6381. 'storageCode' => isset($v['storageCode']) ? $v['storageCode'] : '',
  6382. 'categoryName' => isset($v['categoryName']) ? $v['categoryName'] : '',
  6383. 'brandName' => isset($v['brandName']) ? $v['brandName'] : '',
  6384. 'expressMoney' => isset($v['expressMoney']) ? $v['expressMoney'] : 0,
  6385. ];
  6386. $lockInventoryData[] = [
  6387. 'warehouseId' => $shopData[$v['shopId']]['warehouseId'],
  6388. 'materielId' => $v['goodsBasicId'],
  6389. 'materielCode' => $v['goodsCode'],
  6390. 'lockingNum' => $v['buyNum'],
  6391. 'originId' => $orderId,
  6392. 'originNo' => $sn,
  6393. 'source' => StatusCode::$orderType['saleOrder'],
  6394. 'sourceNo' => $sn,
  6395. 'operatorId' => $masterOrder['customerId'],
  6396. 'operatorName' => $masterOrder['customerName'],
  6397. 'skuId' => $v['skuId'],
  6398. ];
  6399. $goodsSaleData [] = [
  6400. 'goodsId' => $addOrderGoods['goodsId'],
  6401. 'skuId' => $addOrderGoods['skuId'],
  6402. 'buyNum' => $addOrderGoods['buyNum'],
  6403. ];
  6404. //活动商品数据
  6405. if ($this->isFront) {
  6406. if (isset($v['activityId']) && $v['activityId'] != 0) {
  6407. $activityData[] = [
  6408. 'goodsId' => $v['goodsId'],
  6409. 'skuId' => $v['skuId'],
  6410. 'activityId' => $v['activityId'],
  6411. 'buyNum' => $v['buyNum']
  6412. ];
  6413. }
  6414. }
  6415. $masterOrder['goodsName'] .= $v['goodsName'] . ' ';
  6416. $result = $objMOrderGoods->addOrderGoods($addOrderGoods);
  6417. if (!$result->isSuccess()) {
  6418. $this->objDOrder->rollBack();
  6419. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6420. }
  6421. $allCartIds[] = $v['cartId'];
  6422. }
  6423. //存入ES
  6424. $masterOrder['verifyCode'] = isset($verifyCode) ? $verifyCode : '';
  6425. self::updateEsData($orderId, $masterOrder, [], $masterOrder['goodsName']);
  6426. $allSn[] = $sn;//所有订单号
  6427. }
  6428. //将优惠券改为已使用
  6429. if (isset($goodsCommonData['useCoupon']) && !empty($goodsCommonData['useCoupon'])) {
  6430. $result = $objMUserCoupon->updateIsUse(['id' => $goodsCommonData['useCoupon']['id']], ['isUse' => StatusCode::$delete, 'useTime' => time()]);
  6431. if (!$result->isSuccess()) {
  6432. $this->objDOrder->rollBack();
  6433. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6434. }
  6435. }
  6436. //锁定库存商品数量
  6437. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  6438. $lockInventoryResult = $objMInventory->updateLockInventory($lockInventoryData);
  6439. if (!$lockInventoryResult->isSuccess()) {
  6440. $this->objDOrder->rollBack();
  6441. return ResultWrapper::fail($lockInventoryResult->getData(), $lockInventoryResult->getErrorCode());
  6442. }
  6443. //增加销量
  6444. $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
  6445. if (!empty($goodsSaleData)) {
  6446. foreach ($goodsSaleData as $value) {
  6447. $res = $objMGoods->updateSalesNum($value['goodsId'], $value['skuId'], $value['buyNum']);
  6448. if ($res === false) {
  6449. Logger::logs(E_USER_ERROR, '错误', __CLASS__, __LINE__, '商品增加销量失败');
  6450. }
  6451. }
  6452. }
  6453. //file_put_contents('/www/wwwroot/logs/apiqnys.liuniukj.com/MSaleOrder_error.log', date('Y-m-d H:i:s') . '数据:' . var_export($mapDetails, true) . PHP_EOL, FILE_APPEND);
  6454. $this->objSaleOrder->setGoodsDetails($mapDetails);
  6455. //统计订单信息
  6456. self::noticeStatistics([
  6457. 'userCenterId' => $params['userCenterId'],
  6458. 'enterpriseId' => $this->onlineEnterpriseId,
  6459. 'customerId' => $params['customerId'],
  6460. 'no' => $allSn,
  6461. 'noticeType' => 'create',
  6462. ], 'MOrderStatistics');
  6463. //写日志
  6464. foreach ($allSn as $sn) {
  6465. parent::saveLog([
  6466. 'no' => $sn,
  6467. 'actionType' => '创建订单',//创建订单
  6468. 'operationData' => '',
  6469. 'userCenterId' => $params['userCenterId'],
  6470. 'enterpriseId' => $this->onlineEnterpriseId,
  6471. 'createTime' => time(),
  6472. ]);
  6473. }
  6474. $this->objDOrder->commit();
  6475. return ResultWrapper::success(['orderId' => $orderId, 'shopName' => $shopName, 'out_trade_no' => $tmpOuterTradeNo, 'total_fee' => $goodsCommonData['payMoney']]);
  6476. }
  6477. /**
  6478. * Doc: (des="订单确认收款")
  6479. * User: XMing
  6480. * Date: 2020/10/12
  6481. * Time: 4:11 下午
  6482. * @param array $params
  6483. * @return ResultWrapper
  6484. * @throws \Exception
  6485. */
  6486. public function confirm(array $params)
  6487. {
  6488. $orderIndex = $this->objDOrderIndex->get(['id' => $params['orderId']]);
  6489. if ($orderIndex === false) {
  6490. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6491. }
  6492. if (empty($orderIndex)) {
  6493. return ResultWrapper::fail('获取订单信息失败', ErrorCode::$paramError);
  6494. }
  6495. if ($orderIndex['payStatus'] != StatusCode::$delete) {
  6496. return ResultWrapper::fail('订单已付款', ErrorCode::$paramError);
  6497. }
  6498. $fix = $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);;
  6499. $this->objDOrder->setTable('qianniao_order_' . $this->onlineEnterpriseId . '_' . $fix);
  6500. $orderData = $this->objDOrder->get(['id' => $params['orderId']]);
  6501. if ($orderData === false) {
  6502. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6503. }
  6504. if (empty($orderData)) {
  6505. return ResultWrapper::fail('获取订单信息失败', ErrorCode::$paramError);
  6506. }
  6507. $paramsResult = self::getIdsCashierMap($params);
  6508. if (!$paramsResult->isSuccess()) {
  6509. return ResultWrapper::fail($paramsResult->getData(), $paramsResult->getErrorCode());
  6510. }
  6511. $params = $paramsResult->getData();
  6512. $this->objDOrderIndex->beginTransaction();
  6513. //修稿订单信息
  6514. $update = [
  6515. 'payType' => $params['payType'],
  6516. 'updateTime' => time(),
  6517. 'cashierUid' => $this->loginUserCenterId,
  6518. 'guideUids' => $params['guideUids'],
  6519. ];
  6520. $updateIndex = $this->objDOrderIndex->update($update, ['id' => $params['orderId']]);
  6521. if ($updateIndex === false) {
  6522. $this->objDOrderIndex->rollBack();
  6523. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6524. }
  6525. $update['guideName'] = $params['guideName'];
  6526. $updateOrder = $this->objDOrder->update($update, ['id' => $params['orderId']]);
  6527. if ($updateOrder === false) {
  6528. $this->objDOrderIndex->rollBack();
  6529. return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
  6530. }
  6531. /*
  6532. //更新es
  6533. $_id = self::createEsDocumentId($params['orderId']);
  6534. $this->objDOrder->esupdateTypeFieldVaule($update, $_id);*/
  6535. //清空此收银员的购物车
  6536. $objMCashierCart = new MCashierCart($this->onlineUserId, $this->onlineEnterpriseId, $this->loginUserCenterId);
  6537. $result = $objMCashierCart->clearCart();
  6538. if (!$result->isSuccess()) {
  6539. $this->objDOrderIndex->rollBack();
  6540. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  6541. }
  6542. //自动审核订单
  6543. $objMInventoryOut = new MInventoryOut($this->onlineEnterpriseId, $this->onlineUserId);
  6544. $auditResult = self::updateAuditStatus([
  6545. 'id' => $params['orderId'],
  6546. 'audit' => '自动审核',
  6547. 'auditId' => $this->onlineUserId,
  6548. 'auditStatus' => StatusCode::$auditStatus['auditPass']
  6549. ]);
  6550. if (!$auditResult->isSuccess()) {
  6551. $this->objDOrderIndex->rollBack();
  6552. return ResultWrapper::fail($auditResult->getData(), $auditResult->getErrorCode());
  6553. }
  6554. $outId = $auditResult->getData();//出库单id
  6555. //自动出库
  6556. $dbResult = $objMInventoryOut->updateInventoryOutStatus(['id' => $outId, 'auditId' => $this->loginUserCenterId, 'auditName' => '销售自动审核']);
  6557. if (!$dbResult->isSuccess()) {
  6558. $this->objDOrderIndex->rollBack();
  6559. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6560. }
  6561. //确认收款
  6562. $dbResult = self::updateOrderPayData(['payStatus' => StatusCode::$standard, 'payTime' => time()], ['id' => [$params['orderId']]]);
  6563. if (!$dbResult->isSuccess()) {
  6564. $this->objDOrderIndex->rollBack();
  6565. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6566. }
  6567. //确认收货
  6568. $dbResult = self::updateOrderStatus($params['orderId'], ['orderStatus' => StatusCode::$orderStatus['finish']], []);
  6569. if (!$dbResult->isSuccess()) {
  6570. $this->objDOrder->rollBack();
  6571. return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
  6572. }
  6573. $objMCashier = new MCashier($this->onlineUserId, $this->onlineEnterpriseId);
  6574. $cashierResult = $objMCashier->calculatePushMoney($params['orderId']);
  6575. if (!$cashierResult->isSuccess()) {
  6576. Logger::logs(E_USER_ERROR, '订单提成计算失败', __CLASS__, __LINE__, $cashierResult->getData());
  6577. }
  6578. //创建收款单
  6579. $received = [
  6580. 'currentAccountName' => $params['currentAccountName'],
  6581. 'financeType' => '销售收款',
  6582. 'financeTypeId' => 2,
  6583. 'shopId' => $orderData['shopId'],
  6584. 'shopName' => $orderData['shopName'],
  6585. 'receiptTime' => time(),
  6586. 'operatorId' => $this->loginUserCenterId,
  6587. 'accountList' => $params['accountList'],
  6588. 'customerId' => $orderData['customerId'],
  6589. 'customerName' => $orderData['customerName'],
  6590. 'sourceNo' => $orderData['no'],
  6591. 'sourceNoMoney' => $orderData['payAmount'],
  6592. 'createTime' => time(),
  6593. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  6594. 'updateTime' => time(),
  6595. ];
  6596. $objMReceived = new MReceived($this->onlineEnterpriseId, $this->loginUserCenterId);
  6597. $receivedResult = $objMReceived->addReceived($received, true);
  6598. if (!$receivedResult->isSuccess()) {
  6599. $this->objDOrderIndex->rollBack();
  6600. return ResultWrapper::fail($receivedResult->getData(), $receivedResult->getErrorCode());
  6601. }
  6602. $this->objDOrderIndex->commit();
  6603. if ($this->onlineUserId == StatusCode::$noneUserCenter) {
  6604. $objDCashierCustomerPrice = new DCashierCustomerPrice();
  6605. $objDCashierCustomerPrice->setTable('qianniao_cashier_customer_price_' . $this->onlineEnterpriseId);
  6606. $objDCashierCustomerPrice->delete(['cashierUid' => $this->loginUserCenterId, 'customerUid' => StatusCode::$noneUserCenter]);
  6607. }
  6608. return ResultWrapper::success(true);
  6609. }
  6610. /**
  6611. * Doc: (des="获取收银员工信息")
  6612. * User: XMing
  6613. * Date: 2020/10/12
  6614. * Time: 5:50 下午
  6615. * @param array $params
  6616. * @return ResultWrapper
  6617. * @throws \Exception
  6618. */
  6619. private function getIdsCashierMap(array $params)
  6620. {
  6621. $objDStaff = new DStaff();
  6622. $objDStaff->setTable('qianniao_staff_' . $this->onlineEnterpriseId);
  6623. //获取收银员信息
  6624. $allUids = [$this->loginUserCenterId];
  6625. if (isset($params['guideUids']) && !empty($params['guideUids'])) {
  6626. $ids = explode(',', $params['guideUids']);
  6627. $allUids = array_merge($allUids, $ids);
  6628. }
  6629. $userMap = [];
  6630. if (!empty($allUids)) {
  6631. $staffList = $objDStaff->select(['userCenterId' => $allUids], 'userCenterId,staffName');
  6632. if ($staffList === false) {
  6633. return ResultWrapper::fail($objDStaff->error(), ErrorCode::$dberror);
  6634. }
  6635. foreach ($staffList as $value) {
  6636. $userMap[$value['userCenterId']] = $value['staffName'];
  6637. }
  6638. }
  6639. $params['cashierName'] = isset($userMap[$this->loginUserCenterId]) ? $userMap[$this->loginUserCenterId] : '超级管理员';
  6640. $nameStr = '';
  6641. if (!empty($ids)) {
  6642. foreach ($ids as $uid) {
  6643. if (!empty($nameStr)) {
  6644. $nameStr .= ',';
  6645. }
  6646. $nameStr .= isset($userMap[$uid]) ? $userMap[$uid] : '';
  6647. }
  6648. }
  6649. $params['guideName'] = $nameStr;
  6650. $params['customerMobile'] = '';
  6651. return ResultWrapper::success($params);
  6652. }
  6653. public function fix_ex()
  6654. {
  6655. $_id = self::createEsDocumentId(144);
  6656. $this->objDOrder->esupdateTypeFieldVaule(['salesManId' => 1, 'salesManName' => '杨明霞', 'updateTime' => time()], $_id);
  6657. }
  6658. /**
  6659. * 查询索引表信息
  6660. */
  6661. public function getOrderIndexData($where)
  6662. {
  6663. $dbResult = $this->objDOrderIndex->get($where);
  6664. if ($dbResult === false) {
  6665. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  6666. }
  6667. return ResultWrapper::success($dbResult);
  6668. }
  6669. /**
  6670. * Doc: (des="根据订单id获取订单信息")
  6671. * User: XMing
  6672. * Date: 2020/12/7
  6673. * Time: 4:05 下午
  6674. * @param int $id
  6675. * @return ResultWrapper
  6676. * @throws \Exception
  6677. */
  6678. public function getOrderByOrderId(int $id): ResultWrapper
  6679. {
  6680. $orderIndex = $this->objDOrderIndex->get($id);
  6681. if ($orderIndex === false){
  6682. return ResultWrapper::fail($this->objDOrderIndex->error,ErrorCode::$dberror);
  6683. }
  6684. if (empty($orderIndex)){
  6685. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6686. }
  6687. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6688. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6689. $order = $this->objDOrder->get($id);
  6690. if ($order === false){
  6691. return ResultWrapper::fail($this->objDOrder->error,ErrorCode::$paramError);
  6692. }
  6693. if (empty($order)){
  6694. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6695. }
  6696. return ResultWrapper::success($order);
  6697. }
  6698. /**
  6699. * Doc: (des="")
  6700. * User: XMing
  6701. * Date: 2020/12/8
  6702. * Time: 10:43 上午
  6703. * @param int $id
  6704. * @return ResultWrapper
  6705. * @throws \Exception
  6706. */
  6707. public function updateSettel(int $id): ResultWrapper
  6708. {
  6709. $orderIndex = $this->objDOrderIndex->get($id);
  6710. if ($orderIndex === false){
  6711. return ResultWrapper::fail($this->objDOrderIndex->error,ErrorCode::$dberror);
  6712. }
  6713. if (empty($orderIndex)){
  6714. return ResultWrapper::fail('未获取到订单信息',ErrorCode::$paramError);
  6715. }
  6716. $fix = ceil($orderIndex['userCenterId'] / $this->cutTable);
  6717. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6718. $order = $this->objDOrder->update(['isSettel' => StatusCode::$standard],$id);
  6719. if ($order === false){
  6720. return ResultWrapper::fail($this->objDOrder->error,ErrorCode::$paramError);
  6721. }
  6722. return ResultWrapper::success(true);
  6723. }
  6724. /**
  6725. * Doc: (des="")
  6726. * User: XMing
  6727. * Date: 2021/2/4
  6728. * Time: 12:06 下午
  6729. * @param array $selectParams
  6730. * @return ResultWrapper
  6731. */
  6732. public function getStatistics(array $selectParams):ResultWrapper
  6733. {
  6734. //默认今日的
  6735. $todayStart = strtotime(date('Y-m-d 00:00:00', time()));
  6736. $todayEnd = strtotime(date('Y-m-d 23:59:59', time()));
  6737. if (isset($selectParams['start']) && !empty($selectParams['start'])){
  6738. $todayStart = $selectParams['start'];
  6739. }
  6740. if (isset($selectParams['end']) && !empty($selectParams['end'])){
  6741. $todayEnd = $selectParams['end'];
  6742. }
  6743. $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
  6744. (
  6745. 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
  6746. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  6747. WHERE o.outStatus in(5,6) AND g.deleteStatus = 5 AND o.createTime BETWEEN '.$todayStart.' AND '.$todayEnd.'
  6748. UNION ALL
  6749. 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
  6750. LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' as d ON d.linkId=r.id
  6751. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.'
  6752. )
  6753. AS order_view GROUP BY skuId';
  6754. $countSql = 'SELECT order_view.id as id FROM
  6755. (
  6756. SELECT o.id,g.skuId FROM qianniao_order_'.$this->onlineEnterpriseId.'_1 as o
  6757. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  6758. WHERE o.outStatus in(5,6) AND g.deleteStatus = 5 AND o.createTime BETWEEN '.$todayStart.' AND '.$todayEnd.'
  6759. UNION ALL
  6760. SELECT r.id,d.skuId FROM qianniao_order_return_'.$this->onlineEnterpriseId.' as r
  6761. LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' as d ON d.linkId=r.id
  6762. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.'
  6763. ) AS order_view GROUP BY skuId';
  6764. $sql .= ' LIMIT '.$selectParams['offset'].','.$selectParams['limit'];
  6765. $lists = $this->objDOrderIndex->query($sql);
  6766. if ($lists === false){
  6767. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6768. }
  6769. $goodsBasicDate = [];
  6770. //获取商品资料
  6771. $goodsBasicIds = array_column($lists,'goodsBasicId');
  6772. $objGoodsDate = new MGoodsBasic($this->onlineUserId,$this->onlineEnterpriseId);
  6773. $result = $objGoodsDate->getBasicGoodsFieldByIds($goodsBasicIds);
  6774. if ( !$result->isSuccess() ){
  6775. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  6776. }
  6777. $goodsBasicDate = $result->getData();
  6778. $skuIds = [];
  6779. foreach ($lists as &$list){
  6780. $list['isEq'] = isset($goodsBasicDate[$list['goodsBasicId']]['isEq']) ? $goodsBasicDate[$list['goodsBasicId']]['isEq'] : 4;
  6781. $list['specGroup'] = json_decode($list['specGroup'],true);
  6782. if (is_array($list['specGroup'])){
  6783. $arr = array_column($list['specGroup'],'specValueName');
  6784. $str = implode('_',$arr);
  6785. $list['specGroup'] = $str;
  6786. }
  6787. $list['subProMoney'] = floatval(bcsub($list['totalMoney'],$list['outCostPrice'],2));//毛利
  6788. $skuIds[] = $list['skuId'];
  6789. }
  6790. unset($list);
  6791. $thisRetMap = [];//本期
  6792. $lastRetMap = [];//上期
  6793. if (!empty($skuIds)){
  6794. $str = implode(',',$skuIds);
  6795. //本期退货数量
  6796. $fields = ' SUM(d.num) as thisRetNum,d.skuId as skuId,SUM(d.returnTotalPrice) as thisReturnTotalPrice ';
  6797. $sql = 'SELECT '.$fields.' FROM qianniao_order_' . $this->onlineEnterpriseId . '_1 AS o
  6798. LEFT JOIN qianniao_order_return_'.$this->onlineEnterpriseId.' AS r
  6799. ON r.originId = o.id LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' AS d
  6800. ON d.linkId = r.id
  6801. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND
  6802. o.createTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6803. r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6804. d.skuId IN('.$str.') GROUP BY d.skuId';
  6805. $retLists = $this->objDOrderIndex->query($sql);
  6806. if ($retLists === false){
  6807. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6808. }
  6809. unset($sql);
  6810. //上期退货
  6811. $fields = ' SUM(d.num) as lastRetNum,d.skuId as skuId,SUM(d.returnTotalPrice) as lastReturnTotalPrice ';
  6812. $sql = 'SELECT '.$fields.' FROM qianniao_order_' . $this->onlineEnterpriseId . '_1 AS o
  6813. LEFT JOIN qianniao_order_return_'.$this->onlineEnterpriseId.' AS r
  6814. ON r.originId = o.id LEFT JOIN qianniao_order_return_details_'.$this->onlineEnterpriseId.' AS d
  6815. ON d.linkId = r.id
  6816. WHERE r.auditStatus = 2 AND d.deleteStatus = 5 AND
  6817. o.createTime < '.$todayStart.' AND
  6818. r.updateTime BETWEEN '.$todayStart.' AND '. $todayEnd.' AND
  6819. d.skuId IN('.$str.') GROUP BY d.skuId';
  6820. $lastRetLists = $this->objDOrderIndex->query($sql);
  6821. if ($lastRetLists === false){
  6822. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6823. }
  6824. unset($sql);
  6825. foreach ($retLists as $val){
  6826. $thisRetMap[$val['skuId']] = [
  6827. 'thisRetNum' => $val['thisRetNum'],
  6828. 'thisReturnTotalPrice' => $val['thisReturnTotalPrice'],
  6829. ];
  6830. }
  6831. foreach ($lastRetLists as $val){
  6832. $lastRetMap[$val['skuId']] = [
  6833. 'lastRetNum' => $val['lastRetNum'],
  6834. 'lastReturnTotalPrice' => $val['lastReturnTotalPrice']
  6835. ];
  6836. }
  6837. }
  6838. foreach ($lists as &$item){
  6839. if (!isset($thisRetMap[$item['skuId']])){
  6840. $item['thisRetNum'] = 0;
  6841. $item['thisReturnTotalPrice'] = 0;
  6842. }else{
  6843. $item['thisRetNum'] = floatval($thisRetMap[$item['skuId']]['thisRetNum']);
  6844. $item['thisReturnTotalPrice'] = floatval($thisRetMap[$item['skuId']]['thisReturnTotalPrice']);
  6845. }
  6846. if (!isset($lastRetMap[$item['skuId']])){
  6847. $item['lastRetNum'] = 0;
  6848. $item['lastReturnTotalPrice'] = 0;
  6849. }else{
  6850. $item['lastRetNum'] = floatval($lastRetMap[$item['skuId']]['lastRetNum']);
  6851. $item['lastReturnTotalPrice'] = floatval($lastRetMap[$item['skuId']]['lastReturnTotalPrice']);
  6852. }
  6853. $item['retNum'] = bcadd($item['thisRetNum'],$item['lastRetNum'],2);
  6854. $item['returnTotalPrice'] = bcadd($item['thisReturnTotalPrice'],$item['lastReturnTotalPrice'],2);
  6855. }
  6856. unset($item);
  6857. $count = $this->objDOrderIndex->query($countSql);
  6858. if ($count === false){
  6859. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  6860. }
  6861. $data = [
  6862. 'total' => count($count),
  6863. 'data' => $lists
  6864. ];
  6865. return ResultWrapper::success($data);
  6866. }
  6867. /**
  6868. * Doc: (des="")
  6869. * User: XMing
  6870. * Date: 2021/3/10
  6871. * Time: 11:05 上午
  6872. * @param array $params
  6873. * @return ResultWrapper
  6874. * @throws \Exception
  6875. */
  6876. public function getGoodsListsByUserCenterId(array $params): ResultWrapper
  6877. {
  6878. $fix = 1;
  6879. if (isset($params['userCenterId']) && !empty($params['userCenterId'])){
  6880. $fix = ceil($params['userCenterId'] / $this->cutTable);
  6881. }
  6882. $this->objDOrder->setTable('qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix);
  6883. $fields = ' id,customerName,customerId ';
  6884. $where = '';
  6885. if (isset($params['startTime']) && !empty($params['startTime']) && isset($params['endTime']) && !empty($params['endTime'])){
  6886. $where .= ' AND `createTime` BETWEEN '.$params['startTime'].' AND '.$params['endTime'];
  6887. }
  6888. $sql = 'SELECT '.$fields.' FROM qianniao_order_'.$this->onlineEnterpriseId.'_'.$fix.' WHERE deleteStatus = '.StatusCode::$standard.$where;
  6889. if (isset($params['userCenterId']) && !empty($params['userCenterId'])){
  6890. $sql .= ' AND userCenterId = '.$params['userCenterId'];
  6891. }
  6892. $sql .= ' order by createTime desc';
  6893. $lists = $this->objDOrder->query($sql);
  6894. if ($lists === false){
  6895. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  6896. }
  6897. if (empty($lists)){
  6898. return ResultWrapper::success(['data' => [],'total' => 0]);
  6899. }
  6900. unset($sql);
  6901. unset($where);
  6902. unset($fields);
  6903. $orderIds = [];
  6904. $orderRelMap = [];
  6905. foreach ($lists as $item){
  6906. $orderIds[] = $item['id'];
  6907. $orderRelMap[$item['id']] = $item;
  6908. }
  6909. $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 ';
  6910. $where = '';
  6911. if (!empty($orderIds)){
  6912. $str = trim(implode(',',$orderIds),',');
  6913. $where .= ' AND `orderId` IN ('.$str.')';
  6914. }
  6915. if (isset($params['categoryId']) && !empty($params['categoryId'])){
  6916. $categoryId = (int)$params['categoryId'];
  6917. $where .= ' AND FIND_IN_SET('.$categoryId.',`categoryPath`) ';
  6918. }
  6919. if (isset($params['brandId']) && !empty($params['brandId'])){
  6920. $brandId = (int)$params['brandId'];
  6921. $where .= ' AND `brandId` = '.$brandId;
  6922. }
  6923. if (isset($params['barCode']) && !empty($params['barCode'])){
  6924. $barCode = (string)$params['barCode'];
  6925. $where .= ' AND `barCode` = "'.$barCode.'"';
  6926. }
  6927. if (isset($params['shopId']) && !empty($params['shopId'])){
  6928. $shopId = (int)$params['shopId'];
  6929. $where .= ' AND `shopId` = '.$shopId;
  6930. }
  6931. if (isset($params['keyword']) && !empty($params['keyword'])){
  6932. $keyword = '"%'.$params['keyword'].'%"';
  6933. $where .= ' AND (`goodsName` LIKE '.$keyword.' OR `goodsCode` LIKE '.$keyword.') ';
  6934. }
  6935. $sql = 'SELECT '.$fields.' FROM qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix.'
  6936. WHERE `deleteStatus` = '.StatusCode::$standard.$where.'
  6937. GROUP BY skuId ORDER BY createTime DESC ';
  6938. $count = $this->objDOrderGoods->query($sql);
  6939. if ($count === false){
  6940. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6941. }
  6942. if (isset($params['limit']) && !empty($params['limit'])){
  6943. $sql .= ' LIMIT '.$params['offset'].','.$params['limit'];
  6944. }
  6945. $lists = $this->objDOrderGoods->query($sql);
  6946. if ($lists === false){
  6947. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6948. }
  6949. if (empty($lists)){
  6950. return ResultWrapper::success(['data'=>[],'total'=>0]);
  6951. }
  6952. if ($lists === false){
  6953. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  6954. }
  6955. $goodsBasicDate = [];
  6956. //获取商品资料
  6957. $goodsBasicIds = array_column($lists,'goodsBasicId');
  6958. $objGoodsDate = new MGoodsBasic($this->onlineUserId,$this->onlineEnterpriseId);
  6959. $result = $objGoodsDate->getBasicGoodsFieldByIds($goodsBasicIds);
  6960. if ( !$result->isSuccess() ){
  6961. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  6962. }
  6963. $goodsBasicDate = $result->getData();
  6964. foreach ($lists as &$item){
  6965. if (isset($item['specGroup']) && !empty($item['specGroup'])){
  6966. $item['specGroup'] = json_decode($item['specGroup'],true);
  6967. }
  6968. $item['customerName'] = isset($orderRelMap[$item['orderId']]) ? $orderRelMap[$item['orderId']]['customerName'] : '';
  6969. $item['customerId'] = isset($orderRelMap[$item['orderId']]) ? $orderRelMap[$item['orderId']]['customerId'] : 0;
  6970. $item['isEq'] = isset($goodsBasicDate[$item['goodsBasicId']]['isEq']) ? $goodsBasicDate[$item['goodsBasicId']]['isEq'] : 4;
  6971. }
  6972. return ResultWrapper::success([
  6973. 'data' => $lists,
  6974. 'total' => (int)count($count)
  6975. ]);
  6976. }
  6977. /**
  6978. * Doc: (des="缺货单列表")
  6979. * User: XMing
  6980. * Date: 2021/3/11
  6981. * Time: 6:44 下午
  6982. * @param array $selectParams
  6983. * @return ResultWrapper
  6984. * @throws \Exception
  6985. */
  6986. public function getDistributionAll(array $selectParams): ResultWrapper
  6987. {
  6988. //{"page":1,"pageSize":10,"search":{},"state":"all"}
  6989. $selectParams['state'] = 'state';
  6990. $selectParams['outStatus'] = 6;
  6991. $orderListsResult = self::getAllOrder($selectParams,[]);
  6992. if (!$orderListsResult->isSuccess()){
  6993. return ResultWrapper::fail($orderListsResult->getData(),$orderListsResult->getErrorCode());
  6994. }
  6995. $total = $orderListsResult->getData()['total'];
  6996. $orderLists = $orderListsResult->getData()['data'];
  6997. if (empty($orderLists)){
  6998. return ResultWrapper::success(['data' => [],'total' => 0]);
  6999. }
  7000. $arrayLists = [];
  7001. $orderIds = [];
  7002. foreach ($orderLists as $item){
  7003. $infoResult = self::getOrderInfoById($item['id']);
  7004. if (!$infoResult->isSuccess()){
  7005. return ResultWrapper::fail($infoResult->getData(),$infoResult->getErrorCode());
  7006. }
  7007. $infoResult = $infoResult->getData();
  7008. $goodsData = $infoResult['goodsData'];
  7009. foreach ($goodsData as $key => $item){
  7010. if ($item['outOfNum'] == 0){
  7011. unset($goodsData[$key]);
  7012. continue;
  7013. }
  7014. $infoResult['goodsData'] = array_values($goodsData);
  7015. }
  7016. $arrayLists[] = $infoResult;
  7017. }
  7018. return ResultWrapper::success(['data' => $arrayLists,'total' => $total]);
  7019. }
  7020. /**
  7021. * Doc: (des="业务员销售排行")
  7022. * User: XMing
  7023. * Date: 2021/3/15
  7024. * Time: 10:09 上午
  7025. * @param array $params
  7026. * @param $export
  7027. * @return ResultWrapper
  7028. */
  7029. public function salesManRank(array $params,$export = 0): ResultWrapper
  7030. {
  7031. $sortFields = ['dealCustomerNum','orderNum','dealAmount','skuNum','buyNum'];
  7032. $sort = ['ASC','DESC'];
  7033. if (!in_array($params['sortField'],$sortFields)){
  7034. return ResultWrapper::fail('sortField字段异常',ErrorCode::$paramError);
  7035. }
  7036. if (!in_array($params['sort'],$sort)){
  7037. return ResultWrapper::fail('sort字段异常',ErrorCode::$paramError);
  7038. }
  7039. $where = '';
  7040. $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 ';
  7041. if (isset($params['startTime']) && !empty($params['startTime']) && isset($params['endTime']) && !empty($params['endTime'])){
  7042. $where .= ' AND o.createTime BETWEEN '.$params['startTime'].' AND '.$params['endTime'];
  7043. }
  7044. if ( !empty($params['orderStatus'])&& isset($params['orderStatus']) ){//删选
  7045. $orderStatus = implode(',',$params['orderStatus']);
  7046. $where .= ' AND o.orderStatus IN ('.$orderStatus.')';
  7047. }
  7048. $sql = 'SELECT '.$fields.' FROM qianniao_order_'.$this->onlineEnterpriseId.'_1 as o
  7049. LEFT JOIN qianniao_order_goods_'.$this->onlineEnterpriseId.'_1 as g ON g.orderId = o.id
  7050. WHERE o.deleteStatus = 5
  7051. AND o.salesManId IS NOT NULL
  7052. AND o.salesManId != 0 '.$where;
  7053. $sql .= ' GROUP BY o.salesManName ';
  7054. if (isset($params['sortField']) && !empty($params['sortField']) && isset($params['sort']) && !empty($params['sort'])){
  7055. $sql .= ' ORDER BY '.$params['sortField'].' '.$params['sort'];
  7056. }
  7057. $count = $this->objDOrder->query($sql);
  7058. if ($count === false){
  7059. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7060. }
  7061. if (count((array)$count) == 0){
  7062. return ResultWrapper::success(['data' => [],'total' => 0]);
  7063. }
  7064. if($export){
  7065. $params['limit'] = null;
  7066. $params['offset'] = null;
  7067. }
  7068. if (isset($params['limit']) && !empty($params['limit'])){
  7069. $sql .= ' LIMIT '.$params['offset'].','.$params['limit'];
  7070. }
  7071. //导出
  7072. if($export){
  7073. $lists = $this->objDOrder->query($sql);
  7074. if ($lists === false){
  7075. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7076. }
  7077. self::exportsalesManRank($lists);
  7078. exit;
  7079. }else{
  7080. $lists = $this->objDOrder->query($sql);
  7081. if ($lists === false){
  7082. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7083. }
  7084. foreach ($lists as &$list){
  7085. $list['dealAmount'] = sprintf('%.2f', $list['dealAmount']);
  7086. }
  7087. }
  7088. return ResultWrapper::success(['data' => $lists,'total' => count($count)]);
  7089. }
  7090. /**
  7091. * Doc: (des="")
  7092. * User: XMing
  7093. * Date: 2021/3/17
  7094. * Time: 10:47 上午
  7095. * @param array $orderIds
  7096. * @param array $params
  7097. * @return ResultWrapper
  7098. * @throws \Exception
  7099. */
  7100. public function updateCostPriceBySku(array $orderIds,array $params): ResultWrapper
  7101. {
  7102. Logger::logs(E_USER_ERROR,'params',__CLASS__,__LINE__,$params);
  7103. Logger::logs(E_USER_ERROR,'orderIds',__CLASS__,__LINE__,$orderIds);
  7104. if (empty($orderIds)){
  7105. return ResultWrapper::success();
  7106. }
  7107. $lists = $this->objDOrderIndex->select($orderIds,'id,userCenterId');
  7108. if ($lists === false){
  7109. return ResultWrapper::fail($this->objDOrderIndex->error(),ErrorCode::$dberror);
  7110. }
  7111. $tables = [];
  7112. foreach ($lists as $list){
  7113. $fix = ceil($list['userCenterId'] / $this->cutTable);
  7114. $tables[$fix][] = $list['id'];
  7115. }
  7116. if (empty($tables)){
  7117. return ResultWrapper::success('没有更新的表');
  7118. }
  7119. $status = $this->objDOrderGoods->beginTransaction();
  7120. foreach ($params as $value){
  7121. $where = $value['where'];
  7122. $update = $value['update'];
  7123. foreach ($tables as $fix => $orderIds){
  7124. $this->objDOrderGoods->setTable('qianniao_order_goods_'.$this->onlineEnterpriseId.'_'.$fix);
  7125. Logger::logs(E_USER_ERROR,'update',__CLASS__,__LINE__,$update);
  7126. Logger::logs(E_USER_ERROR,'where',__CLASS__,__LINE__,$where);
  7127. $updateResult = $this->objDOrderGoods->update($update,$where);
  7128. if ($updateResult === false){
  7129. $this->objDOrderGoods->rollBack();
  7130. return ResultWrapper::fail($this->objDOrderGoods->error(),ErrorCode::$dberror);
  7131. }
  7132. }
  7133. }
  7134. $status && $this->objDOrderGoods->commit();
  7135. return ResultWrapper::success(true);
  7136. }
  7137. /*
  7138. * 设置物流信息
  7139. * */
  7140. public function addLogistics($params)
  7141. {
  7142. $logisticsData = $params['logisticsData'];
  7143. if(empty($logisticsData['id'])){
  7144. $objMDriver = new MDriver($this->onlineEnterpriseId, $this->onlineUserId);
  7145. $paramsDriver = [
  7146. 'enterpriseId'=> $this->onlineEnterpriseId,
  7147. 'driverName' => $logisticsData['name'],
  7148. 'phone' => $logisticsData['truckTel'],
  7149. 'plateNumber' => $logisticsData['truckName'],
  7150. 'remark' => $logisticsData['remark']
  7151. ];
  7152. $addDriver = $objMDriver->addDriver($paramsDriver);
  7153. if ( !$addDriver->isSuccess() ){
  7154. return ResultWrapper::fail($addDriver->getData(),$addDriver->getErrorCode());
  7155. }
  7156. $driverId = $addDriver->getData();
  7157. $params['logisticsData']['id']= $driverId;
  7158. }
  7159. //去掉订单id剩下的数据就是物流数据
  7160. $orderId = $params['orderId'];
  7161. unset($params['orderId']);
  7162. $orderNo = $params['no'];
  7163. unset($params['no']);
  7164. $updateLogistics = self::editOrderExpress($orderNo,$params,$orderId);
  7165. if (!$updateLogistics->isSuccess()){
  7166. $this->objDOrder->rollBack();
  7167. return ResultWrapper::fail($updateLogistics->getData(),$updateLogistics->getErrorCode());
  7168. }
  7169. return ResultWrapper::success($updateLogistics);
  7170. }
  7171. /**
  7172. * 业务员订单表导出方法
  7173. * @param $result
  7174. * @return void
  7175. * @throws Exception
  7176. */
  7177. public function exportsalesManRank($result)
  7178. {
  7179. //导出到本地
  7180. header("Content-type:application/vnd.ms-excel");
  7181. header("Content-Disposition:filename=业务员订单记录表.csv");
  7182. header('Cache-Control: max-age=0');
  7183. $fp = fopen('php://output', 'a');
  7184. $head = ['销售员','成交客户','sku数量','订单数','销售数量','成交金额']; //定义标题
  7185. foreach ($head as $i => $v) {
  7186. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  7187. }
  7188. fputcsv($fp, $head);
  7189. $limit = 10000;
  7190. $num = 0; //计数器
  7191. foreach ($result as $v) { //循环数据
  7192. $num++;
  7193. if ($num == $limit) {
  7194. ob_flush(); //释放内存
  7195. flush();
  7196. }
  7197. $rows['salesManName'] = isset($v['salesManName']) ? $v['salesManName'] : '';//销售员
  7198. $rows['dealCustomerNum'] = isset($v['dealCustomerNum']) ? $v['dealCustomerNum'] : '';//成交客户
  7199. $rows['skuNum'] = isset($v['skuNum']) ? $v['skuNum'] : '';//SKU数量
  7200. $rows['orderNum'] = isset($v['orderNum']) ? $v['orderNum'] : '';//订单数
  7201. $rows['buyNum'] = isset($v['buyNum']) ? $v['buyNum'] : '';//销售数量
  7202. $rows['dealAmount'] = isset($v['dealAmount']) ? $v['dealAmount'] : '';//成交金额
  7203. foreach ($rows as $kk => $vv) {
  7204. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  7205. }
  7206. fputcsv($fp, $rs);
  7207. $rows = [];
  7208. }
  7209. }
  7210. /**
  7211. * 导出方法
  7212. *
  7213. * @param $orderProfit
  7214. */
  7215. private static function exportOrderProfit($orderProfit)
  7216. {
  7217. //导出到本地
  7218. header("Content-type:application/vnd.ms-excel");
  7219. header("Content-Disposition:filename=销售毛利明细表记录.csv");
  7220. header('Cache-Control: max-age=0');
  7221. $fp = fopen('php://output', 'a');
  7222. $head = ['商品名','单据类型', '单据日期', '客户名', '数量','其他单位','销售价', '成本价', '销售收入','销售成本', '销售毛利', '销售毛利率']; //定义标题
  7223. foreach ($head as $i => $v) {
  7224. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  7225. }
  7226. fputcsv($fp, $head);
  7227. $limit = 10000;
  7228. $num = 0;//计数器
  7229. foreach ($orderProfit as $v) {
  7230. //循环数据
  7231. $num++;
  7232. if ($num == $limit) {
  7233. ob_flush();//释放内存
  7234. flush();
  7235. }
  7236. $rows['goodsName'] = isset($v['goodsName']) ? $v['goodsName'] : '';//商品名
  7237. $rows['orderType'] = $v['orderType'] === 1 ? '销售订单' : '销售单';//单据类型
  7238. $rows['createTime'] = isset($v['createTime']) ? date('Y-m-d H:i:s',$v['createTime']) : '';//单据日期
  7239. $rows['customerName'] = isset($v['customerName']) ? $v['customerName'] : '';//客户名
  7240. $rows['buyNum'] = isset($v['buyNum']) ? $v['buyNum'] : '';//数量
  7241. $rows['otherNum'] = isset($v['otherNum']) ? $v['otherNum'] : 0;//其他单位
  7242. $rows['price'] = isset($v['price']) ? $v['price'] : '';//销售价
  7243. $rows['outCostPrice'] = isset($v['outCostPrice']) ? $v['outCostPrice'] : '';//成本价
  7244. $rows['totalMoney'] = isset($v['totalMoney']) ? $v['totalMoney'] : '';//销售收入
  7245. $rows['saleCostAmount'] = isset($v['saleCostAmount']) ? $v['saleCostAmount'] : '';//销售成本
  7246. $rows['saleProfitAmount'] = isset($v['saleProfitAmount']) ? $v['saleProfitAmount'] : '';//销售毛利
  7247. $rows['saleProfitRate'] = isset($v['saleProfitRate']) ? $v['saleProfitRate'].'%' : '';//销售毛利率
  7248. foreach ($rows as $kk => $vv) {
  7249. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  7250. }
  7251. fputcsv($fp, $rs);
  7252. $rows = [];
  7253. }
  7254. exit;
  7255. }
  7256. /**
  7257. * 拣货回写订单拣货状态
  7258. */
  7259. public function updateOrderPicking($orderIds,$orderPickStatus)
  7260. {
  7261. $tableName = $this->objDOrder->getTableName('qianniao_order_' . $this->onlineEnterpriseId, $this->onlineUserId, $this->cutTable);
  7262. $this->objDOrder->setTable($tableName);
  7263. if(!empty($orderIds)){
  7264. foreach ($orderIds as $orderId){
  7265. $dbResult = $this->objDOrder->update(['pickingStatus'=>$orderPickStatus],['id'=>$orderId]);
  7266. if ($dbResult === false){
  7267. return ResultWrapper::fail($this->objDOrder->error(),ErrorCode::$dberror);
  7268. }
  7269. }
  7270. }
  7271. return ResultWrapper::success([]);
  7272. }
  7273. /**
  7274. *
  7275. *用户订单状态数量统计
  7276. */
  7277. public function getOrderStatusNum()
  7278. {
  7279. // 2待支付 3代发货 4待收货 5已完成 10退货
  7280. $returnData = [
  7281. '2' => 0,
  7282. '3' => 0,
  7283. '4' => 0,
  7284. '5' => 0,
  7285. '10' => 0
  7286. ];
  7287. // 查询订单各状态对应的总条数
  7288. $sql = 'SELECT count(orderStatus) as total,orderStatus FROM qianniao_order_index_'.$this->onlineEnterpriseId.' WHERE deleteStatus = '.StatusCode::$standard.' AND userCenterId = '.$this->onlineUserId.' GROUP BY orderStatus';
  7289. $dbResult = $this->objDOrderIndex->query($sql);
  7290. if($dbResult === false){
  7291. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  7292. }
  7293. if (!empty($dbResult)){
  7294. foreach ($dbResult as $key => $value){
  7295. $returnData[$value['orderStatus']] = $value['total'];
  7296. }
  7297. }
  7298. // 查询退货状态总条数
  7299. unset($dbResult);
  7300. $sql = 'SELECT count(id) as total FROM qianniao_order_return_'.$this->onlineEnterpriseId.' WHERE deleteStatus = '.StatusCode::$standard.' AND userCenterId = '.$this->onlineUserId;
  7301. $dbResult = $this->objDOrderIndex->query($sql);
  7302. if($dbResult === false){
  7303. return ResultWrapper::fail($this->objDOrderIndex->error(), ErrorCode::$dberror);
  7304. }
  7305. if (!empty($dbResult)){
  7306. $returnData[10] = $dbResult[0]['total'];
  7307. }
  7308. return ResultWrapper::success($returnData);
  7309. }
  7310. }