SXService.cs 1010 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525
  1. using AutoMapper;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using SqlSugar;
  5. using SqlSugar.Extensions;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using System.Linq.Expressions;
  12. using WCS.Entity.sx;
  13. using wms.dataservice.IDataSetvice;
  14. using wms.dto;
  15. using wms.dto.request;
  16. using wms.dto.request.cp;
  17. using wms.dto.request.fj;
  18. using wms.dto.request.hj;
  19. using wms.dto.request.hj.dto;
  20. using wms.dto.request.share;
  21. using wms.dto.request.sx;
  22. using wms.dto.response;
  23. using wms.dto.response.cp;
  24. using wms.dto.response.hj;
  25. using wms.dto.response.share;
  26. using wms.dto.response.sx;
  27. using wms.service.IService;
  28. using wms.sqlsugar;
  29. using wms.sqlsugar.model;
  30. using wms.sqlsugar.model.sx;
  31. using wms.util;
  32. using wms.util.Check;
  33. using wms.util.Ext;
  34. using wms.util.Http;
  35. using TaskStatus = wms.dto.TaskStatus;
  36. namespace wms.service.Service
  37. {
  38. public class SXService : ISXService
  39. {
  40. private readonly IMapper _mapper;
  41. private readonly ILogger<SXService> _logger;
  42. private readonly ISXDataService _sxtDataService;
  43. private static object lockerPalletizingPackTask = new object();
  44. private static object lockerApplyLoc = new object();
  45. //static object lockerMoveTake = new object();
  46. public SXService(IMapper mapper, ILogger<SXService> logger, ISXDataService sxtDataService)
  47. {
  48. _mapper = mapper;
  49. _logger = logger;
  50. _sxtDataService = sxtDataService;
  51. }
  52. private Repository<sxSysConfig> _sysconfigrepository => new Repository<sxSysConfig>();
  53. /// <summary>
  54. /// 容器表
  55. /// </summary>
  56. private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
  57. /// <summary>
  58. /// 当前任务表
  59. /// </summary>
  60. private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();
  61. /// <summary>
  62. /// 库存表
  63. /// </summary>
  64. private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();
  65. /// <summary>
  66. /// 条码表
  67. /// </summary>
  68. private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();
  69. /// <summary>
  70. /// 物料表
  71. /// </summary>
  72. private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();
  73. /// <summary>
  74. /// 单据表
  75. /// </summary>
  76. private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();
  77. /// <summary>
  78. /// 任务历史表
  79. /// </summary>
  80. private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();
  81. /// <summary>
  82. /// 流水表
  83. /// </summary>
  84. private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();
  85. /// <summary>
  86. /// 甲方管理系统推送反馈
  87. /// </summary>
  88. private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();
  89. /// <summary>
  90. /// 货位表
  91. /// </summary>
  92. private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();
  93. /// <summary>
  94. /// 仓库表
  95. /// </summary>
  96. private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();
  97. private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();
  98. /// <summary>
  99. /// 机台表
  100. /// </summary>
  101. private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();
  102. private Repository<sxSysJob> _jobrepository => new Repository<sxSysJob>();
  103. private Repository<sxSysJobApiRelation> _jobApirepository => new Repository<sxSysJobApiRelation>();
  104. private Repository<BillSkuInfo> _skuInforepository => new Repository<BillSkuInfo>();
  105. private Repository<BillPackInfo> _packInforepository => new Repository<BillPackInfo>();
  106. private Repository<BillPboxrule> _boxrulerepository => new Repository<BillPboxrule>();
  107. private Repository<BillBoxSerial> _boxserialrepository => new Repository<BillBoxSerial>();
  108. private Repository<PalletLayerMath> _palletlayerMathrepository => new Repository<PalletLayerMath>();
  109. private Repository<Palletizingdetail> _palletizdetailrepository => new Repository<Palletizingdetail>();
  110. private Repository<Palletizing> _palletizrepository => new Repository<Palletizing>();
  111. private Repository<BaseTorchbandinfo> _torchbandinforepository => new Repository<BaseTorchbandinfo>();
  112. private Repository<BaseErrorinfo> _errorinforepository => new Repository<BaseErrorinfo>();
  113. private Repository<TorschWbCount> _torschwbcount => new Repository<TorschWbCount>();
  114. private Repository<BaseErrorinfoWcs> _errorinfowcs => new Repository<BaseErrorinfoWcs>();
  115. private RepositoryTask<BillTimeOutRecord> _timeoutrecord => new RepositoryTask<BillTimeOutRecord>();
  116. private RepositoryTask<Bill_InvflowHty> _flowhtyrepository => new RepositoryTask<Bill_InvflowHty>();
  117. private RepositoryTask<BillPboxruleHty> _pboxrulehtyrepository => new RepositoryTask<BillPboxruleHty>();
  118. private RepositoryTask<BillPushinfoHty> _pushhtyrepository => new RepositoryTask<BillPushinfoHty>();
  119. private RepositoryTask<PalletizingHty> _pallethtyrepository => new RepositoryTask<PalletizingHty>();
  120. private ITenant _db => SqlSugarHelper.Db;//处理事务
  121. /// <summary>
  122. /// 获取配置内容信息
  123. /// </summary>
  124. /// <param name="code">配置表code值</param>
  125. /// <returns></returns>
  126. public string GetSysConfigContentByCode(string code)
  127. {
  128. //先读缓存
  129. var cacheContent = RedisHelper.Get("sys_config" + code);
  130. if (!string.IsNullOrEmpty(cacheContent))
  131. {
  132. return cacheContent;
  133. }
  134. var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);
  135. if (sysconf == null)
  136. {
  137. throw new Exception("数据表没有配置" + code);
  138. }
  139. var content = sysconf.SContent;
  140. string sysname = sysconf.Default1;//所属系统mes/erp
  141. RedisHelper.Set("sys_config" + code, content + "|" + sysname);
  142. return content;
  143. }
  144. /// <summary>
  145. /// 获取配置信息
  146. /// </summary>
  147. /// <param name="code"></param>
  148. /// <returns></returns>
  149. public sxSysConfig GetSysConfigByCode(string code)
  150. {
  151. //Repository<dynamic> _billdtrepository = new Repository<dynamic>();
  152. return _sysconfigrepository.GetSingle(p => p.Code == code);
  153. }
  154. /// <summary>
  155. /// 获取配置信息
  156. /// </summary>
  157. /// <param name="code"></param>
  158. /// <returns></returns>
  159. public sxSysConfig GetSysConfigByExpression(Expression<Func<sxSysConfig, bool>> WhereExpression)
  160. {
  161. return _sysconfigrepository.GetSingle(WhereExpression);
  162. }
  163. /// <summary>
  164. /// 获取反馈信息
  165. /// </summary>
  166. /// <param name="code"></param>
  167. /// <returns></returns>
  168. public List<BillPushinfo> GetBillPushinfoList(Expression<Func<BillPushinfo, bool>> WhereExpression)
  169. {
  170. return _billPushinforepository.GetList(WhereExpression);
  171. }
  172. ///// <summary>
  173. ///// 获取单据信息
  174. ///// </summary>
  175. ///// <param name="code"></param>
  176. ///// <returns></returns>
  177. //public fjBillDocument GetBillDocumentList(Expression<Func<fjBillDocument, bool>> WhereExpression)
  178. //{
  179. // return _billdtrepository.Context.Queryable<fjBillDocument, fjSysConfig>((doc, conf) => new object[] {
  180. // JoinType.Left, doc.BState == conf.Code
  181. // }).Where((doc, conf) => doc.Status == 0)
  182. // .Select((bc, bm) => bc).First();
  183. //}
  184. /// <summary>
  185. /// 更新SysConfig表字段
  186. /// </summary>
  187. /// <param name="updateModel"></param>
  188. /// <returns></returns>
  189. public bool UpdateSysConfigModelColumns(UpdateModelColumns<sxSysConfig> updateModel)
  190. {
  191. return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  192. }
  193. public List<BaseMatinfo> GetBaseMatinfoList(Expression<Func<BaseMatinfo, bool>> WhereExpression)
  194. {
  195. return _basematerrepository.GetList(WhereExpression);
  196. }
  197. /// <summary>
  198. /// 更新物料基础信息表
  199. /// </summary>
  200. /// <param name="updateModel"></param>
  201. /// <returns></returns>
  202. public bool UpdateMaterModelColumns(UpdateModelColumns<BaseMatinfo> updateModel)
  203. {
  204. return _basematerrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  205. }
  206. public bool UpdateMaterModel(BaseMatinfo updateModel)
  207. {
  208. return _basematerrepository.Update(updateModel);
  209. }
  210. /// <summary>
  211. /// 更新BillPushinfo表字段
  212. /// </summary>
  213. /// <param name="updateModel"></param>
  214. /// <returns></returns>
  215. public bool UpdateBillPushinfoModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  216. {
  217. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  218. }
  219. public bool SyncMaterInfo(List<SxSyncMaterInfoRequestItem> ResData)
  220. {
  221. foreach (var item in ResData)
  222. {
  223. if (_basematerrepository.IsAny(p => p.Code == item.MatCode))
  224. {
  225. _basematerrepository.UpdateModelColumns(p => new BaseMatinfo() { IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName, EditTime = DateTime.Now, Description = item.Describe },
  226. p => p.Code == item.MatCode);
  227. }
  228. else
  229. {
  230. var model = _mapper.Map<BaseMatinfo>(item);
  231. model.AddTime = DateTime.Now;
  232. _basematerrepository.Insert(model);
  233. }
  234. }
  235. return true;
  236. }
  237. /// <summary>
  238. /// 帘线工单信息传输
  239. /// </summary>
  240. /// <param name="reqDto"></param>
  241. /// <returns></returns>
  242. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  243. {
  244. var res = new SRes();
  245. List<BillPboxrule> rulelist = new List<BillPboxrule>();
  246. var skuinfolist = _skuInforepository.GetList(p => p.SkuCode == reqDto.SkuCode);
  247. if (!skuinfolist.Any())
  248. {
  249. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  250. res.ResMsg = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode;
  251. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode, Time = DateTime.Now });
  252. return res;
  253. }
  254. //箱号处理
  255. foreach (var item in reqDto.ListBoxInfo)
  256. {
  257. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == item.BoxNo);
  258. if (rule == null)
  259. {
  260. //判断历史数据箱号
  261. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(12)).Where(p => p.PBoxCode == item.BoxNo).Any())
  262. {
  263. continue;
  264. }
  265. var packinfllist = _packInforepository.GetList(p => p.PackCode == item.PackCode);
  266. if (!packinfllist.Any())
  267. {
  268. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  269. res.ResMsg = "没有找到包号,请先推送" + item.PackCode;
  270. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到包号,请先推送" + item.PackCode, Time = DateTime.Now });
  271. return res;
  272. }
  273. int solrder = 0;
  274. int perSolderMaxCount = 0;
  275. decimal torsion24Qty = 0;
  276. decimal torsion48Qty = 0;
  277. decimal torsionErrRange = 0;
  278. decimal hold = 0;
  279. if (skuinfolist.Where(p => p.FieldCode == "QC_B02").Any())
  280. {
  281. solrder = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B02").First().FieldValue);
  282. }
  283. if (skuinfolist.Where(p => p.FieldCode == "QC_B03").Any())
  284. {
  285. perSolderMaxCount = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B03").First().FieldValue);
  286. }
  287. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  288. {
  289. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  290. }
  291. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  292. {
  293. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  294. }
  295. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  296. {
  297. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  298. }
  299. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  300. {
  301. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  302. }
  303. rule = new BillPboxrule();
  304. rule.IsStop = 0;
  305. rule.DocsNo = reqDto.BillCode;
  306. rule.SkuCode = reqDto.SkuCode;
  307. rule.PBoxCode = item.BoxNo;
  308. rule.PackRule = reqDto.PackRule;
  309. rule.FullCountQty = item.FullCount;
  310. rule.IsSolder = solrder > 0 ? 1 : 0;
  311. rule.SolderMaxCount = solrder;
  312. rule.PerSolderMaxCount = perSolderMaxCount;
  313. rule.Torsion24Qty = torsion24Qty;
  314. rule.Torsion48Qty = torsion48Qty;
  315. rule.Torsion72Qty = 0;
  316. rule.TorsionErrRange = torsionErrRange;
  317. rule.ZXStateCode = 0;
  318. rule.BlackCount = 0;
  319. rule.ReturnCount = 0;
  320. rule.EmptyCountQty = item.EmptyCount;
  321. rule.TorsionMaxQty = 4;
  322. rule.TorsionMinQty = 1;
  323. rule.SpoolType = packinfllist.First().Spool;
  324. rule.HoldTime = hold;
  325. rule.PackJsonContent = JsonConvert.SerializeObject(packinfllist);
  326. rule.Wind = item.Winding;
  327. rule.BatchNo = item.Batch;
  328. rule.Dryer = item.PackCode;
  329. if (reqDto.ListPackagelnfo.Sum(p => p.Weight) > 0)
  330. {
  331. rule.PackWeight = reqDto.ListPackagelnfo.Sum(p => p.Weight) / 1000;
  332. }
  333. else
  334. {
  335. rule.PackWeight = packinfllist.Sum(p => p.Weight) / 1000;
  336. }
  337. if (packinfllist.Where(p => p.MatCode.StartsWith("C06-02-09") || p.MatCode.StartsWith("C12-01-06-0009")).Any())
  338. {
  339. if (packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).Any())
  340. {
  341. rule.TrayCode = packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).First().MatCode;
  342. //rule.TrayCode = "mutuopan";
  343. //rule.TrayCode = "rechulituopan";
  344. }
  345. }
  346. rulelist.Add(rule);
  347. }
  348. else
  349. {
  350. int solrder = 0;
  351. int perSolderMaxCount = 0;
  352. decimal torsion24Qty = 0;
  353. decimal torsion48Qty = 0;
  354. decimal torsionErrRange = 0;
  355. decimal hold = 0;
  356. if (skuinfolist.Where(p => p.FieldCode == "QC_B02").Any())
  357. {
  358. solrder = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B02").First().FieldValue);
  359. }
  360. if (skuinfolist.Where(p => p.FieldCode == "QC_B03").Any())
  361. {
  362. perSolderMaxCount = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B03").First().FieldValue);
  363. }
  364. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  365. {
  366. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  367. }
  368. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  369. {
  370. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  371. }
  372. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  373. {
  374. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  375. }
  376. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  377. {
  378. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  379. }
  380. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule()
  381. {
  382. SkuCode = reqDto.SkuCode,
  383. PackRule = reqDto.PackRule,
  384. SolderMaxCount = solrder,
  385. PerSolderMaxCount = perSolderMaxCount,
  386. Torsion24Qty = torsion24Qty,
  387. Torsion48Qty = torsion48Qty,
  388. EditWho = "MES重复推送",
  389. EditTime = DateTime.Now
  390. }).Where(p => p.PBoxCode == rule.PBoxCode && p.ZXStateCode == 0).ExecuteCommand();
  391. }
  392. }
  393. _boxrulerepository.InsertRange(rulelist);
  394. return res;
  395. }
  396. /// <summary>
  397. /// 帘线工字轮信息传输接口
  398. /// </summary>
  399. /// <param name="reqDto"></param>
  400. /// <returns></returns>
  401. public SRes SpoolMaterialInfoTrans(SxSpoolMaterialInfoTransRequest reqDto)
  402. {
  403. var res = new SRes();
  404. try
  405. {
  406. //var materlist = AppSettings.GetConfig("MaterInfo").Split(",");
  407. if (!_sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == "MaterConfig").Any())
  408. {
  409. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  410. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  411. return res;
  412. }
  413. var materlist = _sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == "MaterConfig").First().Memo.Split(",");
  414. if (!materlist.Contains(reqDto.MatCode))
  415. {
  416. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  417. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  418. return res;
  419. }
  420. //var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);
  421. //if (container == null)
  422. //{
  423. // var insertcon = new BaseContinfo()
  424. // {
  425. // ContBarCode = reqDto.SpoolCode,
  426. // Name = reqDto.SpoolCode,
  427. // TypeCode = ContainerType.ContainerType_Spool.ToString(),
  428. // PrintQty = 1,
  429. // IsStop = 0,
  430. // WarehouseId = 0,
  431. // WeightQty = 0,
  432. // AddWho = "wms",
  433. // AddTime = DateTime.Now
  434. // };
  435. // if (!_baseContinfo.Insert(insertcon))
  436. // {
  437. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  438. // res.ResMsg = "工字轮载具初始化失败";
  439. // return res;
  440. // }
  441. //}
  442. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  443. var mater = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == reqDto.MatCode).First();
  444. if (mater == null)
  445. {
  446. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  447. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + reqDto.MatCode;
  448. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + ",物料编码:" + reqDto.MatCode, Time = DateTime.Now });
  449. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  450. return res;
  451. }
  452. var Winding = "";
  453. if (reqDto.SpoolCode.EndsWith("R"))
  454. {
  455. Winding = "R";
  456. }
  457. else
  458. {
  459. Winding = "L";
  460. }
  461. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  462. if (barstock == null)
  463. {
  464. var barinfo = new BillInvinit()
  465. {
  466. InvBarCode = reqDto.MatBarCode,
  467. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  468. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  469. ExecDocsNo = reqDto.WorkOrder,
  470. ExecDocsRowNo = reqDto.MatBarCode,
  471. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  472. InvInOut = InvInOutType.In,
  473. ExecWho = "MES",
  474. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  475. InDocsNo = reqDto.WorkOrder,
  476. InDocsRowNo = reqDto.MatBarCode,
  477. SuppCode = "",
  478. BomDocsNo = "",
  479. BomSetId = 0,
  480. SetGrpCode = "",
  481. BomMatCode = "",
  482. BomMatId = 0,
  483. BomMatName = "",
  484. MatId = mater.Id,
  485. MatCode = mater.Code,
  486. MatName = mater.Name,
  487. LengthQty = reqDto.Length,
  488. TareWQty = reqDto.Weight,
  489. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  490. RFIDBarCode = "",
  491. ProductMachCode = reqDto.WbCode,
  492. Grade = reqDto.Grade,
  493. HWBarCode = reqDto.SpoolCode,
  494. HWTypeCode = mater.SpoolCode, //BS80 大轮子 货物类型1
  495. ContGrpBarCode = reqDto.SpoolCode,
  496. ContGrpId = IdFactory.NewId(),
  497. IsFast = false,
  498. IsRework = reqDto.IsRework,
  499. CLBarCode = reqDto.MatBarCode,
  500. Size = 1,
  501. BackReason = "",
  502. IsBack = reqDto.IsBlack,
  503. IsCore = reqDto.IsCore,
  504. SolderCount = (int)reqDto.SolderCount,
  505. IsTorsChk = reqDto.IsTorsChk,
  506. WbGroupCode = reqDto.WbGroupCode,
  507. IsControlpanel = reqDto.IsControl,
  508. HoldTime = reqDto.HoldDuration,
  509. Wind = Winding,
  510. BatchNo = reqDto.Batch
  511. //IsMulti = reqDto.IsMulti
  512. };
  513. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  514. {
  515. barinfo.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  516. }
  517. _billInvinitrepository.Insert(barinfo);
  518. }
  519. else
  520. {
  521. }
  522. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  523. if (stock == null)
  524. {
  525. var inv = new BillInvnow()
  526. {
  527. InvBarCode = reqDto.MatBarCode,
  528. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  529. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  530. ExecDocsNo = reqDto.WorkOrder,
  531. ExecDocsRowNo = reqDto.MatBarCode,
  532. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  533. InvInOut = InvInOutType.In,
  534. ExecWho = "MES",
  535. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  536. InDocsNo = reqDto.WorkOrder,
  537. SuppCode = "",
  538. BomDocsNo = "",
  539. BomSetId = 0,
  540. SetGrpCode = "",
  541. BomMatCode = "",
  542. BomMatId = 0,
  543. BomMatName = "",
  544. MatId = mater.Id,
  545. MatCode = mater.Code,
  546. MatName = mater.Name,
  547. LengthQty = reqDto.Length,
  548. TareWQty = reqDto.Weight,
  549. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  550. RFIDBarCode = "",
  551. ProductMachCode = reqDto.WbCode,
  552. Grade = reqDto.Grade,
  553. HWBarCode = reqDto.SpoolCode,
  554. HWTypeCode = mater.SpoolCode,
  555. ContGrpBarCode = reqDto.SpoolCode,
  556. ContGrpId = IdFactory.NewId(),
  557. IsFast = false,
  558. IsRework = reqDto.IsRework,
  559. CLBarCode = reqDto.MatBarCode,
  560. ContGrpType = ContGrpType.Material,
  561. Size = 1,
  562. BackReason = "",
  563. IsBlack = reqDto.IsBlack,
  564. IsCore = reqDto.IsCore,
  565. WbGroupCode = reqDto.WbGroupCode,
  566. IsTorsChk = reqDto.IsTorsChk,
  567. IsControlpanel = reqDto.IsControl,
  568. HoldTime = reqDto.HoldDuration,
  569. SolderCount = reqDto.SolderCount,
  570. Wind = Winding,
  571. BatchNo = reqDto.Batch
  572. //IsMulti = reqDto.IsMulti
  573. };
  574. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  575. {
  576. inv.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  577. }
  578. if (!string.IsNullOrEmpty(reqDto.OvcValue))//已经扭转过的
  579. {
  580. inv.TorsChkValue = decimal.Parse(reqDto.OvcValue);
  581. inv.Memo = "接收数据含有扭转值";
  582. inv.Ovced = 1;
  583. inv.TorsChkQty = 1;
  584. }
  585. _billInvnowrepository.Insert(inv);
  586. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  587. }
  588. else
  589. {
  590. if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  591. {
  592. //if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  593. //{
  594. // stoc.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  595. //}
  596. bool isMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  597. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  598. {
  599. IsBlack = reqDto.IsBlack,
  600. IsCore = reqDto.IsCore,
  601. WbGroupCode = reqDto.WbGroupCode,
  602. IsTorsChk = reqDto.IsTorsChk,
  603. IsControlpanel = reqDto.IsControl,
  604. HoldTime = reqDto.HoldDuration,
  605. SolderCount = reqDto.SolderCount,
  606. IsRework = reqDto.IsRework,
  607. CLBarCode = reqDto.MatBarCode,
  608. MatCode = mater.Code,
  609. MatName = mater.Name,
  610. LengthQty = reqDto.Length,
  611. TareWQty = reqDto.Weight,
  612. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  613. RFIDBarCode = "",
  614. ProductMachCode = reqDto.WbCode,
  615. Grade = reqDto.Grade,
  616. InDocsNo = reqDto.WorkOrder,
  617. Wind = Winding,
  618. EditTime = DateTime.Now,
  619. IsMulti = isMulti
  620. }, p => p.ContGrpBarCode == reqDto.SpoolCode && p.Id == stock.Id);
  621. }
  622. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  623. {
  624. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  625. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  626. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(), Time = DateTime.Now });
  627. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  628. return res;
  629. }
  630. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  631. {
  632. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  633. res.ResMsg = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  634. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成", Time = DateTime.Now });
  635. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  636. return res;
  637. }
  638. }
  639. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  640. if (task != null && task.Type == TaskType.OutDepot)
  641. {
  642. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  643. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  644. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务", Time = DateTime.Now });
  645. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  646. return res;
  647. }
  648. if (task != null)
  649. {
  650. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  651. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  652. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(), Time = DateTime.Now });
  653. return res;
  654. }
  655. var wcs = new WCS_TaskInfo()
  656. {
  657. Status = TaskStatus.NewBuild,
  658. Type = TaskType.EnterDepot,
  659. Priority = 0,
  660. Device = "",
  661. SrmStation = "",
  662. AddrFrom = "root",
  663. BarCode = reqDto.SpoolCode,
  664. AddWho = "wms",
  665. EditWho = "wms",
  666. WarehouseCode = wareHosue.Code,
  667. AddrTo = "",
  668. Tunnel = "",
  669. MaterialCode = mater.Code,
  670. MatCode = mater.Code,
  671. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  672. Floor = 0,
  673. Grade = reqDto.Grade,
  674. Length = reqDto.Length,
  675. WorkBench = reqDto.WbCode,
  676. WorkOrder = reqDto.WorkOrder
  677. };
  678. _db.BeginTran();
  679. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  680. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  681. var wcsdtl = new WCS_TaskDtl()
  682. {
  683. ID = Guid.NewGuid(),
  684. CurPoint = reqDto.SpoolCode,
  685. AddTime = DateTime.Now,
  686. AddWho = "wms",
  687. Enabled = true,
  688. ParentTaskCode = wcstask.ID,
  689. Desc = wcstask.BusType
  690. };
  691. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  692. _db.CommitTran();
  693. }
  694. catch (Exception ex)
  695. {
  696. _db.RollbackTran();
  697. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  698. res.ResMsg = ex.Message;
  699. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  700. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ex.Message, Time = DateTime.Now });
  701. }
  702. return res;
  703. }
  704. /// <summary>
  705. /// 关闭工单
  706. /// </summary>
  707. /// <returns></returns>
  708. public SRes CloseWorkOrder(CloseWorkOrderRequest reqDto)
  709. {
  710. var res = new SRes();
  711. try
  712. {
  713. foreach (var item in reqDto.listinfo)
  714. {
  715. var boxrule = _boxrulerepository.AsQueryable().Where(x => x.DocsNo.Contains(item)).ToList();
  716. var boxruleId= boxrule.Where(x => x.ZXStateCode == 0).Select(x=>x.Id).ToList();
  717. if (boxruleId.Any())
  718. {
  719. _db.BeginTran();
  720. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  721. {
  722. ZXStateCode = 2,
  723. Memo = "工单终止,自动停用"
  724. }, x => boxruleId.Contains(x.Id));
  725. _db.CommitTran();
  726. }
  727. }
  728. }
  729. catch (Exception e)
  730. {
  731. _db.RollbackTran();
  732. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  733. res.ResMsg = e.Message;
  734. return res;
  735. }
  736. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  737. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  738. return res;
  739. }
  740. /// <summary>
  741. /// 扭转出库申请
  742. /// </summary>
  743. /// <param name="request"></param>
  744. /// <returns></returns>
  745. public SRes TorsChkStockOut(TorsChkStockOutRequest request)
  746. {
  747. var res = new SRes();
  748. try
  749. {
  750. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  751. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.IsTorsChk == true && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.TorsChkQty < 1
  752. && !p.ProductMachCode.Contains("R") && p.Grade == "A")
  753. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  754. select new
  755. {
  756. stock.MatCode,
  757. stock.InvBarCode,
  758. stock.Grade,
  759. stock.InvStateCode,
  760. stock.ProductTime,
  761. stock.SkuCode,
  762. stock.WbGroupCode,
  763. stock.IsTorsChk,
  764. stock.TorsChkQty,
  765. stock.TorsChkValue,
  766. stock.HoldTime,
  767. stock.ProductMachCode,
  768. stock.HWTypeCode,
  769. loc.Col,
  770. loc.Layer,
  771. loc.Shelf,
  772. loc.Depth,
  773. loc.Code,
  774. loc.Tunnel,
  775. loc.SCRel,
  776. loc.Floor,
  777. loc.WarehouseCode,
  778. loc.ContGrpBarCode,
  779. loc.Id,
  780. loc.StateNum,
  781. };
  782. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  783. if (tunlist.Any())
  784. {
  785. if (tunlist.Where(p => p.Default2 == "1").Any())
  786. {
  787. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  788. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  789. }
  790. if (tunlist.Where(p => p.Default2 == "2").Any())
  791. {
  792. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  793. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  794. }
  795. if (tunlist.Where(p => p.Default2 == "3").Any())
  796. {
  797. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  798. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  799. }
  800. }
  801. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  802. int srarthour = int.Parse(TorschkDate.Default2);
  803. int endhour = int.Parse(TorschkDate.Default3);
  804. //2025-01-02 客户要求所有未扭转在库内的工字轮都要扭转
  805. //invlist = invlist.ToList().Where(p => decimal.Parse((DateTime.Now - p.ProductTime).TotalHours.ToString("f2")) >= (p.HoldTime - decimal.Parse(TorschkDate.Default1)) && DateTime.Now.Hour >= srarthour && DateTime.Now.Hour <= endhour);
  806. if (!invlist.Any())
  807. {
  808. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip1", new RedisErrorInfo() { Equip = "TorsChkEquip1", Con = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮", Time = DateTime.Now });
  809. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  810. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮";
  811. return res;
  812. }
  813. var startTime = DateTime.Now.Date.AddDays(-1).AddMilliseconds(-1);
  814. invlist = invlist.Where(x => x.ProductTime <= startTime).ToList().OrderBy(p => p.Depth).ThenByDescending(p => p.ProductTime.Day);
  815. var tasklist = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription() && p.Type == TaskType.OutDepot).ToList();
  816. var torTaskCount = _sysconfigrepository.GetFirst(p => p.Code == "TorTaskCount").SContent;
  817. if (tasklist.Any() && tasklist.Count > int.Parse(torTaskCount))
  818. {
  819. res.ResMsg = "任务已经超最大数量";
  820. return res;
  821. }
  822. //var taskcount = (from task in tasklist.GroupBy(p => p.Floor)
  823. // select new FloorCountTemp
  824. // {
  825. // Floor = task.Key,//楼层的任务数量
  826. // Count = task.Count()
  827. // }).ToList();
  828. #region 按照堆垛机平均分配任务
  829. var tempcount = 12;//还可以创建的任务数量
  830. var mastinvlist = tasklist.Where(p => p.Status < TaskStatus.StackerCompleted);
  831. var tempinvlist = invlist;
  832. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  833. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.Device)
  834. select new SrmTaskTmep
  835. {
  836. Srm = x.Key,
  837. TaskCount = x.Count(),
  838. LocList = x.Select(q => q.AddrFrom).ToList()
  839. };
  840. var srmtasktobe = new List<SrmTaskTmep>();
  841. foreach (var srmlistitem in srmlist)
  842. {
  843. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  844. {
  845. srmtasktobe.Add(new SrmTaskTmep()
  846. {
  847. Srm = srmlistitem,
  848. TaskCount = 0,
  849. LocList = new List<string>()
  850. });
  851. }
  852. }
  853. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量
  854. var srmtasktobetemplocs = new List<string>();
  855. for (int i = 0; i < tempcount; i++)
  856. {
  857. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  858. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  859. foreach (var srmtasktobeitem in srmtasktobe)
  860. {
  861. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  862. {
  863. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  864. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  865. srmtasktobetemplocs.Add(first.Code);
  866. break;
  867. }
  868. }
  869. }
  870. #endregion 按照堆垛机平均分配任务
  871. invlist = invlist.Where(p => srmtasktobetemplocs.Contains(p.Code));
  872. //for (int floor = 1; floor <= 3; floor++)
  873. //{
  874. int pp = 0;
  875. //invlist = invlist.Where(p => p.Floor == floor);
  876. foreach (var item in invlist)
  877. {
  878. if (item.TorsChkValue != null)
  879. {
  880. continue;
  881. }
  882. //if (pp == 4)
  883. //{
  884. // break;
  885. //}
  886. var time1 = item.HoldTime + decimal.Parse(TorschkDate.SContent); //时效上限
  887. var time2 = item.HoldTime - decimal.Parse(TorschkDate.Default1); //时效下限
  888. //|| (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > 72 && decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > item.HoldTime)
  889. //if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) >= time2) //按小时判断是否扭转的方式应客户要求停用-2024-12-24
  890. if (item.ProductTime <= startTime) //时间在此范围即可流转,例:3号标记的检测盘(00:00到23:59之间),5号全部出库进行检测(7点开始出
  891. {
  892. var inv = _billInvnowrepository.GetSingle(p =>
  893. p.ContGrpBarCode == item.ContGrpBarCode &&
  894. p.InvStateCode == InvState.InvEcecState_In.ToString());
  895. if (inv == null)
  896. {
  897. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  898. new RedisErrorInfo
  899. {
  900. Equip = "TorsChkEquip2",
  901. Con = item.ContGrpBarCode +
  902. ResponseStatusCodeEnum.StockNotExist.GetDescription(),
  903. Time = DateTime.Now
  904. });
  905. continue;
  906. }
  907. if (item.Depth == 2)
  908. {
  909. var taskold = _wcstaskoldrepository.AsQueryable()
  910. .Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish)
  911. .SplitTable(p => p.Take(2)).First();
  912. if (taskold != null)
  913. {
  914. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  915. new RedisErrorInfo
  916. {
  917. Equip = "TorsChkEquip2",
  918. Con = item.ContGrpBarCode +
  919. ResponseStatusCodeEnum.StockNotExist.GetDescription(),
  920. Time = DateTime.Now
  921. });
  922. continue;
  923. }
  924. var respon = MoveTask(item.Code);
  925. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1") continue;
  926. }
  927. else
  928. {
  929. //判断存不存在任务
  930. var taskoldexist = _wcstaskoldrepository.AsQueryable()
  931. .Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish)
  932. .SplitTable(p => p.Take(2)).First();
  933. if (taskoldexist != null)
  934. {
  935. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  936. new RedisErrorInfo
  937. {
  938. Equip = "TorsChkEquip2",
  939. Con = item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务",
  940. Time = DateTime.Now
  941. });
  942. _logger.LogInformation(item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务");
  943. continue;
  944. }
  945. }
  946. var wcs = new WCS_TaskInfo
  947. {
  948. Status = TaskStatus.NewBuild,
  949. Type = TaskType.OutDepot,
  950. Priority = 0,
  951. Device = item.SCRel,
  952. SrmStation = item.SCRel,
  953. AddrFrom = item.Code,
  954. BarCode = inv.ContGrpBarCode,
  955. AddWho = "wms",
  956. EditWho = "wms",
  957. WarehouseCode = item.WarehouseCode,
  958. AddrTo = "",
  959. Tunnel = item.Tunnel.ToString(),
  960. MaterialCode = item.MatCode,
  961. MatCode = item.MatCode,
  962. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription(),
  963. Floor = item.Floor,
  964. Grade = item.Grade,
  965. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2
  966. };
  967. _db.BeginTran();
  968. if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > time1)
  969. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  970. {
  971. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  972. //ContUsageQty = 2, //扭转超时异常盘,2024-11-29客户要求不再更新异常
  973. EditTime = DateTime.Now
  974. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  975. else
  976. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  977. {
  978. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  979. EditTime = DateTime.Now
  980. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  981. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell
  982. {
  983. StateNum = LocationState.LocationState_StockOut,
  984. EditTime = DateTime.Now
  985. }, p => p.Code == item.Code);
  986. var flow = _mapper.Map<BillInvflow>(inv);
  987. flow.Id = GetId();
  988. flow.AddTime = DateTime.Now;
  989. flow.EditTime = DateTime.Now;
  990. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  991. flow.Memo = "扭转出库";
  992. _billInvflow.Insert(flow);
  993. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  994. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  995. var wcsdtl = new WCS_TaskDtl
  996. {
  997. ID = Guid.NewGuid(),
  998. CurPoint = wcstask.AddrFrom,
  999. AddTime = DateTime.Now,
  1000. AddWho = "wms",
  1001. Enabled = true,
  1002. ParentTaskCode = wcstask.ID,
  1003. Desc = wcstask.BusType
  1004. };
  1005. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  1006. _db.CommitTran();
  1007. //return res;
  1008. pp++;
  1009. }
  1010. }
  1011. //}
  1012. }
  1013. catch (Exception ex)
  1014. {
  1015. _db.RollbackTran();
  1016. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1017. res.ResMsg = ResponseStatusCodeEnum.InnerServerErr.GetDescription() + ex.Message;
  1018. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = ex.Message, Time = DateTime.Now });
  1019. return res;
  1020. }
  1021. return res;
  1022. }
  1023. public SRes<int> TorsChkComplete(TorsChkCompleteRequest request)
  1024. {
  1025. var res = new SRes<int>();
  1026. try
  1027. {
  1028. if (string.IsNullOrEmpty(request.TaskNo))
  1029. {
  1030. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  1031. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  1032. return res;
  1033. }
  1034. var ware = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  1035. if (ware == null)
  1036. {
  1037. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  1038. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  1039. return res;
  1040. }
  1041. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First();
  1042. if (task == null)
  1043. {
  1044. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1045. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  1046. return res;
  1047. }
  1048. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.IsTorsChk == true && p.TorsChkQty > 0);
  1049. if (stock == null)
  1050. {
  1051. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1052. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  1053. return res;
  1054. }
  1055. _db.BeginTran();
  1056. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  1057. var flow = _mapper.Map<BillInvflow>(stock);
  1058. flow.Id = GetId();
  1059. flow.AddTime = DateTime.Now;
  1060. flow.EditTime = DateTime.Now;
  1061. flow.Memo = "扭转出库任务完成";
  1062. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1063. _billInvflow.Insert(flow);
  1064. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  1065. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  1066. {
  1067. Status = TaskStatus.Finish,
  1068. EditTime = DateTime.Now,
  1069. ManualRemarks = "扭转完成"
  1070. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  1071. var wcsdtl = new WCS_TaskDtl()
  1072. {
  1073. ID = Guid.NewGuid(),
  1074. CurPoint = stock.TorsChkMachCode,
  1075. AddTime = DateTime.Now,
  1076. AddWho = "wms",
  1077. Enabled = true,
  1078. ParentTaskCode = task.Id,
  1079. Desc = "扭转完成"
  1080. };
  1081. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  1082. var inv = stock;
  1083. inv.Id = GetId();
  1084. inv.ContGrpId = GetId();
  1085. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  1086. inv.Memo = "扭转回库";
  1087. _billInvnowrepository.Insert(inv);
  1088. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  1089. var wcs = new WCS_TaskInfo()
  1090. {
  1091. Status = TaskStatus.NewBuild,
  1092. Type = TaskType.EnterDepot,
  1093. Priority = 0,
  1094. Device = "",
  1095. SrmStation = "",
  1096. AddrFrom = inv.TorsChkMachCode,
  1097. BarCode = stock.ContGrpBarCode,
  1098. AddWho = "wms",
  1099. EditWho = "wms",
  1100. WarehouseCode = ware.Code,
  1101. AddrTo = "",
  1102. Tunnel = "",
  1103. MaterialCode = inv.MatCode,
  1104. MatCode = inv.MatCode,
  1105. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  1106. Grade = inv.Grade
  1107. };
  1108. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  1109. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  1110. var wcsdtls = new WCS_TaskDtl()
  1111. {
  1112. ID = Guid.NewGuid(),
  1113. CurPoint = wcstask.AddrFrom,
  1114. AddTime = DateTime.Now,
  1115. AddWho = "wms",
  1116. Enabled = true,
  1117. ParentTaskCode = wcstask.ID,
  1118. Desc = wcstask.BusType
  1119. };
  1120. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  1121. res.ResData = wcstask.ID;
  1122. _db.CommitTran();
  1123. }
  1124. catch (Exception ex)
  1125. {
  1126. _db.RollbackTran();
  1127. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1128. res.ResMsg = ex.Message;
  1129. return res;
  1130. }
  1131. return res;
  1132. }
  1133. private long GetId()
  1134. {
  1135. return IdFactory.NewId();
  1136. }
  1137. /// <summary>
  1138. /// sku信息传输
  1139. /// </summary>
  1140. /// <param name="reqDto"></param>
  1141. /// <returns></returns>
  1142. public SRes SKUInfoTrans(SKUInfoTransRequest reqDto)
  1143. {
  1144. var res = new SRes();
  1145. foreach (var item in reqDto.ListInfo)
  1146. {
  1147. var model = _skuInforepository.GetSingle(p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1148. if (model == null)
  1149. {
  1150. _skuInforepository.Insert(new BillSkuInfo()
  1151. {
  1152. SkuCode = reqDto.SkuCode,
  1153. TypeCode = item.TypeCode,
  1154. TypeName = item.TypeName,
  1155. FieldCode = item.FieldCode,
  1156. FieldName = item.FieldName,
  1157. FieldUnit = item.FieldUnit,
  1158. FieldValue = item.FieldValue
  1159. });
  1160. }
  1161. else
  1162. {
  1163. //if (model.FieldCode == "QC_B02" || model.FieldCode == "QC_B03")
  1164. //{
  1165. _skuInforepository.UpdateSetColumnsTrue(p => new BillSkuInfo()
  1166. {
  1167. //TypeCode = item.TypeCode,
  1168. //TypeName = item.TypeName,
  1169. //FieldCode = item.FieldCode,
  1170. //FieldName = item.FieldName,
  1171. FieldUnit = item.FieldUnit,
  1172. FieldValue = item.FieldValue,
  1173. EditTime = DateTime.Now
  1174. }, p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1175. //}
  1176. }
  1177. }
  1178. return res;
  1179. }
  1180. /// <summary>
  1181. /// 包装信息传输
  1182. /// </summary>
  1183. /// <param name="reqDto"></param>
  1184. /// <returns></returns>
  1185. public SRes PackInfoTrans(PackInfoTrans reqDto)
  1186. {
  1187. var res = new SRes();
  1188. foreach (var item in reqDto.ListInfo)
  1189. {
  1190. var model = _packInforepository.GetSingle(p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1191. if (model == null)
  1192. {
  1193. _packInforepository.Insert(new BillPackInfo()
  1194. {
  1195. PackCode = reqDto.PackCode,
  1196. MatCode = item.MatCode,
  1197. MatName = item.MatName,
  1198. Count = item.Count,
  1199. UnitName = item.UnitName,
  1200. Weight = item.Weight,
  1201. PackDesc = reqDto.PackDesc,
  1202. PackMethodCode = reqDto.PackMethodCode,
  1203. PackMethod = reqDto.PackMethod,
  1204. EmptySpoolNum = reqDto.EmptySpoolNum,
  1205. Spool = reqDto.Spool,
  1206. SpoolNum = reqDto.SpoolNum,
  1207. LayersSpoolNum = reqDto.LayersSpoolNum,
  1208. LayersNum = reqDto.LayersNum,
  1209. AddWho = "MES",
  1210. EditWho = ""
  1211. });
  1212. }
  1213. else
  1214. {
  1215. _packInforepository.UpdateSetColumnsTrue(p => new BillPackInfo()
  1216. {
  1217. Count = item.Count,
  1218. UnitName = item.UnitName,
  1219. Weight = item.Weight,
  1220. PackDesc = reqDto.PackDesc,
  1221. PackMethodCode = reqDto.PackMethodCode,
  1222. PackMethod = reqDto.PackMethod,
  1223. EmptySpoolNum = reqDto.EmptySpoolNum,
  1224. Spool = reqDto.Spool,
  1225. SpoolNum = reqDto.SpoolNum,
  1226. LayersSpoolNum = reqDto.LayersSpoolNum,
  1227. LayersNum = reqDto.LayersNum,
  1228. EditWho = "MES"
  1229. }, p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1230. }
  1231. }
  1232. return res;
  1233. }
  1234. /// <summary>
  1235. /// 异常信息通用方法
  1236. /// </summary>
  1237. /// <param name="Code"></param>
  1238. /// <param name="Message"></param>
  1239. /// <returns></returns>
  1240. private SRes InsertErrorinfo(string Code, string Message)
  1241. {
  1242. var res = new SRes();
  1243. var error = new BaseErrorinfo()
  1244. {
  1245. ContBarCode = Code,
  1246. Message = Message,
  1247. AddWho = "",
  1248. EditWho = "",
  1249. Count = 1
  1250. };
  1251. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == Code && p.Message == Message);
  1252. if (errorinfo != null)
  1253. {
  1254. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  1255. {
  1256. Count = errorinfo.Count + 1
  1257. }, p => p.ContBarCode == errorinfo.ContBarCode);
  1258. }
  1259. else
  1260. {
  1261. _errorinforepository.Insert(error);
  1262. }
  1263. return res;
  1264. }
  1265. /// <summary>
  1266. /// 分配楼层
  1267. /// </summary>
  1268. /// <param name="reqDto"></param>
  1269. /// <returns></returns>
  1270. public SRes<ApplyFloorResponse> ApplyFloor(ApplyFloorRequest reqDto)
  1271. {
  1272. var time = new Stopwatch();
  1273. time.Restart();
  1274. var result = new SRes<ApplyFloorResponse>()
  1275. {
  1276. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1277. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1278. ResData = new ApplyFloorResponse(),
  1279. };
  1280. if (!Const.SxFloorEquip.Contains(reqDto.EquNo))
  1281. {
  1282. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1283. result.ResMsg = reqDto.EquNo + "没有当前扫码设备";
  1284. InsertErrorinfo(reqDto.Code, "异常口:" + result.ResMsg + "自动排出" + DateTime.Now);
  1285. return result;
  1286. }
  1287. //C质量异常排出处理
  1288. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1289. if (stock == null)
  1290. {
  1291. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1292. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1293. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1294. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1295. return result;
  1296. }
  1297. else
  1298. {
  1299. if (stock.Grade == "C" || stock.Grade == "D" || stock.Grade == "B")
  1300. {
  1301. try
  1302. {
  1303. _db.BeginTran();
  1304. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1305. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1306. var flow = _mapper.Map<BillInvflow>(stock);
  1307. flow.Id = GetId();
  1308. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1309. flow.AddTime = DateTime.Now;
  1310. flow.EditTime = DateTime.Now;
  1311. flow.Memo = "BCD质量异常排出";
  1312. _billInvflow.Insert(flow);
  1313. _db.CommitTran();
  1314. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1315. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1316. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1317. return result;
  1318. }
  1319. catch (Exception ex)
  1320. {
  1321. _db.RollbackTran();
  1322. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1323. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1324. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1325. return result;
  1326. }
  1327. }
  1328. }
  1329. //由于重绕盘间隔时间太长,所以查当前任务表
  1330. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(3)).First();
  1331. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).First();
  1332. if (wcstask == null)
  1333. {
  1334. try
  1335. {
  1336. _db.BeginTran();
  1337. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1338. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1339. if (stocks != null)
  1340. {
  1341. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1342. var flow = _mapper.Map<BillInvflow>(stocks);
  1343. flow.Id = GetId();
  1344. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1345. flow.AddTime = DateTime.Now;
  1346. flow.EditTime = DateTime.Now;
  1347. flow.Memo = "任务异常排出";
  1348. _billInvflow.Insert(flow);
  1349. }
  1350. _db.CommitTran();
  1351. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1352. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1353. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1354. return result;
  1355. }
  1356. catch (Exception ex)
  1357. {
  1358. _db.RollbackTran();
  1359. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1360. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1361. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1362. return result;
  1363. }
  1364. }
  1365. if (wcstask.Type != TaskType.EnterDepot)
  1366. {
  1367. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1368. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1369. if (stocks != null)
  1370. {
  1371. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1372. var flow = _mapper.Map<BillInvflow>(stocks);
  1373. flow.Id = GetId();
  1374. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1375. flow.AddTime = DateTime.Now;
  1376. flow.EditTime = DateTime.Now;
  1377. flow.Memo = "任务异常排出";
  1378. _billInvflow.Insert(flow);
  1379. }
  1380. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1381. result.ResMsg = reqDto.Code + "不是入库任务,不允许分配楼层";
  1382. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1383. return result;
  1384. }
  1385. result.ResData.TaskNo = wcstask.ID;
  1386. if (stock.HWTypeCode == "BS60" || stock.HWTypeCode == "BS40")
  1387. {
  1388. result.Memo1 = "1";
  1389. }
  1390. else
  1391. {
  1392. result.Memo1 = "2";
  1393. }
  1394. var existstock = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Wind == stock.Wind && p.HWTypeCode == stock.HWTypeCode && p.WbGroupCode == stock.WbGroupCode && p.IsControlpanel == stock.IsControlpanel && p.IsTorsChk == stock.IsTorsChk && p.Ovced == stock.Ovced).ToList();
  1395. //去掉禁用巷道
  1396. List<int> distuns = new List<int>();
  1397. var time1 = new Stopwatch();
  1398. time1.Restart();
  1399. var time2 = new Stopwatch();
  1400. time2.Restart();
  1401. // 提前查询并返回符合条件的 cell 列表
  1402. var cellQuery = _basewarecellrepository.AsQueryable()
  1403. .With(SqlWith.NoLock)
  1404. .Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty); ;
  1405. var cell = new List<BaseWarecell>();
  1406. // 获取禁用的巷道信息
  1407. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  1408. if (disabletunnels != null && disabletunnels.Any())
  1409. {
  1410. foreach (var item in disabletunnels)
  1411. {
  1412. var distun = int.Parse(item.Default1);
  1413. var disfloor = int.Parse(item.Default2);
  1414. cellQuery.Where(x => !(x.Tunnel == distun && x.Floor == disfloor));
  1415. }
  1416. // 执行查询,获取最终的 cell 列表
  1417. cell = cellQuery.Clone().ToList();
  1418. }
  1419. else cell = cellQuery.ToList();
  1420. time2.Stop();
  1421. bool isTobeTors = false;
  1422. int tun = 2;
  1423. int row = 8;
  1424. if (stock.IsTorsChk == true && stock.IsControlpanel == true && stock.TorsChkQty <= 0 && stock.Ovced == 0)
  1425. {
  1426. isTobeTors = true;
  1427. }
  1428. #region 检测库存占比是否符合要求
  1429. if (isTobeTors)
  1430. {
  1431. //扭转检测库存最大比
  1432. var torsInventoryRate = _sysconfigrepository.GetFirst(p => p.Code == "TorsInventoryRate").SContent;
  1433. var torsInventoryRateValue = decimal.Parse(torsInventoryRate) / 100;
  1434. //计算已使用货位占比
  1435. decimal cellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Tunnel <= 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()).Count();
  1436. decimal fullCellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock)
  1437. .Where(p => p.Tunnel <= 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()
  1438. && p.StateNum != LocationState.LocationState_Empty).Count(); //所有不是空的货位都算作满货位
  1439. var fullCellRate = fullCellCount / cellCount;
  1440. if (fullCellRate >= torsInventoryRateValue)
  1441. {
  1442. result.ResData.TaskNo = 0;
  1443. result.ResMsg = reqDto.Code + $"扭转库存占比已达{ToPercentage(fullCellRate)},根据系统配置开始禁止入库";
  1444. return result;
  1445. }
  1446. }
  1447. else
  1448. {
  1449. //码垛库存最大比
  1450. var palletizingInventoryRate = _sysconfigrepository.GetFirst(p => p.Code == "PalletizingInventoryRate").SContent;
  1451. var palletizingInventoryRateValue = decimal.Parse(palletizingInventoryRate) / 100;
  1452. //计算已使用货位占比
  1453. decimal cellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Tunnel > 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()).Count();
  1454. decimal fullCellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock)
  1455. .Where(p => p.Tunnel > 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()
  1456. && p.StateNum != LocationState.LocationState_Empty).Count(); //所有不是空的货位都算作满货位
  1457. var fullCellRate = fullCellCount / cellCount;
  1458. if (fullCellRate >= palletizingInventoryRateValue)
  1459. {
  1460. result.ResData.TaskNo = 0;
  1461. result.ResMsg = reqDto.Code + $"码垛库存占比已达{ToPercentage(fullCellRate)},根据系统配置开始禁止入库";
  1462. return result;
  1463. }
  1464. }
  1465. #endregion 检测库存占比是否符合要求
  1466. var cellfloor1count = isTobeTors == true ? cell.Where(p => p.Floor == 1 && p.Tunnel <= tun).Count() : cell.Where(p => p.Floor == 1 && p.Tunnel > tun).Count(); //1楼层可用的货位数
  1467. var cellfloor2count = isTobeTors == true ? cell.Where(p => p.Floor == 2 && p.Tunnel <= tun).Count() : cell.Where(p => p.Floor == 2 && p.Tunnel > tun).Count(); //2楼层可用的货位数
  1468. var cellfloor3count = isTobeTors == true ? cell.Where(p => p.Floor == 3 && p.Tunnel <= tun).Count() : cell.Where(p => p.Floor == 3 && p.Tunnel > tun).Count(); //3楼层可用的货位数
  1469. var cellfloor1stockcount = isTobeTors == true ? existstock.Where(p => p.PutLayer >= 1 && p.PutLayer <= 4 && p.PutRow <= row).Count() : existstock.Where(p => p.PutLayer >= 1 && p.PutLayer <= 4 && p.PutRow > row).Count(); //1楼层同规格数量
  1470. var cellfloor2stockcount = isTobeTors == true ? existstock.Where(p => p.PutLayer >= 5 && p.PutLayer <= 8 && p.PutRow <= row).Count() : existstock.Where(p => p.PutLayer >= 5 && p.PutLayer <= 8 && p.PutRow > row).Count(); //2楼层同规格数量
  1471. var cellfloor3stockcount = isTobeTors == true ? existstock.Where(p => p.PutLayer >= 9 && p.PutLayer <= 12 && p.PutRow <= row).Count() : existstock.Where(p => p.PutLayer >= 9 && p.PutLayer <= 12 && p.PutRow > row).Count(); //3楼层同规格数量
  1472. var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent);
  1473. var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  1474. if (!string.IsNullOrEmpty(forbidlayer))
  1475. {
  1476. if (forbidlayer.Contains("1")) cellfloor1count = 0;
  1477. if (forbidlayer.Contains("2")) cellfloor2count = 0;
  1478. if (forbidlayer.Contains("3")) cellfloor3count = 0;
  1479. }
  1480. //cellfloor2count = 0;//临时修改,限制楼层分配
  1481. var tempcells = new List<Tuple<int, int, double>>() {
  1482. new Tuple<int, int,double>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count*1.0)),
  1483. new Tuple<int, int,double>(2,cellfloor2count,cellfloor2stockcount / (cellfloor2count*1.0)),
  1484. new Tuple<int, int,double>(3,cellfloor3count,cellfloor3stockcount / (cellfloor3count*1.0)),
  1485. };
  1486. //tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();//按照空位数排序
  1487. tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  1488. //每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  1489. var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  1490. var time10 = new Stopwatch();
  1491. time10.Restart();
  1492. if (tempcells[0].Item2 > 30)
  1493. {
  1494. if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > floorTaskCount || tempcells[0].Item2 == 0)
  1495. {
  1496. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  1497. {
  1498. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  1499. {
  1500. var it1 = taskcount.Where(p => p.Floor == tempcells[0].Item1).Count();
  1501. var it2 = taskcount.Where(p => p.Floor == tempcells[1].Item1).Count();
  1502. var it3 = taskcount.Where(p => p.Floor == tempcells[2].Item1).Count();
  1503. result.ResData.TaskNo = 0;
  1504. result.ResMsg = reqDto.Code + $"当前环线三个楼层执行中的任务数已满,不允许分配楼层1-{tempcells[0].Item1}:{it1}:{tempcells[0].Item2}--{tempcells[1].Item1}:{it2}:{tempcells[1].Item2}--{tempcells[2].Item1}:{it3}:{tempcells[2].Item2}";
  1505. result.ResData.Floor = 0;
  1506. return result;
  1507. }
  1508. else
  1509. {
  1510. result.ResData.Floor = tempcells[2].Item1;
  1511. }
  1512. }
  1513. else
  1514. {
  1515. result.ResData.Floor = tempcells[1].Item1;
  1516. }
  1517. }
  1518. else
  1519. {
  1520. result.ResData.Floor = tempcells[0].Item1;
  1521. }
  1522. }
  1523. else
  1524. {
  1525. if (tempcells[1].Item2 > 30)
  1526. {
  1527. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  1528. {
  1529. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  1530. {
  1531. result.ResData.TaskNo = 0;
  1532. result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层2";
  1533. result.ResData.Floor = 0;
  1534. return result;
  1535. }
  1536. else
  1537. {
  1538. result.ResData.Floor = tempcells[2].Item1;
  1539. }
  1540. }
  1541. else
  1542. {
  1543. result.ResData.Floor = tempcells[1].Item1;
  1544. }
  1545. }
  1546. else
  1547. {
  1548. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  1549. {
  1550. result.ResData.Floor = tempcells[2].Item1;
  1551. }
  1552. else
  1553. {
  1554. result.ResData.TaskNo = 0;
  1555. result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层3";
  1556. result.ResData.Floor = 0;
  1557. return result;
  1558. }
  1559. }
  1560. }
  1561. time10.Stop();
  1562. time1.Stop();
  1563. time.Stop();
  1564. _logger.LogInformation($"ApplyFloor:{reqDto.Code}--总耗时{time.ElapsedMilliseconds}-可用楼层计算耗时{time1.ElapsedMilliseconds}-排除禁用巷道{time2.ElapsedMilliseconds}-计算目标楼层耗时{time2.ElapsedMilliseconds}");
  1565. #region 逻辑暂时不用(不换楼层优先)
  1566. //switch (reqDto.EquNo)
  1567. //{
  1568. // case "2134": //一号分层扫码器
  1569. // if (cellfloor1count > 30)
  1570. // {
  1571. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1572. // {
  1573. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1574. // {
  1575. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1576. // {
  1577. // result.ResData.TaskNo = 0;
  1578. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1579. // result.ResData.Floor = 0;
  1580. // return result;
  1581. // }
  1582. // else
  1583. // {
  1584. // result.ResData.Floor = 3;
  1585. // }
  1586. // }
  1587. // else
  1588. // {
  1589. // result.ResData.Floor = 2;
  1590. // }
  1591. // }
  1592. // else
  1593. // {
  1594. // result.ResData.Floor = 1;
  1595. // }
  1596. // }
  1597. // else
  1598. // {
  1599. // if (cellfloor2count > 30)
  1600. // {
  1601. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1602. // {
  1603. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1604. // {
  1605. // result.ResData.TaskNo = 0;
  1606. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1607. // result.ResData.Floor = 0;
  1608. // return result;
  1609. // }
  1610. // else
  1611. // {
  1612. // result.ResData.Floor = 3;
  1613. // }
  1614. // }
  1615. // else
  1616. // {
  1617. // result.ResData.Floor = 2;
  1618. // }
  1619. // }
  1620. // else
  1621. // {
  1622. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1623. // {
  1624. // result.ResData.Floor = 3;
  1625. // }
  1626. // else
  1627. // {
  1628. // result.ResData.TaskNo = 0;
  1629. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1630. // result.ResData.Floor = 0;
  1631. // return result;
  1632. // }
  1633. // }
  1634. // }
  1635. // break;
  1636. // case "2258": //二号分层扫码器
  1637. // if (cellfloor2count > 30)
  1638. // {
  1639. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1640. // {
  1641. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1642. // {
  1643. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1644. // {
  1645. // result.ResData.TaskNo = 0;
  1646. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1647. // result.ResData.Floor = 0;
  1648. // return result;
  1649. // }
  1650. // else
  1651. // {
  1652. // result.ResData.Floor = 3;
  1653. // }
  1654. // }
  1655. // else
  1656. // {
  1657. // result.ResData.Floor = 1;
  1658. // }
  1659. // }
  1660. // else
  1661. // {
  1662. // result.ResData.Floor = 2;
  1663. // }
  1664. // }
  1665. // else
  1666. // {
  1667. // if (cellfloor1count > 30)
  1668. // {
  1669. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1670. // {
  1671. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1672. // {
  1673. // result.ResData.TaskNo = 0;
  1674. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1675. // result.ResData.Floor = 0;
  1676. // return result;
  1677. // }
  1678. // else
  1679. // {
  1680. // result.ResData.Floor = 3;
  1681. // }
  1682. // }
  1683. // else
  1684. // {
  1685. // result.ResData.Floor = 1;
  1686. // }
  1687. // }
  1688. // else
  1689. // {
  1690. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1691. // {
  1692. // result.ResData.Floor = 3;
  1693. // }
  1694. // else
  1695. // {
  1696. // result.ResData.TaskNo = 0;
  1697. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1698. // result.ResData.Floor = 0;
  1699. // return result;
  1700. // }
  1701. // }
  1702. // }
  1703. // break;
  1704. // case "2419": //三号分层扫码器
  1705. // if (cellfloor3count > 30)
  1706. // {
  1707. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1708. // {
  1709. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1710. // {
  1711. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1712. // {
  1713. // result.ResData.TaskNo = 0;
  1714. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1715. // result.ResData.Floor = 0;
  1716. // return result;
  1717. // }
  1718. // else
  1719. // {
  1720. // result.ResData.Floor = 1;
  1721. // }
  1722. // }
  1723. // else
  1724. // {
  1725. // result.ResData.Floor = 2;
  1726. // }
  1727. // }
  1728. // else
  1729. // {
  1730. // result.ResData.Floor = 3;
  1731. // }
  1732. // }
  1733. // else
  1734. // {
  1735. // if (cellfloor1count > 30)
  1736. // {
  1737. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1738. // {
  1739. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1740. // {
  1741. // result.ResData.TaskNo = 0;
  1742. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1743. // result.ResData.Floor = 0;
  1744. // return result;
  1745. // }
  1746. // else
  1747. // {
  1748. // result.ResData.Floor = 2;
  1749. // }
  1750. // }
  1751. // else
  1752. // {
  1753. // result.ResData.Floor = 1;
  1754. // }
  1755. // }
  1756. // else
  1757. // {
  1758. // if (taskcount.Where(p => p.Floor == 2).Count() < 32 && cellfloor2count > 30)
  1759. // {
  1760. // result.ResData.Floor = 2;
  1761. // }
  1762. // else
  1763. // {
  1764. // result.ResData.TaskNo = 0;
  1765. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1766. // result.ResData.Floor = 0;
  1767. // return result;
  1768. // }
  1769. // }
  1770. // }
  1771. // break;
  1772. // default:
  1773. // break;
  1774. //}
  1775. #endregion 逻辑暂时不用(不换楼层优先)
  1776. //var maxcount = cellfloor1count > cellfloor2count ? (cellfloor1count > cellfloor3count ? cellfloor1count : cellfloor3count) : (cellfloor2count > cellfloor3count ? cellfloor2count : cellfloor3count);
  1777. //if (maxcount == cellfloor1count)
  1778. //{
  1779. // result.ResData.Floor = 1;
  1780. //}
  1781. //else if (maxcount == cellfloor2count)
  1782. //{
  1783. // result.ResData.Floor = 2;
  1784. //}
  1785. //else if (maxcount == cellfloor3count)
  1786. //{
  1787. // result.ResData.Floor = 3;
  1788. //}
  1789. //楼层禁用
  1790. //var floorlist = _sysconfigrepository.GetList(p => p.SType == "FloorType" && !string.IsNullOrEmpty(p.SContent));
  1791. //if (floorlist.Any())
  1792. //{
  1793. // if (floorlist.Select(p => p.Code).ToList().Contains(result.ResData.Floor.ToString()))
  1794. // {
  1795. // result.ResData.Floor = 0;
  1796. // }
  1797. //}
  1798. result.Memo2 = stock.Grade;
  1799. return result;
  1800. }
  1801. /// <summary>
  1802. /// 获取巷道
  1803. /// </summary>
  1804. /// <param name="reqEntity"></param>
  1805. /// <returns></returns>
  1806. public SRes<string> GetTunnelPriorityList(GetSxTunnelPriorityListRequest reqEntity)
  1807. {
  1808. var result = new SRes<string>();
  1809. if (reqEntity.Floor <= 0 || reqEntity.Floor > 3)
  1810. {
  1811. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1812. result.ResMsg = reqEntity.Code + "楼层参数不能为0或大于3";
  1813. result.ResData = "";
  1814. return result;
  1815. }
  1816. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqEntity.Code && p.Status < TaskStatus.Finish).First();
  1817. if (wcstask == null)
  1818. {
  1819. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1820. result.ResMsg = reqEntity.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1821. return result;
  1822. }
  1823. if (wcstask.Type != TaskType.EnterDepot)
  1824. {
  1825. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1826. result.ResMsg = reqEntity.Code + "不是入库任务,不允许分配巷道";
  1827. return result;
  1828. }
  1829. //获取任务数占用最少的
  1830. var wcstasks = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.WarehouseCode == wcstask.WarehouseCode && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor == reqEntity.Floor && p.Tunnel != "0" && p.Tunnel != "" && p.Tunnel != null);
  1831. var tunnelcountlist = new List<TunnelCountTemp>();
  1832. var runningtasks = wcstasks.ToList();
  1833. if (runningtasks.Any())
  1834. {
  1835. tunnelcountlist = (from task in runningtasks.GroupBy(p => p.Tunnel)
  1836. select new TunnelCountTemp
  1837. {
  1838. Tunnel = task.Key,
  1839. Count = task.Count()
  1840. }).ToList();
  1841. }
  1842. //获取库位所有巷道列表
  1843. var alltunnels = _basewarecellrepository.GetList(p => p.Floor == reqEntity.Floor).Select(p => p.Tunnel).Distinct();
  1844. foreach (var item in alltunnels)
  1845. {
  1846. if (!tunnelcountlist.Where(p => p.Tunnel == item.ToString()).Any())
  1847. {
  1848. tunnelcountlist.Add(new TunnelCountTemp()
  1849. {
  1850. Tunnel = item.ToString(),
  1851. Count = 0
  1852. });
  1853. }
  1854. }
  1855. var tasktunnelcountlist = tunnelcountlist.OrderBy(p => p.Count).ToList();
  1856. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  1857. //获取已占用库位最少的货架
  1858. var threshold = 5; //int.Parse(ConfigUtil.GetConfiguration["Threshold"]);//阈值
  1859. var locationsreturn = _basewarecellrepository.GetList(p => p.WarehouseId == warehouse.Id && p.Floor == reqEntity.Floor && p.Size >= wcstask.Height && p.StateNum == LocationState.LocationState_Full && p.IsStop == 0);
  1860. var shelflocationcount = _basewarecellrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Floor == reqEntity.Floor && p.Size >= wcstask.Height && p.TypeNum == LocationType.LocationType_StorageLocation && p.IsStop == 0).GroupBy(p => new { p.Tunnel, p.Shelf }).Select(p => new { Tunnel = p.Key.Tunnel, Shelf = p.Key.Shelf, LocationCount = p.Select(q => q.Id).Count() });
  1861. List<TunnelCountTemp> tempProportion = new List<TunnelCountTemp>();
  1862. if (locationsreturn == null || !locationsreturn.Any())
  1863. {
  1864. result.ResData = string.Join(",", tasktunnelcountlist.OrderBy(p => p.Count).Select(p => p.Tunnel));
  1865. }
  1866. else
  1867. {
  1868. var grouplocationtunnels = (from location in locationsreturn.GroupBy(p => p.Tunnel)
  1869. select new TunnelCountTemp
  1870. {
  1871. Tunnel = location.Key.ToString(),
  1872. Count = location.Count(),
  1873. Proportion = location.Count() / (shelflocationcount.Where(p => p.Tunnel == location.Key).Any() ? decimal.Parse(shelflocationcount.Where(p => p.Tunnel == location.Key).Sum(p => p.LocationCount).ToString()) : 1)
  1874. }).ToList().OrderBy(p => p.Count).ToList();
  1875. foreach (var item in alltunnels)
  1876. {
  1877. if (!grouplocationtunnels.Where(p => p.Tunnel == item.ToString()).Any())
  1878. {
  1879. grouplocationtunnels.Add(new TunnelCountTemp()
  1880. {
  1881. Tunnel = item.ToString(),
  1882. Count = 0,
  1883. Proportion = 0
  1884. });
  1885. }
  1886. }
  1887. tempProportion = grouplocationtunnels;
  1888. grouplocationtunnels = grouplocationtunnels.OrderBy(p => p.Proportion).ToList();
  1889. var sorttunnels = grouplocationtunnels.OrderBy(p => p.Proportion).Select(p => p.Tunnel).ToList();
  1890. for (var i = 0; i < grouplocationtunnels.Count - 1; i++)
  1891. {
  1892. if (tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i].Tunnel).First().Count - threshold > tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i + 1].Tunnel).First().Count)
  1893. {
  1894. sorttunnels[i] = grouplocationtunnels[i + 1].Tunnel;
  1895. sorttunnels[i + 1] = grouplocationtunnels[i].Tunnel;
  1896. i++;
  1897. }
  1898. else
  1899. {
  1900. sorttunnels[i] = grouplocationtunnels[i].Tunnel;
  1901. }
  1902. }
  1903. result.ResData = string.Join(",", sorttunnels);
  1904. }
  1905. //删除没有空闲货位的货架
  1906. var arrresultTunnels = result.ResData.Split(',');
  1907. var emptylocationsreturn = _basewarecellrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Floor == reqEntity.Floor && p.Size >= wcstask.Height && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0);
  1908. var resultTunenls = new List<string>();
  1909. foreach (var sorttunnel in arrresultTunnels)
  1910. {
  1911. //获取巷道的入库任务数
  1912. var tunneltaskcount = runningtasks.Where(p => p.Tunnel == sorttunnel).Count(); //_taskrepository.GetList(p => p.WarehouseCode == wcstask.WarehouseCode && p.Floor == reqEntity.Floor && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Height >= wcstask.Height && p.Tunnel == wcstask.Tunnel).Count();
  1913. int left = 0;
  1914. if (emptylocationsreturn.Where(p => p.Tunnel == int.Parse(sorttunnel)).Count() - tunneltaskcount > left)
  1915. {
  1916. resultTunenls.Add(sorttunnel);
  1917. }
  1918. result.ResData = string.Join(",", resultTunenls);
  1919. }
  1920. //已分巷道的按巷道、物料编码分组,凑齐两个物料
  1921. var materTunenls = new List<string>();
  1922. var evenlist = new List<string>();
  1923. foreach (var item in result.ResData.Split(','))
  1924. {
  1925. var ss = runningtasks.Where(p => p.Tunnel == item);
  1926. var code = (from mat in ss.GroupBy(p => p.MatCode)
  1927. select new MaterCodeItems
  1928. {
  1929. MaterCode = mat.Key,
  1930. Count = mat.Count()
  1931. }).ToList();
  1932. if (code.Where(p => p.MaterCode == wcstask.MatCode).Any())
  1933. {
  1934. if (code.Where(p => p.MaterCode == wcstask.MatCode).First().Count % 2 == 1)
  1935. {
  1936. materTunenls.Add(item);
  1937. }
  1938. else
  1939. {
  1940. evenlist.Add(item);
  1941. }
  1942. }
  1943. else
  1944. {
  1945. evenlist.Add(item);
  1946. }
  1947. }
  1948. if (materTunenls.Any())
  1949. {
  1950. var tunlist = materTunenls.Union(evenlist).ToList();
  1951. result.ResData = string.Join(",", tunlist);
  1952. }
  1953. else
  1954. {
  1955. result.ResData = string.Join(",", evenlist);
  1956. }
  1957. //每条巷道最多允许存在2组任务
  1958. var MaxtaskcountTunnels = result.ResData.Split(',');
  1959. var tunnellist = new List<string>();
  1960. foreach (var item in MaxtaskcountTunnels)
  1961. {
  1962. if (runningtasks.Where(p => p.Tunnel == item).Count() > 5)
  1963. {
  1964. continue;
  1965. }
  1966. else
  1967. {
  1968. tunnellist.Add(item);
  1969. }
  1970. result.ResData = string.Join(",", tunnellist);
  1971. }
  1972. //根据配置过滤禁用的巷道
  1973. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent) && p.Default2 == reqEntity.Floor.ToString());
  1974. if (disabletunnels != null && disabletunnels.Any())
  1975. {
  1976. var resultTunenlsNew = new List<string>();
  1977. var resultTunenlsTemp = result.ResData.Split(',');
  1978. foreach (var tun in resultTunenlsTemp)
  1979. {
  1980. if (!disabletunnels.Select(p => p.Default1).Contains(tun))
  1981. {
  1982. resultTunenlsNew.Add(tun);
  1983. }
  1984. }
  1985. result.ResData = string.Join(",", resultTunenlsNew);
  1986. }
  1987. if (!string.IsNullOrEmpty(reqEntity.Memo1))
  1988. {
  1989. if (result.ResData.Contains(reqEntity.Memo1))
  1990. {
  1991. result.ResData = reqEntity.Memo1;
  1992. }
  1993. }
  1994. result.Memo1 = wcstask.ID.ToString();
  1995. //待检测的优先1-2巷道,检测过的或者不需要检测的优先3-8巷道
  1996. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode);
  1997. var tunellist = result.ResData.Split(',');
  1998. var tunlen2list = tunellist.Where(p => int.Parse(p) < 4);
  1999. var tunthen2list = tunellist.Where(p => int.Parse(p) >= 4);
  2000. if (stock.IsTorsChk == true && stock.TorsChkQty == 0 && stock.Ovced == 0)
  2001. {
  2002. if (tunlen2list.Any())
  2003. {
  2004. result.ResData = string.Join(",", tunlen2list);
  2005. }
  2006. }
  2007. else if ((stock.IsTorsChk == true && stock.TorsChkQty == 1) || stock.IsTorsChk == false)
  2008. {
  2009. var torsTunelEnable = _sysconfigrepository.GetFirst(p => p.Code == "TorsTunelEnable");
  2010. //如果扭转任务数量小于20,并且库容量小于0.5的可以使用
  2011. if (torsTunelEnable.SContent == "1" && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.WarehouseCode == wcstask.WarehouseCode && p.Type == TaskType.OutDepot && p.Status < TaskStatus.Finish && p.BusType == "扭转检测").Count() < 20)
  2012. {
  2013. foreach (var item in tunlen2list.OrderByDescending(p => int.Parse(p)))
  2014. {
  2015. if (tempProportion.Where(p => p.Tunnel == item).Any() && tempProportion.Where(p => p.Tunnel == item).First().Proportion < decimal.Parse(torsTunelEnable.Default1))
  2016. {
  2017. tunthen2list = tunthen2list.Prepend(item);
  2018. }
  2019. }
  2020. }
  2021. if (tunthen2list.Any())
  2022. {
  2023. result.ResData = string.Join(",", tunthen2list);
  2024. }
  2025. else
  2026. {
  2027. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2028. result.ResMsg = reqEntity.Code + "没有可用巷道";
  2029. return result;
  2030. }
  2031. }
  2032. if (string.IsNullOrEmpty(result.ResData))
  2033. {
  2034. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2035. result.ResMsg = reqEntity.Code + "没有可用巷道";
  2036. return result;
  2037. }
  2038. return result;
  2039. }
  2040. /// <summary>
  2041. /// 分配货位
  2042. /// </summary>
  2043. /// <param name="request"></param>
  2044. /// <returns></returns>
  2045. public SRes<List<ApplyStockInLocResponse>> ApplyStockInLoc(SxApplyStockInLocRequest reqEntity)
  2046. {
  2047. var res = new SRes<List<ApplyStockInLocResponse>>();
  2048. if (reqEntity.Floor == 0 || reqEntity.Floor > 3)
  2049. {
  2050. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2051. res.ResMsg = string.Join(',', reqEntity.TaskNum) + "楼层参数传递错误";
  2052. res.ResData = new List<ApplyStockInLocResponse>();
  2053. return res;
  2054. }
  2055. if (reqEntity.TunnelNum <= 0)
  2056. {
  2057. res.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();
  2058. res.ResMsg = string.Join(',', reqEntity.TaskNum) + ResponseStatusCodeEnum.NotTunnelNum.GetDescription();
  2059. return res;
  2060. }
  2061. if (reqEntity.TaskNum.Count > 2)
  2062. {
  2063. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2064. res.ResMsg = "当前申请分配货位的任务数大于2";
  2065. return res;
  2066. }
  2067. if (reqEntity.TaskNum.Count == 0)
  2068. {
  2069. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  2070. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  2071. return res;
  2072. }
  2073. lock (lockerApplyLoc)
  2074. {
  2075. res = ApplyStockInLocTemp(reqEntity);
  2076. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2077. {
  2078. if (res.ResData.Any())
  2079. {
  2080. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  2081. {
  2082. StateNum = LocationState.LocationState_Empty
  2083. }, p => res.ResData.Select(p => p.CellNo).Contains(p.Code));
  2084. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2085. {
  2086. AddrTo = "",
  2087. Fork = 0
  2088. }).Where(p => reqEntity.TaskNum.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  2089. res.ResData = new List<ApplyStockInLocResponse>();
  2090. }
  2091. else
  2092. {
  2093. }
  2094. return res;
  2095. }
  2096. }
  2097. return res;
  2098. }
  2099. /// <summary>
  2100. /// 分配货位
  2101. /// </summary>
  2102. /// <param name="request"></param>
  2103. /// <returns></returns>
  2104. public SRes<List<ApplyStockInLocResponse>> ApplyStockInLocTemp(SxApplyStockInLocRequest reqEntity)
  2105. {
  2106. var result = new SRes<List<ApplyStockInLocResponse>>() { ResData = new List<ApplyStockInLocResponse>() };
  2107. //var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.ID) && p.Status < TaskStatus.Finish).ToList();
  2108. var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.Id) && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).ToList();
  2109. if (!wcstask.Any())
  2110. {
  2111. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2112. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2113. return result;
  2114. }
  2115. if (wcstask.Any(p => p.Type == TaskType.OutDepot))
  2116. {
  2117. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2118. result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + string.Join(",", reqEntity.TaskNum);
  2119. return result;
  2120. }
  2121. if (reqEntity.TaskNum.Count != wcstask.Count)
  2122. {
  2123. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2124. result.ResMsg = string.Join(',', reqEntity.TaskNum) + "申请的任务数与实际任务数不符";
  2125. return result;
  2126. }
  2127. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == "sxhouse");
  2128. if (warehouse == null)
  2129. {
  2130. result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  2131. result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  2132. return result;
  2133. }
  2134. var stocklist = _billInvnowrepository.GetList(p => wcstask.Select(p => p.BarCode).Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2135. if (!stocklist.Any())
  2136. {
  2137. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2138. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2139. return result;
  2140. }
  2141. if (reqEntity.TaskNum.Count != stocklist.Count)
  2142. {
  2143. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2144. result.ResMsg = string.Join(",", reqEntity.TaskNum) + "申请的任务数与库存数量不符";
  2145. return result;
  2146. }
  2147. if (wcstask.Count > 1)
  2148. {
  2149. List<ApplyStockInLocResponse> list = new List<ApplyStockInLocResponse>();
  2150. var code = string.Empty;
  2151. var num = new List<int>() { reqEntity.TaskNum[1], reqEntity.TaskNum[0] };
  2152. foreach (var item in num)
  2153. {
  2154. //验证库存
  2155. var task = wcstask.Where(p => p.Id == item).First();
  2156. var stock = stocklist.Where(p => p.ContGrpBarCode == task.BarCode).First();
  2157. if (!string.IsNullOrEmpty(task.AddrTo) && task.Fork != 0)
  2158. {
  2159. var applyCell = new ApplyStockInLocResponse()
  2160. {
  2161. TunnelNum = reqEntity.TunnelNum.ToString(),
  2162. CellNo = task.AddrTo,
  2163. Row = task.AddrTo.Split('-')[0] != null ? int.Parse(task.AddrTo.Split('-')[0]) : 0,
  2164. Colomn = task.AddrTo.Split('-')[1] != null ? int.Parse(task.AddrTo.Split('-')[1]) : 0,
  2165. Layer = task.AddrTo.Split('-')[2] != null ? int.Parse(task.AddrTo.Split('-')[2]) : 0,
  2166. Fork = task.Fork,
  2167. TaskNo = task.Id
  2168. };
  2169. result.ResData.Add(applyCell);
  2170. continue;
  2171. }
  2172. if (!string.IsNullOrEmpty(code))
  2173. {
  2174. var cell2 = ApplyLoc(new ApplyLocRequest()
  2175. {
  2176. MaterialId = stock.MatId,
  2177. MaterialCode = stock.MatCode,
  2178. TunnelNum = reqEntity.TunnelNum,
  2179. WarehuoseId = warehouse.Id,
  2180. IsMove = task.Type == TaskType.TransferDepot,
  2181. Floor = reqEntity.Floor,
  2182. CellCode = code,
  2183. Fork = 2,
  2184. Wind = stock.Wind,
  2185. IsControlpanel = stock.IsControlpanel,
  2186. IsTorsChk = stock.IsTorsChk,
  2187. TorsChkQty = stock.TorsChkQty,
  2188. ProductTime = stock.ProductTime,
  2189. Wbgroup = stock.WbGroupCode
  2190. });
  2191. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2192. {
  2193. result.ResCode = cell2.ResCode;
  2194. result.ResMsg = item + cell2.ResMsg;
  2195. return result;
  2196. }
  2197. try
  2198. {
  2199. cell2.ResData.Fork = 2;
  2200. cell2.ResData.TaskNo = item;
  2201. _db.BeginTran();
  2202. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2203. {
  2204. AddrTo = cell2.ResData.CellNo,
  2205. Fork = cell2.ResData.Fork
  2206. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2207. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2208. p => cell2.ResData.CellNo == p.Code);
  2209. _db.CommitTran();
  2210. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  2211. }
  2212. catch (Exception ex)
  2213. {
  2214. _db.RollbackTran();
  2215. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2216. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2217. return result;
  2218. }
  2219. continue;
  2220. }
  2221. #region 处理两个任务都是一货叉情况
  2222. if (item == reqEntity.TaskNum[0])
  2223. {
  2224. var cell2 = ApplyLoc(new ApplyLocRequest()
  2225. {
  2226. MaterialId = stock.MatId,
  2227. MaterialCode = stock.MatCode,
  2228. TunnelNum = reqEntity.TunnelNum,
  2229. WarehuoseId = warehouse.Id,
  2230. IsMove = task.Type == TaskType.TransferDepot,
  2231. Floor = reqEntity.Floor,
  2232. Fork = 2,
  2233. Wind = stock.Wind,
  2234. IsControlpanel = stock.IsControlpanel,
  2235. IsTorsChk = stock.IsTorsChk,
  2236. TorsChkQty = stock.TorsChkQty,
  2237. ProductTime = stock.ProductTime,
  2238. Wbgroup = stock.WbGroupCode
  2239. });
  2240. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2241. {
  2242. result.ResCode = cell2.ResCode;
  2243. result.ResMsg = item + cell2.ResMsg;
  2244. return result;
  2245. }
  2246. try
  2247. {
  2248. cell2.ResData.Fork = 2;
  2249. cell2.ResData.TaskNo = item;
  2250. _db.BeginTran();
  2251. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2252. {
  2253. AddrTo = cell2.ResData.CellNo,
  2254. Fork = cell2.ResData.Fork
  2255. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2256. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2257. p => cell2.ResData.CellNo == p.Code);
  2258. _db.CommitTran();
  2259. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  2260. }
  2261. catch (Exception ex)
  2262. {
  2263. _db.RollbackTran();
  2264. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2265. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2266. return result;
  2267. }
  2268. continue;
  2269. }
  2270. #endregion 处理两个任务都是一货叉情况
  2271. var cell1 = ApplyLoc(new ApplyLocRequest()
  2272. {
  2273. MaterialId = stock.MatId,
  2274. MaterialCode = stock.MatCode,
  2275. TunnelNum = reqEntity.TunnelNum,
  2276. WarehuoseId = warehouse.Id,
  2277. IsMove = task.Type == TaskType.TransferDepot,
  2278. Floor = reqEntity.Floor,
  2279. Fork = 1,
  2280. Wind = stock.Wind,
  2281. IsControlpanel = stock.IsControlpanel,
  2282. IsTorsChk = stock.IsTorsChk,
  2283. TorsChkQty = stock.TorsChkQty,
  2284. ProductTime = stock.ProductTime,
  2285. Wbgroup = stock.WbGroupCode
  2286. });
  2287. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2288. {
  2289. result.ResCode = cell1.ResCode;
  2290. result.ResMsg = item + cell1.ResMsg;
  2291. return result;
  2292. }
  2293. try
  2294. {
  2295. cell1.ResData.Fork = 1;
  2296. cell1.ResData.TaskNo = item;
  2297. code = cell1.ResData.CellNo;
  2298. _db.BeginTran();
  2299. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2300. {
  2301. AddrTo = cell1.ResData.CellNo,
  2302. Fork = cell1.ResData.Fork
  2303. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2304. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2305. p => cell1.ResData.CellNo == p.Code);
  2306. _db.CommitTran();
  2307. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  2308. }
  2309. catch (Exception ex)
  2310. {
  2311. _db.RollbackTran();
  2312. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2313. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2314. return result;
  2315. }
  2316. }
  2317. }
  2318. else
  2319. {
  2320. //验证库存
  2321. var stock = stocklist.Where(p => p.ContGrpBarCode == wcstask.First().BarCode).First();
  2322. if (stock == null)
  2323. {
  2324. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2325. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2326. return result;
  2327. }
  2328. if (!string.IsNullOrEmpty(wcstask.First().AddrTo) && wcstask.First().Fork != 0)
  2329. {
  2330. var applyCell = new ApplyStockInLocResponse()
  2331. {
  2332. TunnelNum = reqEntity.TunnelNum.ToString(),
  2333. CellNo = wcstask.First().AddrTo,
  2334. Row = wcstask.First().AddrTo.Split('-')[0] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[0]) : 0,
  2335. Colomn = wcstask.First().AddrTo.Split('-')[1] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[1]) : 0,
  2336. Layer = wcstask.First().AddrTo.Split('-')[2] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[2]) : 0,
  2337. Fork = wcstask.First().Fork,
  2338. TaskNo = wcstask.First().Id
  2339. };
  2340. result.ResData.Add(applyCell);
  2341. return result;
  2342. }
  2343. var cell1 = ApplyLoc(new ApplyLocRequest()
  2344. {
  2345. MaterialId = stock.MatId,
  2346. MaterialCode = stock.MatCode,
  2347. TunnelNum = reqEntity.TunnelNum,
  2348. WarehuoseId = warehouse.Id,
  2349. IsMove = wcstask.First().Type == TaskType.TransferDepot,
  2350. Floor = reqEntity.Floor,
  2351. Fork = 2,
  2352. Wind = stock.Wind,
  2353. IsControlpanel = stock.IsControlpanel,
  2354. IsTorsChk = stock.IsTorsChk,
  2355. TorsChkQty = stock.TorsChkQty,
  2356. ProductTime = stock.ProductTime,
  2357. Wbgroup = stock.WbGroupCode
  2358. });
  2359. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2360. {
  2361. result.ResCode = cell1.ResCode;
  2362. result.ResMsg = wcstask.First().Id + cell1.ResMsg;
  2363. return result;
  2364. }
  2365. try
  2366. {
  2367. cell1.ResData.TaskNo = wcstask.First().Id;
  2368. cell1.ResData.Fork = 2;
  2369. _db.BeginTran();
  2370. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2371. {
  2372. AddrTo = cell1.ResData.CellNo,
  2373. Fork = cell1.ResData.Fork,
  2374. }).Where(p => p.Id == wcstask.First().Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  2375. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2376. p => p.Code == cell1.ResData.CellNo);
  2377. _db.CommitTran();
  2378. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  2379. }
  2380. catch (Exception ex)
  2381. {
  2382. _db.RollbackTran();
  2383. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2384. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2385. }
  2386. }
  2387. return result;
  2388. }
  2389. public SRes<ApplyStockInLocResponse> ApplyLoc(ApplyLocRequest reqEntity)
  2390. {
  2391. var result = new SRes<ApplyStockInLocResponse>()
  2392. {
  2393. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2394. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  2395. ResData = new ApplyStockInLocResponse(),
  2396. };
  2397. //预留货位数量
  2398. var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
  2399. && p.StateNum == LocationState.LocationState_Empty
  2400. && p.TypeNum == LocationType.LocationType_StorageLocation
  2401. && p.Tunnel == reqEntity.TunnelNum
  2402. && p.WarehouseId == reqEntity.WarehuoseId
  2403. && p.Floor == reqEntity.Floor
  2404. );
  2405. //判断是否移库
  2406. if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10))
  2407. {
  2408. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2409. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  2410. return result;
  2411. }
  2412. var loc1ist = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  2413. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  2414. && loc1.Tunnel == reqEntity.TunnelNum
  2415. && loc1.WarehouseId == reqEntity.WarehuoseId
  2416. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1).ToList()
  2417. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  2418. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor).ToList()
  2419. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  2420. join stock in _billInvnowrepository.GetList(inv => inv.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(inv.PreStock))
  2421. on loct2.ContGrpBarCode equals stock.ContGrpBarCode
  2422. where loct1.Tunnel == reqEntity.TunnelNum && loct1.Floor == reqEntity.Floor
  2423. select new stocktemp1
  2424. {
  2425. Code = loct1.Code.ToString(),
  2426. Id = loct1.Id,
  2427. Row = loct1.Row,
  2428. Col = loct1.Col,
  2429. Layer = loct1.Layer,
  2430. Tunnel = loct1.Tunnel,
  2431. Floor = loct1.Floor,
  2432. ContGrpBarCode = loct2.ContGrpBarCode,
  2433. Shelf = loct2.Shelf,
  2434. MatCode = stock.MatCode,
  2435. MatId = stock.MatId,
  2436. WbGroupCode = stock.WbGroupCode,
  2437. InDocsNo = stock.InDocsNo,
  2438. Wind = stock.Wind,
  2439. IsControlpanel = stock.IsControlpanel,
  2440. IsTorsChk = stock.IsTorsChk,
  2441. TorsChkQty = stock.TorsChkQty,
  2442. ProductTime = stock.ProductTime
  2443. };
  2444. #region 非控制盘、已扭转的控制盘
  2445. if (reqEntity.IsControlpanel == false)
  2446. {
  2447. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2448. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  2449. {
  2450. if (reqEntity.Fork == 1)
  2451. {
  2452. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2453. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  2454. {
  2455. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2456. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2457. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2458. result.ResData.CellNo = resloc.Code;
  2459. result.ResData.Row = resloc.Row;
  2460. result.ResData.Colomn = resloc.Col;
  2461. result.ResData.Layer = resloc.Layer;
  2462. _logger.LogInformation("分货位埋点1:" + result.ResData.CellNo);
  2463. return result;
  2464. }
  2465. }
  2466. else
  2467. {
  2468. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2469. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).OrderBy(p => p.ProductTime).ThenBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2470. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2471. result.ResData.CellNo = resloc.Code;
  2472. result.ResData.Row = resloc.Row;
  2473. result.ResData.Colomn = resloc.Col;
  2474. result.ResData.Layer = resloc.Layer;
  2475. _logger.LogInformation("分货位埋点2:" + result.ResData.CellNo);
  2476. return result;
  2477. }
  2478. }
  2479. }
  2480. else
  2481. {
  2482. if (reqEntity.IsControlpanel == true && reqEntity.IsTorsChk == true && reqEntity.TorsChkQty > 0) //已扭转完
  2483. {
  2484. //var starttime = reqEntity.ProductTime.Date.AddHours(13);
  2485. //var endtime = reqEntity.ProductTime.Date.AddDays(1).AddHours(8);
  2486. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2487. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())// && p.ProductTime >= starttime && p.ProductTime <= endtime
  2488. {
  2489. if (reqEntity.Fork == 1)
  2490. {
  2491. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2492. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())//&& p.ProductTime >= starttime && p.ProductTime <= endtime
  2493. {
  2494. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2495. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
  2496. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2497. result.ResData.CellNo = resloc.Code;
  2498. result.ResData.Row = resloc.Row;
  2499. result.ResData.Colomn = resloc.Col;
  2500. result.ResData.Layer = resloc.Layer;
  2501. _logger.LogInformation("分货位埋点3:" + result.ResData.CellNo);
  2502. return result;
  2503. }
  2504. }
  2505. else
  2506. {
  2507. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2508. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();//&& p.ProductTime >= starttime && p.ProductTime <= endtime
  2509. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2510. result.ResData.CellNo = resloc.Code;
  2511. result.ResData.Row = resloc.Row;
  2512. result.ResData.Colomn = resloc.Col;
  2513. result.ResData.Layer = resloc.Layer;
  2514. _logger.LogInformation("分货位埋点4:" + result.ResData.CellNo);
  2515. return result;
  2516. }
  2517. }
  2518. }
  2519. }
  2520. #endregion 非控制盘、已扭转的控制盘
  2521. //再找二深位空的
  2522. if (emptyLoc.Where(p => p.Depth == 2).Any())
  2523. {
  2524. //一深位必须空
  2525. var templist = from loc1 in _basewarecellrepository.GetList(p => p.Depth == 1 && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0 && p.Floor == reqEntity.Floor && p.Tunnel == reqEntity.TunnelNum)
  2526. join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer } equals new { loc2.Col, loc2.Layer }
  2527. select loc2;
  2528. if (templist == null || !templist.Any())
  2529. {
  2530. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2531. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的二升位";
  2532. _logger.LogInformation("分货位埋点5:" + result.ResData.CellNo);
  2533. return result;
  2534. }
  2535. if (!string.IsNullOrEmpty(reqEntity.CellCode))
  2536. {
  2537. var cell = reqEntity.CellCode.Split('-');
  2538. if (cell[4] == "2")
  2539. {
  2540. var cell2 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3]).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row); //优先同货架相邻同层货位
  2541. if (cell2.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).Any())
  2542. {
  2543. var cell3 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).OrderBy(p => p.Col).ThenBy(p => p.Row).First();
  2544. result.ResData.TunnelNum = cell3.Tunnel.ToString();
  2545. result.ResData.CellNo = cell3.Code;
  2546. result.ResData.Row = cell3.Row;
  2547. result.ResData.Colomn = cell3.Col;
  2548. result.ResData.Layer = cell3.Layer;
  2549. result.ResData.Fork = 2;
  2550. _logger.LogInformation("分货位埋点6:" + result.ResData.CellNo);
  2551. return result;
  2552. }
  2553. else
  2554. {
  2555. if (cell2.Any())
  2556. {
  2557. var cell4 = cell2.First();
  2558. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  2559. result.ResData.CellNo = cell4.Code;
  2560. result.ResData.Row = cell4.Row;
  2561. result.ResData.Colomn = cell4.Col;
  2562. result.ResData.Layer = cell4.Layer;
  2563. result.ResData.Fork = 2;
  2564. _logger.LogInformation("分货位埋点7:" + result.ResData.CellNo);
  2565. return result;
  2566. }
  2567. else
  2568. {
  2569. var cell4 = templist.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2570. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  2571. result.ResData.CellNo = cell4.Code;
  2572. result.ResData.Row = cell4.Row;
  2573. result.ResData.Colomn = cell4.Col;
  2574. result.ResData.Layer = cell4.Layer;
  2575. result.ResData.Fork = 2;
  2576. _logger.LogInformation("分货位埋点8:" + result.ResData.CellNo);
  2577. return result;
  2578. }
  2579. }
  2580. }
  2581. }
  2582. if (reqEntity.Fork == 2)
  2583. {
  2584. //var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  2585. var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2586. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2587. result.ResData.CellNo = resloc.Code;
  2588. result.ResData.Row = resloc.Row;
  2589. result.ResData.Colomn = resloc.Col;
  2590. result.ResData.Layer = resloc.Layer;
  2591. _logger.LogInformation("分货位埋点9:" + result.ResData.CellNo);
  2592. return result;
  2593. }
  2594. else
  2595. {
  2596. //templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).Any()
  2597. if (templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).Any())
  2598. {
  2599. //var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  2600. var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2601. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2602. result.ResData.CellNo = resloc.Code;
  2603. result.ResData.Row = resloc.Row;
  2604. result.ResData.Colomn = resloc.Col;
  2605. result.ResData.Layer = resloc.Layer;
  2606. _logger.LogInformation("分货位埋点10:" + result.ResData.CellNo);
  2607. return result;
  2608. }
  2609. else
  2610. {
  2611. }
  2612. }
  2613. }
  2614. if (loc1ist == null || !loc1ist.Any())
  2615. {
  2616. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2617. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的一升位货位";
  2618. _logger.LogInformation("分货位埋点11:" + result.ResData.CellNo);
  2619. return result;
  2620. }
  2621. if (reqEntity.Fork == 1)
  2622. {
  2623. if (loc1ist.ToList().Where(p => p.Col < 70).Any())
  2624. {
  2625. var aa = loc1ist.ToList();
  2626. var code = aa.Where(p => p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2627. result.ResData.TunnelNum = code.Tunnel.ToString();
  2628. result.ResData.CellNo = code.Code;
  2629. result.ResData.Row = code.Row;
  2630. result.ResData.Colomn = code.Col;
  2631. result.ResData.Layer = code.Layer;
  2632. _logger.LogInformation("分货位埋点12:" + result.ResData.CellNo);
  2633. return result;
  2634. }
  2635. else
  2636. {
  2637. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2638. result.ResMsg = "一货叉没有可用库位";
  2639. _logger.LogInformation("分货位埋点13:" + result.ResData.CellNo);
  2640. return result;
  2641. }
  2642. }
  2643. var loc1ist11 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  2644. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  2645. && loc1.Tunnel == reqEntity.TunnelNum
  2646. && loc1.WarehouseId == reqEntity.WarehuoseId
  2647. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1 && loc1.Floor == reqEntity.Floor).ToList()
  2648. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  2649. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor
  2650. ).ToList()
  2651. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  2652. select loct1;
  2653. var loc = loc1ist11.ToList().OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2654. //var loc = loc1ist.First();
  2655. result.ResData.TunnelNum = loc.Tunnel.ToString();
  2656. result.ResData.CellNo = loc.Code;
  2657. result.ResData.Row = loc.Row;
  2658. result.ResData.Colomn = loc.Col;
  2659. result.ResData.Layer = loc.Layer;
  2660. _logger.LogInformation("分货位埋点14:" + result.ResData.CellNo);
  2661. return result;
  2662. }
  2663. /// <summary>
  2664. /// 完成出库任务
  2665. /// </summary>
  2666. /// <param name="reqDto"></param>
  2667. /// <returns></returns>
  2668. public SRes<int> CompleteTask(SxCompleteTaskRequest reqDto)
  2669. {
  2670. var result = new SRes<int>()
  2671. {
  2672. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2673. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  2674. };
  2675. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.AddrTo == reqDto.Equip && p.Status < TaskStatus.Finish && p.Type < TaskType.OutDepot).SplitTable(p => p.Take(2));
  2676. //if (!tasklist.Any())
  2677. //{
  2678. // result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2679. // result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2680. // return result;
  2681. //}
  2682. ////处理时效库存
  2683. //var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2684. //if (!stocklist.Any())
  2685. //{
  2686. // result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2687. // result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2688. // return result;
  2689. //}
  2690. //var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2691. //foreach (var flow in flowlist)
  2692. //{
  2693. // flow.Id = IdFactory.NewId();
  2694. // flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2695. // flow.AddTime = DateTime.Now;
  2696. // flow.EditTime = DateTime.Now;
  2697. // flow.Memo = "码垛装箱完成";
  2698. //}
  2699. //var palletizing = _palletizrepository.GetSingle(p => p.Id == tasklist.First().PalletizingId && p.PalletizState == 0 && p.Equip == reqDto.Equip);
  2700. //if (palletizing == null)
  2701. //{
  2702. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2703. // result.ResMsg = "没有找到符合条件的码垛信息";
  2704. // return result;
  2705. //}
  2706. //var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  2707. //if (!pallctdetail.Any())
  2708. //{
  2709. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2710. // result.ResMsg = "未找到码垛明细数据";
  2711. // return result;
  2712. //}
  2713. ////转向成品
  2714. //try
  2715. //{
  2716. // _db.BeginTran();
  2717. // _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  2718. // _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  2719. // _palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  2720. // {
  2721. // PalletizState = 1
  2722. // }, p => p.Equip == reqDto.Equip && p.Id == palletizing.Id);
  2723. // _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  2724. // _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2725. // p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  2726. // _billInvflow.InsertRange(flowlist);
  2727. // _db.CommitTran();
  2728. //}
  2729. //catch (Exception ex)
  2730. //{
  2731. // _db.RollbackTran();
  2732. // _logger.LogInformation(ex.ToString());
  2733. // result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2734. // result.ResMsg = "完成码垛任务异常";
  2735. //}
  2736. return result;
  2737. }
  2738. /// <summary>
  2739. /// 堆垛机放完
  2740. /// </summary>
  2741. /// <param name="reqDto"></param>
  2742. /// <returns></returns>
  2743. public SRes<int> SrmCompleted(SxCompleteTaskRequest reqDto)
  2744. {
  2745. var result = new SRes<int>()
  2746. {
  2747. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2748. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  2749. ResData = reqDto.TaskNum
  2750. };
  2751. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  2752. if (wcstask == null || wcstask.Id <= 0)
  2753. {
  2754. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2755. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2756. return result;
  2757. }
  2758. if (wcstask.Type == TaskType.EnterDepot)
  2759. {
  2760. //库存,货位
  2761. try
  2762. {
  2763. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  2764. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2765. if (stock == null)
  2766. {
  2767. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2768. if (stocks != null)
  2769. {
  2770. return result;
  2771. }
  2772. else
  2773. {
  2774. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2775. result.ResMsg = wcstask.BarCode + "没有已组盘的信息";
  2776. return result;
  2777. }
  2778. }
  2779. int row = int.Parse(wcstask.AddrTo.Split('-')[0]);
  2780. int col = int.Parse(wcstask.AddrTo.Split('-')[1]);
  2781. int layer = int.Parse(wcstask.AddrTo.Split('-')[2]);
  2782. int depth = int.Parse(wcstask.AddrTo.Split('-')[4]);
  2783. _db.BeginTran();
  2784. //更新库存
  2785. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), PutRow = row, PutCol = col, PutLayer = layer, Depth = depth, OneInTime = DateTime.Now, EditTime = DateTime.Now },
  2786. p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2787. //更新货位
  2788. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now },
  2789. p => p.Row == row && p.Col == col && p.Layer == layer);
  2790. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2791. foreach (var flow in stocklist)
  2792. {
  2793. flow.Id = IdFactory.NewId();
  2794. flow.AddTime = DateTime.Now;
  2795. flow.EditTime = DateTime.Now;
  2796. flow.Memo = "入库任务完成";
  2797. }
  2798. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(stocklist));
  2799. //单据
  2800. var list = new List<BillPushinfo>();
  2801. string pushtype = SxFackbeekType.InterfaceType_SX_CurtainStockIn.ToString();
  2802. //回调数据
  2803. foreach (var push in stocklist)
  2804. {
  2805. list.Add(new BillPushinfo
  2806. {
  2807. DocsNo = stock.ExecDocsNo,
  2808. TypeCode = pushtype,
  2809. RFIDBarCode = stock.ContGrpBarCode,
  2810. HWBarCode = stock.ContGrpBarCode,
  2811. CLBarCode = push.CLBarCode,
  2812. WarehouseId = warehouse.Id,
  2813. WarehouseCode = warehouse.Code,
  2814. WareCellId = 0,
  2815. WareCellCode = wcstask.AddrTo,
  2816. MatId = push.MatId,
  2817. MatCode = push.MatCode,
  2818. MatName = push.MatName,
  2819. TolWQty = push.TolWQty,
  2820. NetWQty = push.NetWQty,
  2821. TareWQty = push.TareWQty,
  2822. ReqNo = Guid.NewGuid().ToString()
  2823. });
  2824. }
  2825. _billPushinforepository.InsertRange(list);
  2826. _db.CommitTran();
  2827. }
  2828. catch (Exception ex)
  2829. {
  2830. _db.RollbackTran();
  2831. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2832. result.ResMsg = wcstask.Id + "完成入库任务异常";
  2833. _logger.LogInformation("完成入库任务异常" + ex.ToString());
  2834. }
  2835. }
  2836. else if (wcstask.Type == TaskType.OutDepot)
  2837. {
  2838. //库存删除
  2839. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2840. if (stocklist == null || !stocklist.Any())
  2841. {
  2842. //result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2843. //result.ResMsg = wcstask.Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2844. return result;
  2845. }
  2846. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.StateNum == LocationState.LocationState_StockOut);
  2847. if (cell == null)
  2848. {
  2849. //result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2850. //result.ResMsg = wcstask.Id + "货位清除不符合条件";
  2851. return result;
  2852. }
  2853. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2854. foreach (var flow in flowlist)
  2855. {
  2856. flow.Id = IdFactory.NewId();
  2857. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2858. flow.AddTime = DateTime.Now;
  2859. flow.EditTime = DateTime.Now;
  2860. flow.Memo = "出库任务堆垛机放货完成";
  2861. }
  2862. try
  2863. {
  2864. _db.BeginTran();
  2865. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2866. p => p.StateNum == LocationState.LocationState_StockOut && p.Code.Contains(wcstask.AddrFrom));
  2867. if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription())
  2868. {
  2869. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2870. {
  2871. PutRow = 0,
  2872. PutCol = 0,
  2873. PutLayer = 0
  2874. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2875. var purch = new BillPushinfo()
  2876. {
  2877. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2878. TypeCode = SxFackbeekType.InterfaceType_SX_CurtainStockOut.ToString(),
  2879. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2880. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2881. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2882. WarehouseId = cell.WarehouseId,
  2883. WarehouseCode = "sxhouse",
  2884. WareCellId = cell.Id,
  2885. WareCellCode = wcstask.AddrFrom,
  2886. MatId = stocklist.FirstOrDefault().MatId,
  2887. MatCode = stocklist.FirstOrDefault().MatCode,
  2888. MatName = stocklist.FirstOrDefault().MatName,
  2889. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2890. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2891. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2892. ReqNo = Guid.NewGuid().ToString()
  2893. };
  2894. _billPushinforepository.Insert(purch);
  2895. }
  2896. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription())
  2897. {
  2898. var purch = new BillPushinfo()
  2899. {
  2900. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2901. TypeCode = SxFackbeekType.InterfaceType_SX_ErrorStockOut.ToString(),
  2902. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2903. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2904. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2905. WarehouseId = cell.WarehouseId,
  2906. WarehouseCode = "sxhouse",
  2907. WareCellId = cell.Id,
  2908. WareCellCode = wcstask.AddrFrom,
  2909. MatId = stocklist.FirstOrDefault().MatId,
  2910. MatCode = stocklist.FirstOrDefault().MatCode,
  2911. MatName = stocklist.FirstOrDefault().MatName,
  2912. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2913. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2914. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2915. ReqNo = Guid.NewGuid().ToString()
  2916. };
  2917. _billPushinforepository.Insert(purch);
  2918. }
  2919. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription())
  2920. {
  2921. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2922. {
  2923. PutRow = 0,
  2924. PutCol = 0,
  2925. PutLayer = 0
  2926. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2927. }
  2928. else if (wcstask.BusType == "Test" || wcstask.BusType == "异常出库")
  2929. {
  2930. _billInvnowrepository.Delete(p => p.ContGrpBarCode == wcstask.BarCode);
  2931. _billInvflow.InsertRange(flowlist);
  2932. }
  2933. //_taskrepository.Delete(p => p.BarCode == wcstask.BarCode);
  2934. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish }).Where(p => p.Id == wcstask.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  2935. _db.CommitTran();
  2936. }
  2937. catch (Exception ex)
  2938. {
  2939. _db.RollbackTran();
  2940. _logger.LogInformation(ex.ToString());
  2941. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2942. result.ResMsg = wcstask.Id + "出库任务堆垛机放货完成异常";
  2943. }
  2944. }
  2945. else if (wcstask.Type == TaskType.TransferDepot)
  2946. {
  2947. var fromcell = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom);
  2948. if (string.IsNullOrEmpty(fromcell.ContGrpBarCode) || fromcell.ContGrpBarCode != wcstask.BarCode)
  2949. {
  2950. _logger.LogInformation(wcstask.Id + "移库任务重复完成");
  2951. return result;
  2952. }
  2953. var grcontid = fromcell.ContGrpId;
  2954. var grcontcode = fromcell.ContGrpBarCode;
  2955. var fromcellno = fromcell.Code;
  2956. var tocellno = wcstask.AddrTo;
  2957. try
  2958. {
  2959. _db.BeginTran();
  2960. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == fromcellno);
  2961. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = grcontcode, ContGrpId = grcontid, EditTime = DateTime.Now }, p => p.Code == tocellno);
  2962. int row = int.Parse(tocellno.Split('-')[0]);
  2963. int col = int.Parse(tocellno.Split('-')[1]);
  2964. int layer = int.Parse(tocellno.Split('-')[2]);
  2965. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = row, PutCol = col, PutLayer = layer }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2966. _db.CommitTran();
  2967. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2968. //流水表
  2969. var flow = _mapper.Map<BillInvflow>(stock);
  2970. flow.Id = IdFactory.NewId();
  2971. flow.AddTime = DateTime.Now;
  2972. flow.EditTime = DateTime.Now;
  2973. flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";
  2974. _billInvflow.Insert(flow);
  2975. //推送表
  2976. var purch = new BillPushinfo()
  2977. {
  2978. DocsNo = stock.InDocsNo,
  2979. TypeCode = SxFackbeekType.InterfaceType_SX_CellMove.ToString(),
  2980. RFIDBarCode = stock.ContGrpBarCode,
  2981. HWBarCode = stock.ContGrpBarCode,
  2982. CLBarCode = stock.CLBarCode,
  2983. WarehouseId = fromcell.WarehouseId,
  2984. WarehouseCode = "sxhouse",
  2985. WareCellId = 0,
  2986. WareCellCode = wcstask.AddrFrom,
  2987. RodBarCode = wcstask.AddrTo,
  2988. MatId = stock.MatId,
  2989. MatCode = stock.MatCode,
  2990. MatName = stock.MatName,
  2991. TolWQty = stock.TolWQty,
  2992. NetWQty = stock.NetWQty,
  2993. TareWQty = stock.TareWQty,
  2994. ReqNo = Guid.NewGuid().ToString()
  2995. };
  2996. _billPushinforepository.Insert(purch);
  2997. }
  2998. catch (Exception ex)
  2999. {
  3000. _db.RollbackTran();
  3001. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  3002. result.ResMsg = wcstask.Id + "完成移库任务异常";
  3003. _logger.LogInformation("完成移库任务异常" + ex.ToString());
  3004. }
  3005. }
  3006. return result;
  3007. }
  3008. /// <summary>
  3009. /// 完成码垛任务
  3010. /// </summary>
  3011. /// <param name="reqDto"></param>
  3012. /// <returns></returns>
  3013. public SRes<int> CompletePalletizingTask(SxPalletizingCompleteRequest reqDto)
  3014. {
  3015. var res = new SRes<int>()
  3016. {
  3017. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  3018. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  3019. };
  3020. var palletizing = _palletizrepository.GetFirst(p => p.PalletizState == 0 && p.Equip == reqDto.Equip);
  3021. if (palletizing == null)
  3022. {
  3023. //兼容wcs任务没有清掉的情况
  3024. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  3025. if (lefttask != null)
  3026. {
  3027. var pazid = lefttask.PalletizingId;
  3028. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  3029. {
  3030. res.Memo1 = lefttask.PalletizingId.ToString();
  3031. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  3032. return res;
  3033. }
  3034. }
  3035. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3036. res.ResMsg = reqDto.Equip + "没有找到正在码垛的信息";
  3037. return res;
  3038. }
  3039. var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.PalletizingId == palletizing.Id && p.AddrTo == reqDto.Equip && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).ToList();
  3040. if (!tasklist.Any())
  3041. {
  3042. //兼容wcs任务没有清掉的情况
  3043. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  3044. if (lefttask != null)
  3045. {
  3046. var pazid = lefttask.PalletizingId;
  3047. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  3048. {
  3049. res.Memo1 = lefttask.PalletizingId.ToString();
  3050. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  3051. return res;
  3052. }
  3053. }
  3054. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  3055. res.ResMsg = reqDto.Equip + "不存在该码垛工位的出库任务";
  3056. return res;
  3057. }
  3058. //处理时效库存
  3059. var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  3060. if (!stocklist.Any())
  3061. {
  3062. if (!_palletizrepository.IsAny(p => p.Equip == reqDto.Equip && p.PalletizState == 0))
  3063. {
  3064. return res;
  3065. }
  3066. else
  3067. {
  3068. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  3069. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  3070. return res;
  3071. }
  3072. }
  3073. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  3074. foreach (var flow in flowlist)
  3075. {
  3076. flow.Id = IdFactory.NewId();
  3077. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  3078. flow.AddTime = DateTime.Now;
  3079. flow.EditTime = DateTime.Now;
  3080. flow.Memo = "码垛装箱完成";
  3081. }
  3082. var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  3083. if (!pallctdetail.Any())
  3084. {
  3085. //兼容wcs任务没有清掉的情况
  3086. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  3087. if (lefttask != null)
  3088. {
  3089. var pazid = lefttask.PalletizingId;
  3090. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  3091. {
  3092. res.Memo1 = lefttask.PalletizingId.ToString();
  3093. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  3094. return res;
  3095. }
  3096. }
  3097. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3098. res.ResMsg = reqDto.Equip + "未找到码垛明细数据";
  3099. return res;
  3100. }
  3101. if (palletizing.Finish == 0)
  3102. {
  3103. if (palletizing.PalletMax != pallctdetail.Count)
  3104. {
  3105. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3106. res.ResMsg = reqDto.Equip + "已码数量不符最大码垛数量";
  3107. return res;
  3108. }
  3109. }
  3110. var boxcode = _boxrulerepository.GetSingle(p => p.Id == palletizing.BoxRuleId && p.ZXStateCode != 2);
  3111. if (boxcode == null)
  3112. {
  3113. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3114. res.ResMsg = reqDto.Equip + "跺型未找到关联的装箱信息";
  3115. return res;
  3116. }
  3117. var packinfo = _packInforepository.GetList(p => p.MatCode == boxcode.TrayCode).First();
  3118. var packlist = _packInforepository.GetList(p => p.PackCode == boxcode.Dryer);
  3119. decimal wqty = 0;
  3120. if (packlist.Any())
  3121. {
  3122. decimal tuopanqty = 0;
  3123. decimal packsqty = 0;
  3124. decimal dituoqty = 0;
  3125. decimal gebanqty = 0;
  3126. if (packlist.Any(p => p.MatCode == "C06-02-09-0043"))
  3127. {
  3128. var tuopan = packlist.Where(p => p.MatCode == "C06-02-09-0043").FirstOrDefault();
  3129. tuopanqty = tuopan.Count * tuopan.Weight / 1000;
  3130. }
  3131. if (packlist.Any(p => p.MatCode == "C12-01-08-0004"))
  3132. {
  3133. var packs = packlist.Where(p => p.MatCode == "C12-01-08-0004").FirstOrDefault();
  3134. packsqty = packs.Count * packs.Weight / 1000;
  3135. }
  3136. if (packlist.Any(p => p.MatCode == "C12-01-10-0003"))
  3137. {
  3138. var dituo = packlist.Where(p => p.MatCode == "C12-01-10-0003").FirstOrDefault();
  3139. dituoqty = dituo.Count * dituo.Weight / 1000;
  3140. }
  3141. if (packlist.Any(p => p.MatCode == "C12-01-09-0003"))
  3142. {
  3143. var geban = packlist.Where(p => p.MatCode == "C12-01-09-0003").FirstOrDefault();
  3144. gebanqty = 1 * geban.Weight / 1000;
  3145. }
  3146. wqty = tuopanqty + packsqty + dituoqty + gebanqty;
  3147. }
  3148. if (wqty == 0)
  3149. {
  3150. wqty = 16;
  3151. }
  3152. //判断托盘号是否一致
  3153. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == palletizing.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  3154. //if (wcstask == null)
  3155. //{
  3156. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3157. // res.ResMsg = reqDto.Equip + "码垛主表的托盘任务id不存在任务信息";
  3158. // return res;
  3159. //}
  3160. var tray = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code = " + palletizing.Equip).First();
  3161. //if (wcstask.BarCode != tray.Code)
  3162. //{
  3163. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3164. // res.ResMsg = reqDto.Equip + "托盘号不匹配";
  3165. // return res;
  3166. //}
  3167. //转向成品
  3168. var info = _mapper.Map<List<PalletinfoDetail>>(pallctdetail);
  3169. info.ForEach(p => p.HuNr = boxcode.PBoxCode);
  3170. var product = new PalletBoxCodeinfoRequest()
  3171. {
  3172. TaskNum = palletizing.TaskNum,
  3173. Equip = tray.Code,
  3174. BoxCode = boxcode.PBoxCode,
  3175. TrayCode = tray.SContent,
  3176. HwType = stocklist.First().HWTypeCode,
  3177. TrayType = packinfo.MatName,
  3178. Wqty = wqty,
  3179. PackWeight = boxcode.PackWeight,
  3180. list = info
  3181. };
  3182. try
  3183. {
  3184. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/PalletAutoInTask", JsonConvert.SerializeObject(product));
  3185. var resp = JsonConvert.DeserializeObject<SRes>(response);
  3186. if (resp.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3187. {
  3188. res.ResCode = resp.ResCode;
  3189. res.ResMsg = reqDto.Equip + resp.ResMsg;
  3190. return res;
  3191. }
  3192. _db.BeginTran();
  3193. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  3194. _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  3195. _palletlayerMathrepository.Delete(p => p.PboxruleId == boxcode.Id);
  3196. _palletizrepository.AsUpdateable()
  3197. .SetColumns(p => new Palletizing() { PalletizState = 1, EditTime = DateTime.Now })
  3198. .Where(p => p.Equip == reqDto.Equip && p.Id == palletizing.Id)
  3199. .ExecuteCommand();
  3200. _palletizrepository.AsUpdateable()
  3201. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  3202. .Where(p => p.Equip == reqDto.Equip && p.PalletizState == 2)
  3203. .ExecuteCommand();
  3204. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  3205. //{
  3206. // PalletizState = 0
  3207. //}, p => p.Equip == reqDto.Equip && p.PalletizState == 2);
  3208. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule() { ZXStateCode = 2, EditTime = DateTime.Now }).Where(p => p.Id == boxcode.Id).ExecuteCommand();
  3209. _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  3210. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  3211. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  3212. _billInvflow.InsertRange(flowlist);
  3213. //_boxrulerepository.Delete(p => p.Id == boxcode.Id);
  3214. _db.CommitTran();
  3215. }
  3216. catch (Exception ex)
  3217. {
  3218. _db.RollbackTran();
  3219. _logger.LogInformation(ex.ToString());
  3220. res.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  3221. res.ResMsg = "完成码垛任务异常" + ex.Message;
  3222. }
  3223. return res;
  3224. }
  3225. /// <summary>
  3226. /// 码垛层配装箱出库
  3227. /// </summary>
  3228. /// <param name="request"></param>
  3229. /// <returns></returns>
  3230. public SRes PalletizingLayerPackStockOut(PalletizingPackStockOutRequest request)
  3231. {
  3232. var res = new SRes();
  3233. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "层配");
  3234. if (palletlist.Any())
  3235. {
  3236. foreach (var item in palletlist)
  3237. {
  3238. var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  3239. if (tasklist.Any())
  3240. {
  3241. continue;
  3242. }
  3243. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  3244. if (equips == null)
  3245. {
  3246. continue;
  3247. }
  3248. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0 && p.PboxruleId == item.BoxRuleId).OrderBy(p => p.Layer);
  3249. if (!palletMach.Any())
  3250. {
  3251. continue;
  3252. }
  3253. //var layers = (from aa in match.GroupBy(p => p.Layer)
  3254. // select new LayerCount
  3255. // {
  3256. // Layer = aa.Key,
  3257. // Count = aa.Count()
  3258. // }).ToList();
  3259. #region 分层出库
  3260. if (palletMach.Where(p => p.Layer == 1).Any())
  3261. {
  3262. var pallectMachs = palletMach.Where(p => p.Layer == 1);
  3263. foreach (var pallets in pallectMachs)
  3264. {
  3265. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3266. if (cell == null)
  3267. {
  3268. continue;
  3269. }
  3270. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3271. if (invs == null)
  3272. {
  3273. continue;
  3274. }
  3275. var root = DetermineRoot(pallets.Palletequip);
  3276. //先判断二升位是否能出库
  3277. if (cell.Depth == 2)
  3278. {
  3279. var respon = MoveTask(cell.Code);
  3280. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3281. {
  3282. continue;
  3283. }
  3284. }
  3285. PalletizingPackTask(new PalletizingPackTaskRequest()
  3286. {
  3287. Code = pallets.ContBarCode,
  3288. CellCode = cell.Code,
  3289. Srm = cell.SCRel,
  3290. Tunnel = cell.Tunnel.ToString(),
  3291. Floor = cell.Floor,
  3292. Grade = invs.Grade,
  3293. Mater = invs.MatCode,
  3294. SkuCode = invs.SkuCode,
  3295. PalletLayer = pallets.Layer,
  3296. ProductMachCode = invs.ProductMachCode,
  3297. Equip = item.Equip,
  3298. PalletizingId = item.Id,
  3299. Robot = root,
  3300. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3301. });
  3302. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3303. {
  3304. Istask = 1
  3305. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3306. }
  3307. return res;
  3308. }
  3309. else if (palletMach.Where(p => p.Layer == 2).Any())
  3310. {
  3311. var pallectMachs = palletMach.Where(p => p.Layer == 2);
  3312. foreach (var pallets in pallectMachs)
  3313. {
  3314. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3315. if (cell == null)
  3316. {
  3317. continue;
  3318. }
  3319. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3320. if (invs == null)
  3321. {
  3322. continue;
  3323. }
  3324. var root = DetermineRoot(pallets.Palletequip);
  3325. //先判断二升位是否能出库
  3326. if (cell.Depth == 2)
  3327. {
  3328. var respon = MoveTask(cell.Code);
  3329. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3330. {
  3331. continue;
  3332. }
  3333. }
  3334. PalletizingPackTask(new PalletizingPackTaskRequest()
  3335. {
  3336. Code = pallets.ContBarCode,
  3337. CellCode = cell.Code,
  3338. Srm = cell.SCRel,
  3339. Tunnel = cell.Tunnel.ToString(),
  3340. Floor = cell.Floor,
  3341. Grade = invs.Grade,
  3342. Mater = invs.MatCode,
  3343. SkuCode = invs.SkuCode,
  3344. PalletLayer = pallets.Layer,
  3345. ProductMachCode = invs.ProductMachCode,
  3346. Equip = item.Equip,
  3347. PalletizingId = item.Id,
  3348. Robot = root,
  3349. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3350. });
  3351. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3352. {
  3353. Istask = 1
  3354. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3355. }
  3356. return res;
  3357. }
  3358. else if (palletMach.Where(p => p.Layer == 3).Any())
  3359. {
  3360. var pallectMachs = palletMach.Where(p => p.Layer == 3);
  3361. foreach (var pallets in pallectMachs)
  3362. {
  3363. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3364. if (cell == null)
  3365. {
  3366. continue;
  3367. }
  3368. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3369. if (invs == null)
  3370. {
  3371. continue;
  3372. }
  3373. var root = DetermineRoot(pallets.Palletequip);
  3374. //先判断二升位是否能出库
  3375. if (cell.Depth == 2)
  3376. {
  3377. var respon = MoveTask(cell.Code);
  3378. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3379. {
  3380. continue;
  3381. }
  3382. }
  3383. PalletizingPackTask(new PalletizingPackTaskRequest()
  3384. {
  3385. Code = pallets.ContBarCode,
  3386. CellCode = cell.Code,
  3387. Srm = cell.SCRel,
  3388. Tunnel = cell.Tunnel.ToString(),
  3389. Floor = cell.Floor,
  3390. Grade = invs.Grade,
  3391. Mater = invs.MatCode,
  3392. SkuCode = invs.SkuCode,
  3393. PalletLayer = pallets.Layer,
  3394. ProductMachCode = invs.ProductMachCode,
  3395. Equip = item.Equip,
  3396. PalletizingId = item.Id,
  3397. Robot = root,
  3398. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3399. });
  3400. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3401. {
  3402. Istask = 1
  3403. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3404. }
  3405. return res;
  3406. }
  3407. else if (palletMach.Where(p => p.Layer == 4).Any())
  3408. {
  3409. var pallectMachs = palletMach.Where(p => p.Layer == 4);
  3410. foreach (var pallets in pallectMachs)
  3411. {
  3412. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3413. if (cell == null)
  3414. {
  3415. continue;
  3416. }
  3417. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3418. if (invs == null)
  3419. {
  3420. continue;
  3421. }
  3422. var root = DetermineRoot(pallets.Palletequip);
  3423. //先判断二升位是否能出库
  3424. if (cell.Depth == 2)
  3425. {
  3426. var respon = MoveTask(cell.Code);
  3427. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3428. {
  3429. continue;
  3430. }
  3431. }
  3432. PalletizingPackTask(new PalletizingPackTaskRequest()
  3433. {
  3434. Code = pallets.ContBarCode,
  3435. CellCode = cell.Code,
  3436. Srm = cell.SCRel,
  3437. Tunnel = cell.Tunnel.ToString(),
  3438. Floor = cell.Floor,
  3439. Grade = invs.Grade,
  3440. Mater = invs.MatCode,
  3441. SkuCode = invs.SkuCode,
  3442. PalletLayer = pallets.Layer,
  3443. ProductMachCode = invs.ProductMachCode,
  3444. Equip = item.Equip,
  3445. PalletizingId = item.Id,
  3446. Robot = root,
  3447. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3448. });
  3449. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3450. {
  3451. Istask = 1
  3452. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3453. }
  3454. return res;
  3455. }
  3456. else if (palletMach.Where(p => p.Layer == 5).Any())
  3457. {
  3458. var pallectMachs = palletMach.Where(p => p.Layer == 5);
  3459. foreach (var pallets in pallectMachs)
  3460. {
  3461. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3462. if (cell == null)
  3463. {
  3464. continue;
  3465. }
  3466. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3467. if (invs == null)
  3468. {
  3469. continue;
  3470. }
  3471. var root = DetermineRoot(pallets.Palletequip);
  3472. //先判断二升位是否能出库
  3473. if (cell.Depth == 2)
  3474. {
  3475. var respon = MoveTask(cell.Code);
  3476. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3477. {
  3478. continue;
  3479. }
  3480. }
  3481. PalletizingPackTask(new PalletizingPackTaskRequest()
  3482. {
  3483. Code = pallets.ContBarCode,
  3484. CellCode = cell.Code,
  3485. Srm = cell.SCRel,
  3486. Tunnel = cell.Tunnel.ToString(),
  3487. Floor = cell.Floor,
  3488. Grade = invs.Grade,
  3489. Mater = invs.MatCode,
  3490. SkuCode = invs.SkuCode,
  3491. PalletLayer = pallets.Layer,
  3492. ProductMachCode = invs.ProductMachCode,
  3493. Equip = item.Equip,
  3494. PalletizingId = item.Id,
  3495. Robot = root,
  3496. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3497. });
  3498. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3499. {
  3500. Istask = 1
  3501. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3502. }
  3503. return res;
  3504. }
  3505. else if (palletMach.Where(p => p.Layer == 6).Any())
  3506. {
  3507. var pallectMachs = palletMach.Where(p => p.Layer == 6);
  3508. foreach (var pallets in pallectMachs)
  3509. {
  3510. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3511. if (cell == null)
  3512. {
  3513. continue;
  3514. }
  3515. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3516. if (invs == null)
  3517. {
  3518. continue;
  3519. }
  3520. var root = DetermineRoot(pallets.Palletequip);
  3521. //先判断二升位是否能出库
  3522. if (cell.Depth == 2)
  3523. {
  3524. var respon = MoveTask(cell.Code);
  3525. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3526. {
  3527. continue;
  3528. }
  3529. }
  3530. PalletizingPackTask(new PalletizingPackTaskRequest()
  3531. {
  3532. Code = pallets.ContBarCode,
  3533. CellCode = cell.Code,
  3534. Srm = cell.SCRel,
  3535. Tunnel = cell.Tunnel.ToString(),
  3536. Floor = cell.Floor,
  3537. Grade = invs.Grade,
  3538. Mater = invs.MatCode,
  3539. SkuCode = invs.SkuCode,
  3540. PalletLayer = pallets.Layer,
  3541. ProductMachCode = invs.ProductMachCode,
  3542. Equip = item.Equip,
  3543. PalletizingId = item.Id,
  3544. Robot = root,
  3545. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3546. });
  3547. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3548. {
  3549. Istask = 1
  3550. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3551. }
  3552. return res;
  3553. }
  3554. #endregion 分层出库
  3555. }
  3556. }
  3557. //取视图码垛设备号
  3558. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  3559. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  3560. {
  3561. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3562. res.ResMsg = "没有空闲的码垛工位";
  3563. return res;
  3564. }
  3565. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  3566. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  3567. if (!devices.Where(p => p.pH_STATUS == true).Any())
  3568. {
  3569. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3570. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  3571. return res;
  3572. }
  3573. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  3574. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  3575. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsTorsChk == true && p.TorsChkQty > 0 && string.IsNullOrEmpty(p.PreStock)
  3576. && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.TorsChkValueIsGood == "OK" && p.ContUsageQty <= 0)
  3577. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  3578. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "层配")
  3579. on stock.InDocsNo equals rule1.DocsNo
  3580. select new
  3581. {
  3582. stock.MatCode,
  3583. stock.InvBarCode,
  3584. stock.Grade,
  3585. stock.InvStateCode,
  3586. stock.ProductTime,
  3587. stock.WbGroupCode,
  3588. stock.IsTorsChk,
  3589. stock.TorsChkQty,
  3590. stock.TorsChkValue,
  3591. stock.HoldTime,
  3592. stock.ProductMachCode,
  3593. stock.IsRework,
  3594. stock.IsBlack,
  3595. stock.SolderCount,
  3596. stock.HWTypeCode,
  3597. stock.TorsChkChord,
  3598. stock.TorsChkFlatness,
  3599. loc.Col,
  3600. loc.Layer,
  3601. loc.Shelf,
  3602. loc.Depth,
  3603. loc.Code,
  3604. loc.Tunnel,
  3605. loc.SCRel,
  3606. loc.Floor,
  3607. loc.WarehouseCode,
  3608. loc.ContGrpBarCode,
  3609. loc.ContGrpId,
  3610. loc.Id,
  3611. loc.StateNum,
  3612. rule1.SkuCode
  3613. };
  3614. if (!invlist.Any())
  3615. {
  3616. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3617. res.ResMsg = "库存不足";
  3618. return res;
  3619. }
  3620. invlist = invlist.Distinct();
  3621. var invlist2 = invlist;
  3622. var sku = invlist.GroupBy(p => p.SkuCode).ToList();
  3623. if (!sku.Any())
  3624. {
  3625. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3626. res.ResMsg = "库中没有SKU或SKU不能为空";
  3627. return res;
  3628. }
  3629. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "层配");
  3630. if (!rulelist.Any())
  3631. {
  3632. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  3633. res.ResMsg = "层配装箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  3634. return res;
  3635. }
  3636. foreach (var item in sku)
  3637. {
  3638. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.ZXStateCode == 0 && p.PackRule == "层配").OrderBy(p => p.AddTime);
  3639. if (!rules.Any())
  3640. {
  3641. continue;
  3642. }
  3643. foreach (var rule in rules)
  3644. {
  3645. var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  3646. if (!syslist.Any())
  3647. {
  3648. //_logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  3649. continue;
  3650. }
  3651. var dev = devices.Where(p => syslist.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  3652. if (!dev.Any())
  3653. {
  3654. //_logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  3655. continue;
  3656. }
  3657. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).GroupBy(p => p.WbGroupCode);
  3658. if (!wbgrouplist.Any())
  3659. {
  3660. continue;
  3661. }
  3662. foreach (var wbgroup in wbgrouplist)
  3663. {
  3664. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType);
  3665. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  3666. {
  3667. break;
  3668. }
  3669. }
  3670. //焊点、返工盘、黑盘一些基本属性筛选
  3671. if (!string.IsNullOrEmpty(rule.SpoolType))
  3672. {
  3673. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  3674. }
  3675. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  3676. {
  3677. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  3678. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  3679. }
  3680. else
  3681. {
  3682. //不允许焊点盘
  3683. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  3684. }
  3685. if (rule.ReturnCount > 0)
  3686. {
  3687. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  3688. invlist2 = tt.Union(invlist2);
  3689. }
  3690. else
  3691. {
  3692. invlist2 = invlist2.Where(p => p.IsRework == false);
  3693. }
  3694. //黑盘
  3695. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  3696. {
  3697. rule.BlackCount = 3;
  3698. }
  3699. else
  3700. {
  3701. rule.BlackCount = 1;
  3702. }
  3703. if (rule.BlackCount > 0)
  3704. {
  3705. var tt = invlist2.Where(p => p.IsBlack == true).Take(rule.BlackCount);
  3706. invlist2 = tt.Union(invlist2);
  3707. }
  3708. else
  3709. {
  3710. invlist2 = invlist2.Where(p => p.IsBlack == false);
  3711. }
  3712. if (!invlist2.Any())
  3713. {
  3714. continue;
  3715. }
  3716. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1)).OrderBy(p => p.EditTime).First();
  3717. //码垛信息校验
  3718. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  3719. {
  3720. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3721. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  3722. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  3723. return res;
  3724. }
  3725. //if (invlist2.Count() < rule.FullCountQty)
  3726. //{
  3727. // continue;
  3728. //}
  3729. if (invlist2.Where(p => p.HoldTime == rule.HoldTime).Count() >= rule.FullCountQty)
  3730. {
  3731. int layer = rule.FullCountQty / 12;
  3732. int num = 12;
  3733. #region 计算扭转层工字轮
  3734. for (int i = 0; i < layer; i++)
  3735. {
  3736. #region 计算扭转
  3737. if (rule.HoldTime == 24)
  3738. {
  3739. var torslist = invlist2.OrderBy(p => p.ProductTime).ToList().GetRange(0, num);
  3740. if (Math.Abs((decimal)(rule.Torsion24Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3741. {
  3742. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3743. #region 记录码垛的每层工字轮明细
  3744. foreach (var palletla in torslist)
  3745. {
  3746. var palletlayer = new PalletLayerMath()
  3747. {
  3748. ContGrpId = (long)palletla.ContGrpId,
  3749. ContBarCode = palletla.ContGrpBarCode,
  3750. Layer = i + 1,
  3751. SkuCode = palletla.SkuCode,
  3752. Finish = 0,
  3753. PboxruleId = rule.Id,
  3754. Istask = 0,
  3755. Palletequip = palletequip.Code
  3756. };
  3757. _palletlayerMathrepository.Insert(palletlayer);
  3758. }
  3759. #endregion 记录码垛的每层工字轮明细
  3760. invlist2 = invlist2.Except(torslist);
  3761. }
  3762. else
  3763. {
  3764. //记下头尾元素
  3765. var start = torslist.First();
  3766. var end = torslist.Last();
  3767. List<string> code = new List<string>() { start.ContGrpBarCode, end.ContGrpBarCode };
  3768. //去掉头尾
  3769. torslist = torslist.Skip(1).Take(torslist.Count - 2).ToList();
  3770. //追加两个筹齐12个重新计算
  3771. torslist.AddRange(invlist2.Where(p => !code.Contains(p.ContGrpBarCode)).OrderBy(p => p.ProductTime).Take(2));
  3772. if (Math.Abs((decimal)(rule.Torsion24Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3773. {
  3774. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3775. #region 记录码垛的每层工字轮明细
  3776. foreach (var palletla in torslist)
  3777. {
  3778. var palletlayer = new PalletLayerMath()
  3779. {
  3780. ContGrpId = (long)palletla.ContGrpId,
  3781. ContBarCode = palletla.ContGrpBarCode,
  3782. Layer = i + 1,
  3783. SkuCode = palletla.SkuCode,
  3784. Finish = 0,
  3785. PboxruleId = rule.Id,
  3786. Istask = 0,
  3787. Palletequip = palletequip.Code
  3788. };
  3789. _palletlayerMathrepository.Insert(palletlayer);
  3790. }
  3791. #endregion 记录码垛的每层工字轮明细
  3792. invlist2 = invlist2.Except(torslist);
  3793. }
  3794. }
  3795. }
  3796. else if (rule.HoldTime == 48)
  3797. {
  3798. var torslist = invlist2.OrderBy(p => p.ProductTime).ToList().GetRange(0, num);
  3799. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3800. {
  3801. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3802. #region 记录码垛的每层工字轮明细
  3803. foreach (var palletla in torslist)
  3804. {
  3805. var palletlayer = new PalletLayerMath()
  3806. {
  3807. ContGrpId = (long)palletla.ContGrpId,
  3808. ContBarCode = palletla.ContGrpBarCode,
  3809. Layer = i + 1,
  3810. SkuCode = palletla.SkuCode,
  3811. Finish = 0,
  3812. PboxruleId = rule.Id,
  3813. Istask = 0,
  3814. Palletequip = palletequip.Code
  3815. };
  3816. _palletlayerMathrepository.Insert(palletlayer);
  3817. }
  3818. #endregion 记录码垛的每层工字轮明细
  3819. invlist2 = invlist2.Except(torslist);
  3820. }
  3821. else
  3822. {
  3823. //记下头尾元素
  3824. var start = torslist.First();
  3825. var end = torslist.Last();
  3826. List<string> code = new List<string>() { start.ContGrpBarCode, end.ContGrpBarCode };
  3827. //去掉头尾
  3828. torslist = torslist.Skip(1).Take(torslist.Count - 2).ToList();
  3829. //追加两个筹齐12个重新计算
  3830. torslist.AddRange(invlist2.Where(p => !code.Contains(p.ContGrpBarCode)).OrderBy(p => p.ProductTime).Take(2));
  3831. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3832. {
  3833. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3834. #region 记录码垛的每层工字轮明细
  3835. foreach (var palletla in torslist)
  3836. {
  3837. var palletlayer = new PalletLayerMath()
  3838. {
  3839. ContGrpId = (long)palletla.ContGrpId,
  3840. ContBarCode = palletla.ContGrpBarCode,
  3841. Layer = i + 1,
  3842. SkuCode = palletla.SkuCode,
  3843. Finish = 0,
  3844. PboxruleId = rule.Id,
  3845. Istask = 0,
  3846. Palletequip = palletequip.Code
  3847. };
  3848. _palletlayerMathrepository.Insert(palletlayer);
  3849. }
  3850. #endregion 记录码垛的每层工字轮明细
  3851. invlist2 = invlist2.Except(torslist);
  3852. }
  3853. }
  3854. }
  3855. else if (rule.HoldTime == 72)
  3856. {
  3857. }
  3858. #endregion 计算扭转
  3859. }
  3860. #endregion 计算扭转层工字轮
  3861. var palletCodelist = _palletlayerMathrepository.GetList(p => p.PboxruleId == rule.Id);
  3862. if (!palletCodelist.Any())
  3863. {
  3864. continue;
  3865. }
  3866. if (palletCodelist.Count != rule.FullCountQty)
  3867. {
  3868. _palletlayerMathrepository.Delete(p => p.PboxruleId == rule.Id);
  3869. continue;
  3870. }
  3871. var palletCode = palletCodelist.OrderBy(p => p.Layer).Take(12);
  3872. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  3873. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  3874. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  3875. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3876. {
  3877. res.ResCode = trayres.ResCode;
  3878. res.ResMsg = trayres.ResMsg;
  3879. return res;
  3880. }
  3881. var pallet = new Palletizing()
  3882. {
  3883. PalletMax = rule.FullCountQty,
  3884. PalletizState = 0,
  3885. Equip = palletequip.Code,
  3886. Finish = 0,
  3887. AddWho = "",
  3888. EditWho = "",
  3889. BoxRule = rule.PackRule,
  3890. BoxRuleId = rule.Id,
  3891. IsControlpanel = true,
  3892. TaskNum = int.Parse(trayres.Memo1),
  3893. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3894. };
  3895. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  3896. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  3897. {
  3898. ZXStateCode = 1
  3899. }, p => p.Id == rule.Id);
  3900. foreach (var code in palletCode)
  3901. {
  3902. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  3903. if (cell == null)
  3904. {
  3905. continue;
  3906. }
  3907. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3908. if (invs == null)
  3909. {
  3910. continue;
  3911. }
  3912. var inv = invlist2.Where(p => p.ContGrpBarCode == code.ContBarCode && p.ContGrpId == code.ContGrpId).First();
  3913. var root = DetermineRoot(palletequip.Code);
  3914. //先判断二升位是否能出库
  3915. if (cell.Depth == 2)
  3916. {
  3917. var respon = MoveTask(cell.Code);
  3918. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3919. {
  3920. continue;
  3921. }
  3922. }
  3923. PalletizingPackTask(new PalletizingPackTaskRequest()
  3924. {
  3925. Code = code.ContBarCode,
  3926. Equip = pallects.Equip,
  3927. Mater = inv.MatCode,
  3928. Srm = inv.SCRel,
  3929. PalletLayer = code.Layer,
  3930. Grade = inv.Grade,
  3931. Tunnel = inv.Tunnel.ToString(),
  3932. CellCode = inv.Code,
  3933. SkuCode = rule.SkuCode,
  3934. ProductMachCode = inv.ProductMachCode,
  3935. Floor = inv.Floor,
  3936. PalletizingId = pallects.Id,
  3937. Robot = root,
  3938. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3939. });
  3940. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3941. {
  3942. Istask = 1
  3943. }, p => p.ContBarCode == code.ContBarCode);
  3944. }
  3945. return res;
  3946. }
  3947. }
  3948. }
  3949. return res;
  3950. }
  3951. /// <summary>
  3952. /// 码垛SPC非控制装箱(缓存托盘)
  3953. /// </summary>
  3954. /// <param name="request"></param>
  3955. /// <returns></returns>
  3956. public SRes PalletizingSpcNotPackStockOut2(PalletizingPackStockOutRequest request)
  3957. {
  3958. var res = new SRes();
  3959. var timesign = IdFactory.NewId();
  3960. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  3961. if (palletlist.Any())
  3962. {
  3963. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  3964. if (maxtaskStemp.Any())
  3965. {
  3966. var maxtaskcount = (from tas in maxtaskStemp
  3967. select new TunnelCountTemp()
  3968. {
  3969. Tunnel = tas.Key,
  3970. Count = tas.Count()
  3971. }).ToList();
  3972. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  3973. }
  3974. //箱之间状态卡控限制标识
  3975. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  3976. //某个机械手最大下发的限制状态任务数量
  3977. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  3978. foreach (var item in palletlist)
  3979. {
  3980. //判断任务数量
  3981. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  3982. {
  3983. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  3984. continue;
  3985. }
  3986. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  3987. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  3988. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  3989. {
  3990. //判断是不是第3箱
  3991. //判断是否是第三箱
  3992. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  3993. {
  3994. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  3995. if (item.Id == thirdbox)//第3箱子
  3996. {
  3997. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  3998. {
  3999. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4000. continue;
  4001. }
  4002. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  4003. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  4004. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  4005. {
  4006. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  4007. continue;
  4008. }
  4009. }
  4010. else if (item.Id > thirdbox)
  4011. {
  4012. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  4013. continue;
  4014. }
  4015. }
  4016. //if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  4017. //{
  4018. // _logger.LogInformation("同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4019. // continue;
  4020. //}
  4021. }
  4022. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  4023. if (equips == null)
  4024. {
  4025. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  4026. continue;
  4027. }
  4028. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  4029. if (!palletMach.Any())
  4030. {
  4031. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  4032. continue;
  4033. }
  4034. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  4035. var curdocid = maxdocid + 1;
  4036. if (palletMach.Any())
  4037. {
  4038. var pid = palletMach.First().PalletizingId;
  4039. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  4040. {
  4041. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  4042. }
  4043. }
  4044. foreach (var pallets in palletMach)
  4045. {
  4046. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4047. if (cell == null)
  4048. {
  4049. continue;
  4050. }
  4051. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4052. if (invs == null)
  4053. {
  4054. continue;
  4055. }
  4056. var root = DetermineRoot(pallets.Palletequip);
  4057. //先判断二升位是否能出库
  4058. if (cell.Depth == 2)
  4059. {
  4060. var respon = MoveTask(cell.Code);
  4061. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4062. {
  4063. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4064. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4065. continue;
  4066. }
  4067. }
  4068. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4069. {
  4070. Code = pallets.ContBarCode,
  4071. CellCode = cell.Code,
  4072. Srm = cell.SCRel,
  4073. Tunnel = cell.Tunnel.ToString(),
  4074. Floor = cell.Floor,
  4075. Grade = invs.Grade,
  4076. Mater = invs.MatCode,
  4077. SkuCode = pallets.SkuCode,
  4078. PalletLayer = 0,
  4079. ProductMachCode = invs.ProductMachCode,
  4080. Equip = item.Equip,
  4081. PalletizingId = item.Id,
  4082. Robot = root,
  4083. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4084. DocId = curdocid
  4085. });
  4086. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4087. {
  4088. continue;
  4089. }
  4090. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4091. {
  4092. Istask = 1,
  4093. Layer = 0
  4094. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4095. }
  4096. //下完任务后将标识值加1
  4097. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  4098. taskflag = taskflag + 1;
  4099. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4100. #region 分层下任务暂时不用
  4101. //var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  4102. //var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  4103. //if (tasklayer != 12 && tasklayer < 12)
  4104. //{
  4105. // palletMach = palletMach.Take(12 - tasklayer);
  4106. // foreach (var pallets in palletMach)
  4107. // {
  4108. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4109. // if (cell == null)
  4110. // {
  4111. // continue;
  4112. // }
  4113. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4114. // if (invs == null)
  4115. // {
  4116. // continue;
  4117. // }
  4118. // var root = "";
  4119. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4120. // {
  4121. // root = "Robot1";
  4122. // }
  4123. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4124. // {
  4125. // root = "Robot2";
  4126. // }
  4127. // //先判断二升位是否能出库
  4128. // if (cell.Depth == 2)
  4129. // {
  4130. // var respon = MoveTask(cell.Code);
  4131. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4132. // {
  4133. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4134. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4135. // continue;
  4136. // }
  4137. // }
  4138. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4139. // {
  4140. // Code = pallets.ContBarCode,
  4141. // CellCode = cell.Code,
  4142. // Srm = cell.SCRel,
  4143. // Tunnel = cell.Tunnel.ToString(),
  4144. // Floor = cell.Floor,
  4145. // Grade = invs.Grade,
  4146. // Mater = invs.MatCode,
  4147. // SkuCode = pallets.SkuCode,
  4148. // PalletLayer = curlayer,
  4149. // ProductMachCode = invs.ProductMachCode,
  4150. // Equip = item.Equip,
  4151. // PalletizingId = item.Id,
  4152. // Robot = root,
  4153. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  4154. // });
  4155. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4156. // {
  4157. // continue;
  4158. // }
  4159. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4160. // {
  4161. // Istask = 1,
  4162. // Layer = curlayer
  4163. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  4164. // }
  4165. // //return res;
  4166. //}
  4167. //else
  4168. //{
  4169. // foreach (var pallets in palletMach)
  4170. // {
  4171. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4172. // if (cell == null)
  4173. // {
  4174. // continue;
  4175. // }
  4176. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4177. // if (invs == null)
  4178. // {
  4179. // continue;
  4180. // }
  4181. // var root = "";
  4182. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4183. // {
  4184. // root = "Robot1";
  4185. // }
  4186. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4187. // {
  4188. // root = "Robot2";
  4189. // }
  4190. // //先判断二升位是否能出库
  4191. // if (cell.Depth == 2)
  4192. // {
  4193. // var respon = MoveTask(cell.Code);
  4194. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4195. // {
  4196. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4197. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4198. // continue;
  4199. // }
  4200. // }
  4201. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4202. // {
  4203. // Code = pallets.ContBarCode,
  4204. // CellCode = cell.Code,
  4205. // Srm = cell.SCRel,
  4206. // Tunnel = cell.Tunnel.ToString(),
  4207. // Floor = cell.Floor,
  4208. // Grade = invs.Grade,
  4209. // Mater = invs.MatCode,
  4210. // SkuCode = pallets.SkuCode,
  4211. // PalletLayer = curlayer + 1,
  4212. // ProductMachCode = invs.ProductMachCode,
  4213. // Equip = item.Equip,
  4214. // PalletizingId = item.Id,
  4215. // Robot = root,
  4216. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  4217. // });
  4218. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4219. // {
  4220. // continue;
  4221. // }
  4222. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4223. // {
  4224. // Istask = 1,
  4225. // Layer = curlayer + 1
  4226. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  4227. // }
  4228. // //return res;
  4229. //}
  4230. #endregion 分层下任务暂时不用
  4231. }
  4232. }
  4233. //待码垛箱任务下发
  4234. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  4235. if (palletlisttobe.Any())
  4236. {
  4237. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  4238. {
  4239. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  4240. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  4241. {
  4242. _palletizrepository.AsUpdateable()
  4243. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4244. .Where(p => p.Id == item.Id)
  4245. .ExecuteCommand();
  4246. }
  4247. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  4248. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  4249. {
  4250. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  4251. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  4252. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  4253. {
  4254. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  4255. continue;
  4256. }
  4257. //箱之间状态卡控限制标识
  4258. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  4259. //判断任务数量
  4260. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  4261. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  4262. {
  4263. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  4264. continue;
  4265. }
  4266. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  4267. if (!_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())// && !_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => mdtempequiplist.Contains(p.PalletizingId) && p.Status < taskstatus).Any()
  4268. {
  4269. //判断是否是第三箱
  4270. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  4271. {
  4272. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  4273. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  4274. if (item.Id == thirdbox)//第3箱子
  4275. {
  4276. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  4277. {
  4278. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4279. continue;
  4280. }
  4281. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  4282. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  4283. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  4284. {
  4285. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  4286. continue;
  4287. }
  4288. }
  4289. else if (item.Id > thirdbox)
  4290. {
  4291. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  4292. continue;
  4293. }
  4294. }
  4295. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  4296. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  4297. {
  4298. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  4299. if (!palletMach.Any())
  4300. {
  4301. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  4302. continue;
  4303. }
  4304. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  4305. var curdocid = maxdocid + 1;
  4306. if (palletMach.Any())
  4307. {
  4308. var pid = palletMach.First().PalletizingId;
  4309. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  4310. {
  4311. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  4312. }
  4313. }
  4314. foreach (var pallets in palletMach)
  4315. {
  4316. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4317. if (cell == null)
  4318. {
  4319. continue;
  4320. }
  4321. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4322. if (invs == null)
  4323. {
  4324. continue;
  4325. }
  4326. var root = DetermineRoot(pallets.Palletequip);
  4327. //先判断二升位是否能出库
  4328. if (cell.Depth == 2)
  4329. {
  4330. var respon = MoveTask(cell.Code);
  4331. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4332. {
  4333. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4334. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4335. continue;
  4336. }
  4337. }
  4338. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4339. {
  4340. Code = pallets.ContBarCode,
  4341. CellCode = cell.Code,
  4342. Srm = cell.SCRel,
  4343. Tunnel = cell.Tunnel.ToString(),
  4344. Floor = cell.Floor,
  4345. Grade = invs.Grade,
  4346. Mater = invs.MatCode,
  4347. SkuCode = pallets.SkuCode,
  4348. PalletLayer = 0,
  4349. ProductMachCode = invs.ProductMachCode,
  4350. Equip = item.Equip,
  4351. PalletizingId = item.Id,
  4352. Robot = root,
  4353. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4354. DocId = curdocid
  4355. });
  4356. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4357. {
  4358. continue;
  4359. }
  4360. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4361. {
  4362. Istask = 1,
  4363. Layer = 0
  4364. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4365. }
  4366. //下完任务后将标识值加1
  4367. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  4368. taskflag = taskflag + 1;
  4369. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4370. }
  4371. }
  4372. }
  4373. else
  4374. {
  4375. _palletizrepository.AsUpdateable()
  4376. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4377. .Where(p => p.Id == item.Id)
  4378. .ExecuteCommand();
  4379. }
  4380. }
  4381. }
  4382. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  4383. var iscontinue = false;
  4384. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  4385. {
  4386. if (string.IsNullOrEmpty(palletequip.Default1))
  4387. {
  4388. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  4389. {
  4390. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4391. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4392. if (preinvlist.Any())
  4393. {
  4394. //机械手交叉下任务需求
  4395. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  4396. //{
  4397. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  4398. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4399. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4400. // {
  4401. // }
  4402. // else
  4403. // {
  4404. // iscontinue = false;
  4405. // continue;
  4406. // }
  4407. //}
  4408. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4409. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  4410. {
  4411. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4412. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  4413. if (minequ != null)
  4414. {
  4415. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4416. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4417. {
  4418. }
  4419. else
  4420. {
  4421. iscontinue = false;
  4422. continue;
  4423. }
  4424. }
  4425. }
  4426. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4427. {
  4428. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4429. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4430. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4431. return res;
  4432. }
  4433. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4434. //码垛信息校验
  4435. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  4436. {
  4437. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4438. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  4439. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  4440. return res;
  4441. }
  4442. var root = DetermineRoot(palletequip.Code);
  4443. var pallet = new Palletizing()
  4444. {
  4445. PalletMax = rule.FullCountQty,
  4446. PalletizState = 0,
  4447. Equip = palletequip.Code,
  4448. Finish = 0,
  4449. AddWho = "",
  4450. EditWho = "",
  4451. BoxRule = rule.PackRule,
  4452. BoxRuleId = rule.Id,
  4453. IsControlpanel = false,
  4454. TaskNum = int.Parse(palletequip.Default3),
  4455. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4456. Robot = root
  4457. };
  4458. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4459. if (pallects.Id == 0)
  4460. {
  4461. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4462. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4463. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4464. return res;
  4465. }
  4466. var palletizId = pallects.Id;
  4467. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4468. {
  4469. ZXStateCode = 1
  4470. }, p => p.Id == rule.Id);
  4471. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4472. foreach (var invs in preinvlist)
  4473. {
  4474. var palletlayer = new PalletLayerMath()
  4475. {
  4476. PalletizingId = palletizId,
  4477. ContGrpId = (long)invs.ContGrpId,
  4478. ContBarCode = invs.ContGrpBarCode,
  4479. Layer = 0,
  4480. SkuCode = rule.SkuCode,
  4481. Finish = 0,
  4482. PboxruleId = rule.Id,
  4483. Istask = 0,
  4484. Palletequip = palletequip.Code,
  4485. Depth = invs.Depth,
  4486. IsBlack = invs.IsBlack,
  4487. SolderCount = invs.SolderCount,
  4488. BoxCode = rule.PBoxCode,
  4489. Wbgroup = invs.WbGroupCode,
  4490. StockDonse = invs.InDocsNo,
  4491. BoxDonse = rule.DocsNo
  4492. };
  4493. math.Add(palletlayer);
  4494. }
  4495. _palletlayerMathrepository.InsertRange(math);
  4496. //把库存预锁标志更新掉
  4497. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4498. {
  4499. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4500. BomMatCode = "",
  4501. PreStock = "1"
  4502. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4503. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4504. res.ResMsg = "非控制捞取预锁库存处理成功";
  4505. return res;
  4506. }
  4507. else
  4508. {
  4509. iscontinue = false;
  4510. continue;
  4511. }
  4512. }
  4513. if (string.IsNullOrEmpty(palletequip.Cache1State))
  4514. {
  4515. iscontinue = true;
  4516. break;
  4517. }
  4518. else
  4519. {
  4520. iscontinue = false;
  4521. continue;
  4522. }
  4523. }
  4524. else
  4525. {
  4526. if (!string.IsNullOrEmpty(palletequip.Default3))
  4527. {
  4528. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4529. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4530. if (preinvlist.Any())
  4531. {
  4532. //机械手交叉下任务需求
  4533. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  4534. //{
  4535. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  4536. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4537. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4538. // {
  4539. // }
  4540. // else
  4541. // {
  4542. // iscontinue = false;
  4543. // continue;
  4544. // }
  4545. //}
  4546. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4547. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  4548. {
  4549. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4550. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  4551. if (minequ != null)
  4552. {
  4553. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4554. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4555. {
  4556. }
  4557. else
  4558. {
  4559. iscontinue = false;
  4560. continue;
  4561. }
  4562. }
  4563. }
  4564. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4565. {
  4566. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4567. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4568. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4569. return res;
  4570. }
  4571. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4572. //码垛信息校验
  4573. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  4574. {
  4575. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4576. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  4577. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  4578. return res;
  4579. }
  4580. var root = DetermineRoot(palletequip.Code);
  4581. var pallet = new Palletizing()
  4582. {
  4583. PalletMax = rule.FullCountQty,
  4584. PalletizState = 2,
  4585. Equip = palletequip.Code,
  4586. Finish = 0,
  4587. AddWho = "",
  4588. EditWho = "",
  4589. BoxRule = rule.PackRule,
  4590. BoxRuleId = rule.Id,
  4591. IsControlpanel = false,
  4592. TaskNum = int.Parse(palletequip.Default3),
  4593. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4594. Robot = root
  4595. };
  4596. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4597. if (pallects.Id == 0)
  4598. {
  4599. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4600. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4601. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4602. return res;
  4603. }
  4604. var palletizId = pallects.Id;
  4605. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4606. {
  4607. ZXStateCode = 1
  4608. }, p => p.Id == rule.Id);
  4609. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4610. foreach (var invs in preinvlist)
  4611. {
  4612. var palletlayer = new PalletLayerMath()
  4613. {
  4614. PalletizingId = palletizId,
  4615. ContGrpId = (long)invs.ContGrpId,
  4616. ContBarCode = invs.ContGrpBarCode,
  4617. Layer = 0,
  4618. SkuCode = rule.SkuCode,
  4619. Finish = 0,
  4620. PboxruleId = rule.Id,
  4621. Istask = 0,
  4622. Palletequip = palletequip.Code,
  4623. Depth = invs.Depth,
  4624. IsBlack = invs.IsBlack,
  4625. SolderCount = invs.SolderCount,
  4626. BoxCode = rule.PBoxCode,
  4627. Wbgroup = invs.WbGroupCode,
  4628. StockDonse = invs.InDocsNo,
  4629. BoxDonse = rule.DocsNo
  4630. };
  4631. math.Add(palletlayer);
  4632. }
  4633. _palletlayerMathrepository.InsertRange(math);
  4634. //把库存预锁标志更新掉
  4635. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4636. {
  4637. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4638. BomMatCode = "",
  4639. PreStock = "1"
  4640. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4641. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4642. res.ResMsg = "非控制捞取预锁库存处理成功";
  4643. return res;
  4644. }
  4645. else
  4646. {
  4647. iscontinue = false;
  4648. continue;
  4649. }
  4650. }
  4651. else
  4652. {
  4653. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  4654. {
  4655. iscontinue = true;
  4656. break;
  4657. }
  4658. else
  4659. {
  4660. iscontinue = false;
  4661. continue;
  4662. }
  4663. }
  4664. }
  4665. }
  4666. if (!iscontinue)
  4667. {
  4668. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  4669. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  4670. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  4671. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  4672. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  4673. {
  4674. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4675. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4676. res.ResMsg = "没有空闲的码垛工位";
  4677. return res;
  4678. }
  4679. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  4680. {
  4681. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4682. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4683. res.ResMsg = "没有空闲的码垛工位";
  4684. return res;
  4685. }
  4686. }
  4687. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  4688. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  4689. if (!devices.Where(p => p.pH_STATUS == true).Any())
  4690. {
  4691. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  4692. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4693. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  4694. return res;
  4695. }
  4696. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  4697. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  4698. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  4699. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && (p.IsControlpanel == false && p.IsTorsChk == false) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  4700. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  4701. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  4702. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  4703. on stock.InDocsNo equals rule1.DocsNo
  4704. select new StockTemp
  4705. {
  4706. MatCode = stock.MatCode,
  4707. InvBarCode = stock.InvBarCode,
  4708. Grade = stock.Grade,
  4709. InvStateCode = stock.InvStateCode,
  4710. ProductTime = stock.ProductTime,
  4711. WbGroupCode = stock.WbGroupCode,
  4712. IsTorsChk = stock.IsTorsChk,
  4713. TorsChkQty = stock.TorsChkQty,
  4714. TorsChkValue = stock.TorsChkValue,
  4715. HoldTime = stock.HoldTime,
  4716. ProductMachCode = stock.ProductMachCode,
  4717. IsControlpanel = stock.IsControlpanel,
  4718. HWTypeCode = stock.HWTypeCode,
  4719. SolderCount = stock.SolderCount,
  4720. IsRework = stock.IsRework,
  4721. IsBlack = stock.IsBlack,
  4722. Col = loc.Col,
  4723. Layer = loc.Layer,
  4724. Shelf = loc.Shelf,
  4725. Depth = loc.Depth,
  4726. Code = loc.Code,
  4727. Tunnel = loc.Tunnel,
  4728. SCRel = loc.SCRel,
  4729. Floor = loc.Floor,
  4730. WarehouseCode = loc.WarehouseCode,
  4731. ContGrpBarCode = loc.ContGrpBarCode,
  4732. ContGrpId = loc.ContGrpId,
  4733. Id = loc.Id,
  4734. StateNum = loc.StateNum,
  4735. SkuCode = rule1.SkuCode,
  4736. Wind = stock.Wind,
  4737. InDocsNo = stock.InDocsNo
  4738. };
  4739. if (!invlist.Any())
  4740. {
  4741. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  4742. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4743. res.ResMsg = "库存不足";
  4744. return res;
  4745. }
  4746. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  4747. invlist = invlist.Distinct(new CompareStock());
  4748. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  4749. if (tunlist.Any())
  4750. {
  4751. if (tunlist.Where(p => p.Default2 == "1").Any())
  4752. {
  4753. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4754. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4755. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  4756. }
  4757. if (tunlist.Where(p => p.Default2 == "2").Any())
  4758. {
  4759. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4760. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4761. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  4762. }
  4763. if (tunlist.Where(p => p.Default2 == "3").Any())
  4764. {
  4765. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4766. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4767. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  4768. }
  4769. }
  4770. if (!invlist.Any())
  4771. {
  4772. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  4773. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4774. res.ResMsg = "禁用巷道后 | 库存不足";
  4775. return res;
  4776. }
  4777. var invlist2 = invlist;
  4778. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  4779. if (!sku.Any())
  4780. {
  4781. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  4782. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4783. res.ResMsg = "库中没有SKU或SKU不能为空";
  4784. return res;
  4785. }
  4786. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && invlist.GroupBy(v => v.InDocsNo).ToList().Select(v => v.Key).Contains(p.DocsNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind));
  4787. if (!rulelist.Any())
  4788. {
  4789. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  4790. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  4791. _logger.LogInformation("非控制不满足装箱:" + msg);
  4792. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  4793. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  4794. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  4795. return res;
  4796. }
  4797. foreach (var item in sku)
  4798. {
  4799. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.PackRule == "SPC" && p.ZXStateCode == 0 && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind)).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  4800. if (!rules.Any())
  4801. {
  4802. string msg = "SKU:" + item.Key + ",没有可用箱号";
  4803. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  4804. _logger.LogInformation("非控制不满足装箱:" + msg);
  4805. res.ResMsg = msg;
  4806. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,SKU:" + item.Key + ",单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  4807. continue;
  4808. }
  4809. var rulegroup = rules.GroupBy(p => new
  4810. {
  4811. p.Wind,
  4812. p.SpoolType,
  4813. p.FullCountQty,
  4814. p.DocsNo
  4815. }).ToList();
  4816. foreach (var rulestem in rulegroup)
  4817. {
  4818. //先判断该单号下是否有黑盘,如果没有则直接跳过
  4819. if (!invlist.Where(p => p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo).Any())
  4820. {
  4821. WreTimeOutRecord(invlist.Where(p => p.IsBlack == false && p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), "该单号下没有黑盘" + rulestem.Key.DocsNo);
  4822. continue;
  4823. }
  4824. var rule = rules.Where(p => p.SpoolType == rulestem.Key.SpoolType && p.Wind == rulestem.Key.Wind && p.FullCountQty == rulestem.Key.FullCountQty && p.DocsNo == rulestem.Key.DocsNo).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode).FirstOrDefault();
  4825. //var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  4826. //if (!syslist.Any())
  4827. //{
  4828. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  4829. // _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  4830. // continue;
  4831. //}
  4832. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  4833. List<string> equips = new List<string>();
  4834. foreach (var pp in sys)
  4835. {
  4836. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  4837. {
  4838. equips.Add(pp.Code);
  4839. }
  4840. }
  4841. if (!equips.Any())
  4842. {
  4843. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  4844. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  4845. //自动更新子托盘配置
  4846. foreach (var item1 in sys)
  4847. {
  4848. if (!item1.SContent.Contains(rule.TrayCode))
  4849. {
  4850. string con = item1.SContent + "," + rule.TrayCode;
  4851. _sysconfigrepository.AsUpdateable()
  4852. .SetColumns(p => new sxSysConfig() { SContent = con })
  4853. .Where(p => p.Id == item1.Id)
  4854. .ExecuteCommand();
  4855. }
  4856. }
  4857. continue;
  4858. }
  4859. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  4860. if (!dev.Any())
  4861. {
  4862. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key, Time = DateTime.Now });
  4863. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key);
  4864. WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  4865. continue;
  4866. }
  4867. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  4868. if (!wbgrouplist.Any())
  4869. {
  4870. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  4871. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  4872. continue;
  4873. }
  4874. ; //找到重绕盘,拼接进去,重绕盘不需要扭转
  4875. var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  4876. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.InDocsNo.StartsWith("CHA") && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  4877. && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind) // && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours
  4878. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  4879. where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  4880. select new StockTemp
  4881. {
  4882. MatCode = stock.MatCode,
  4883. InvBarCode = stock.InvBarCode,
  4884. Grade = stock.Grade,
  4885. InvStateCode = stock.InvStateCode,
  4886. ProductTime = stock.ProductTime,
  4887. WbGroupCode = stock.WbGroupCode,
  4888. IsTorsChk = stock.IsTorsChk,
  4889. TorsChkQty = stock.TorsChkQty,
  4890. TorsChkValue = stock.TorsChkValue,
  4891. HoldTime = stock.HoldTime,
  4892. ProductMachCode = stock.ProductMachCode,
  4893. IsControlpanel = stock.IsControlpanel,
  4894. HWTypeCode = stock.HWTypeCode,
  4895. SolderCount = stock.SolderCount,
  4896. IsRework = stock.IsRework,
  4897. IsBlack = stock.IsBlack,
  4898. Col = loc.Col,
  4899. Layer = loc.Layer,
  4900. Shelf = loc.Shelf,
  4901. Depth = loc.Depth,
  4902. Code = loc.Code,
  4903. Tunnel = loc.Tunnel,
  4904. SCRel = loc.SCRel,
  4905. Floor = loc.Floor,
  4906. WarehouseCode = loc.WarehouseCode,
  4907. ContGrpBarCode = loc.ContGrpBarCode,
  4908. ContGrpId = loc.ContGrpId,
  4909. Id = loc.Id,
  4910. StateNum = loc.StateNum,
  4911. SkuCode = "",
  4912. Wind = stock.Wind
  4913. };
  4914. //过滤重饶盘被禁用的巷道
  4915. invlistchongrao = invlistchongrao.Distinct();
  4916. if (tunlist.Any())
  4917. {
  4918. if (tunlist.Where(p => p.Default2 == "1").Any())
  4919. {
  4920. var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4921. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4922. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  4923. }
  4924. if (tunlist.Where(p => p.Default2 == "2").Any())
  4925. {
  4926. var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4927. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4928. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  4929. }
  4930. if (tunlist.Where(p => p.Default2 == "3").Any())
  4931. {
  4932. var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4933. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4934. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  4935. }
  4936. }
  4937. var tempsign = false;
  4938. foreach (var wbgroup in wbgrouplist)
  4939. {
  4940. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  4941. invlistchongrao = invlistchongrao.OrderBy(p => p.ProductTime);
  4942. invlist2 = invlistchongrao.Union(invlist2);
  4943. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty && invlist2.Where(p => p.IsBlack == true).Any())
  4944. {
  4945. //tempsign = true;
  4946. //break;
  4947. }
  4948. else
  4949. {
  4950. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  4951. {
  4952. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有黑盘;SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  4953. }
  4954. else
  4955. {
  4956. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  4957. }
  4958. continue;
  4959. }
  4960. if (!invlist2.Any())
  4961. {
  4962. string msg = "没有对应单号的库存,单号:" + rule.DocsNo + ",SKU:" + item.Key + ",绕向:" + rule.Wind + ",机器组:" + wbgroup.Key;
  4963. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  4964. _logger.LogInformation("非控制不满足装箱:" + msg);
  4965. res.ResMsg = msg;
  4966. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count());
  4967. continue;
  4968. }
  4969. if (!string.IsNullOrEmpty(rule.SpoolType))
  4970. {
  4971. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  4972. }
  4973. if (!string.IsNullOrEmpty(rule.Wind))
  4974. {
  4975. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  4976. }
  4977. //焊点、返工盘、黑盘一些基本属性筛选
  4978. #region 判断是否为最后一箱
  4979. int pro = 0;
  4980. //if (_boxrulerepository.GetList(p => p.DocsNo == rule.DocsNo && p.ZXStateCode == 0).Count > 1)
  4981. //{
  4982. // if (rule.SpoolType == "BS60")
  4983. // {
  4984. // rule.BlackCount = 4;
  4985. // }
  4986. // else
  4987. // {
  4988. // rule.BlackCount = 2;
  4989. // }
  4990. //}
  4991. //else
  4992. //{
  4993. // if (rule.SpoolType == "BS60")
  4994. // {
  4995. // rule.BlackCount = 2;
  4996. // }
  4997. // else
  4998. // {
  4999. // rule.BlackCount = 1;
  5000. // }
  5001. // pro = 1;
  5002. //}
  5003. //不再限制最后一箱黑盘数量,保持统一,BS60两个,BS80一个,2024-5-18
  5004. pro = 0;
  5005. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  5006. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  5007. {
  5008. rule.BlackCount = int.Parse(blackcount.Default1);
  5009. }
  5010. else
  5011. {
  5012. rule.BlackCount = int.Parse(blackcount.Default2);
  5013. }
  5014. #endregion 判断是否为最后一箱
  5015. var blackinvlist = new List<StockTemp>();
  5016. if (pro == 1)
  5017. {
  5018. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime).ToList();
  5019. if (!blackinvlist.Any())
  5020. {
  5021. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + "下的黑盘数量为0";
  5022. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  5023. _logger.LogInformation("非控制不满足装箱:" + msg);
  5024. res.ResMsg = msg;
  5025. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  5026. continue;
  5027. }
  5028. blackinvlist = blackinvlist.Where(p => p.IsBlack == true).ToList();
  5029. }
  5030. else
  5031. {
  5032. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime).ToList();
  5033. if (!blackinvlist.Any())
  5034. {
  5035. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + "下的黑盘数量为0";
  5036. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  5037. _logger.LogInformation("非控制不满足装箱:" + msg);
  5038. res.ResMsg = msg;
  5039. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  5040. continue;
  5041. }
  5042. blackinvlist = blackinvlist.Take(rule.BlackCount).ToList();
  5043. }
  5044. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  5045. {
  5046. if (blackinvlist.Count <= 1)
  5047. {
  5048. string msg = "BS60工字轮黑盘数量至少2个,当前黑盘数量" + blackinvlist.Count + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向" + rule.Wind + "SKU:" + rule.SkuCode + ",单号:" + rule.DocsNo;
  5049. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut14", new RedisErrorInfo() { Equip = "NoControlOut14", Con = msg, Time = DateTime.Now });
  5050. _logger.LogInformation("非控制不满足装箱:" + msg);
  5051. res.ResMsg = msg;
  5052. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  5053. continue;
  5054. }
  5055. }
  5056. invlist2 = invlist2.Where(p => !blackinvlist.Select(q => q.ContGrpBarCode).Contains(p.ContGrpBarCode) && p.IsBlack == false).ToList();
  5057. var tempoutrecord = invlist2.ToList();
  5058. var solderinvlist = new List<StockTemp>();
  5059. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  5060. {
  5061. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  5062. var solcount = rulemaxcount - blackinvlist.Count;
  5063. if (solcount <= 0)
  5064. {
  5065. solcount = 0;
  5066. };
  5067. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  5068. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  5069. }
  5070. else
  5071. {
  5072. //不允许焊点盘
  5073. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  5074. }
  5075. var returninvlist = new List<StockTemp>();
  5076. if (rule.ReturnCount > 0)
  5077. {
  5078. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  5079. invlist2 = invlist2.Where(p => p.IsRework == false);
  5080. }
  5081. else
  5082. {
  5083. invlist2 = invlist2.Where(p => p.IsRework == false);
  5084. }
  5085. if (!invlist2.Any())
  5086. {
  5087. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  5088. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  5089. _logger.LogInformation("非控制不满足装箱:" + msg);
  5090. res.ResMsg = msg;
  5091. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  5092. continue;
  5093. }
  5094. //var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5095. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) < rule.FullCountQty)
  5096. {
  5097. //if (invlist3.Count() >= rule.FullCountQty - (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count))
  5098. //{
  5099. // invlist2 = invlist2.Union(invlist3.Take(rule.FullCountQty - (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count)));
  5100. //}
  5101. //else
  5102. //{
  5103. string msg = "sku:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + invlist2.First().HWTypeCode + ",SPC非控制箱不满足装箱数量,需要装" + rule.FullCountQty + "实际数量:" + (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) + ";普通盘" + invlist2.Count() + ",焊点盘" + solderinvlist.Count + ",返工盘" + returninvlist.Count + ",黑盘" + blackinvlist.Count;
  5104. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  5105. _logger.LogInformation("非控制不满足装箱:" + msg);
  5106. res.ResMsg = msg;
  5107. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  5108. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5109. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5110. WreTimeOutRecord(blackinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5111. continue;
  5112. //}
  5113. }
  5114. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  5115. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 12); //12小时之内的按堆垛机平均分
  5116. #region 按照堆垛机平均分配任务
  5117. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count);//符合条件的普通盘数量
  5118. var mastinvlist = solderinvlist.Union(returninvlist).Union(blackinvlist);
  5119. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  5120. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  5121. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  5122. select new SrmTaskTmep
  5123. {
  5124. Srm = x.Key,
  5125. TaskCount = x.Count(),
  5126. LocList = x.Select(q => q.Code).ToList()
  5127. };
  5128. var srmtasktobe = new List<SrmTaskTmep>();
  5129. foreach (var srmlistitem in srmlist)
  5130. {
  5131. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  5132. {
  5133. srmtasktobe.Add(new SrmTaskTmep()
  5134. {
  5135. Srm = srmlistitem,
  5136. TaskCount = 0,
  5137. LocList = new List<string>()
  5138. });
  5139. }
  5140. }
  5141. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  5142. var srmtasktobetemplocs = new List<string>();
  5143. for (int i = 0; i < tempcount; i++)
  5144. {
  5145. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  5146. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  5147. foreach (var srmtasktobeitem in srmtasktobe)
  5148. {
  5149. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  5150. {
  5151. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  5152. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  5153. srmtasktobetemplocs.Add(first.Code);
  5154. break;
  5155. }
  5156. }
  5157. }
  5158. #endregion 按照堆垛机平均分配任务
  5159. var tempbuchong = new List<StockTemp>();
  5160. if (tempcount > srmtasktobetemplocs.Count())
  5161. {
  5162. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  5163. }
  5164. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count));
  5165. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist).Union(blackinvlist);
  5166. invlist2 = invlist2.Union(tempbuchong);
  5167. var finstocks = invlist2.ToList();
  5168. //最后验证数据
  5169. #region 最后验证数据
  5170. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  5171. {
  5172. _logger.LogInformation("非控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5173. continue;
  5174. }
  5175. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  5176. {
  5177. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5178. continue;
  5179. }
  5180. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  5181. {
  5182. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5183. continue;
  5184. }
  5185. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  5186. {
  5187. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5188. continue;
  5189. }
  5190. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  5191. {
  5192. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5193. continue;
  5194. }
  5195. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  5196. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  5197. {
  5198. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5199. continue;
  5200. }
  5201. #endregion 最后验证数据
  5202. //获取下工位的最新状态
  5203. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  5204. //sxSysConfig palletequip = null;
  5205. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5206. //{
  5207. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5208. // _logger.LogInformation("非控制装箱预锁:埋点4");
  5209. //}
  5210. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5211. //{
  5212. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5213. // _logger.LogInformation("非控制装箱预锁:埋点5");
  5214. //}
  5215. //else
  5216. //{
  5217. // res.ResMsg = "没有空闲的码垛工位";
  5218. // return res;
  5219. //}
  5220. var robotlist = new List<string>() { "Robot1", "Robot2" };
  5221. sxSysConfig palletequip = null;
  5222. foreach (var robot in robotlist)
  5223. {
  5224. //获取下工位的最新状态
  5225. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot).OrderBy(p => p.TaskFlag).ToList();
  5226. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5227. //{
  5228. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5229. //}
  5230. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5231. //{
  5232. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5233. //}
  5234. //else
  5235. //{
  5236. // res.ResMsg = "没有空闲的码垛工位";
  5237. // return res;
  5238. //}
  5239. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  5240. {
  5241. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").OrderBy(p => p.TaskFlag).First();
  5242. //码垛工位
  5243. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5244. {
  5245. palletequip = palletequiptemp;
  5246. break;
  5247. }
  5248. //缓存工位1
  5249. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5250. {
  5251. palletequip = palletequiptemp;
  5252. break;
  5253. }
  5254. //缓存工位2
  5255. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  5256. {
  5257. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  5258. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  5259. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  5260. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  5261. {
  5262. palletequip = palletequiptemp;
  5263. break;
  5264. }
  5265. }
  5266. }
  5267. }
  5268. if (palletequip == null)
  5269. {
  5270. res.ResMsg = "没有空闲的码垛工位";
  5271. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5272. return res;
  5273. }
  5274. int acttype = 0;
  5275. //判断是缓存工位锁定库存还是码垛工位直接下任务
  5276. if (string.IsNullOrEmpty(palletequip.Default1))
  5277. {
  5278. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5279. {
  5280. acttype = 1;//直接执行下任务
  5281. }
  5282. else
  5283. {
  5284. //等待下一轮循环,往math表插数据放在前面
  5285. res.ResMsg = "等待下一轮循环";
  5286. return res;
  5287. }
  5288. }
  5289. else
  5290. {
  5291. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5292. {
  5293. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  5294. if (!string.IsNullOrEmpty(palletequip.Default3))
  5295. {
  5296. res.ResMsg = "等待下一轮循环";
  5297. return res;
  5298. }
  5299. else
  5300. {
  5301. acttype = 2;//预锁库存
  5302. }
  5303. }
  5304. else
  5305. {
  5306. //判断缓存工位2(缓存工位1的托盘要到位之后)
  5307. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  5308. {
  5309. //使用缓存2工位
  5310. acttype = 3;
  5311. }
  5312. else
  5313. {
  5314. res.ResMsg = "没有空闲的码垛工位";
  5315. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5316. return res;
  5317. }
  5318. }
  5319. }
  5320. #region 托盘任务验证
  5321. var TrayportageCheck = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  5322. var responseCheck = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTaskCheck", JsonConvert.SerializeObject(TrayportageCheck));
  5323. var trayresCheck = JsonConvert.DeserializeObject<SRes>(responseCheck);
  5324. if (trayresCheck.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5325. {
  5326. res.ResCode = trayresCheck.ResCode;
  5327. res.ResMsg = trayresCheck.ResMsg;
  5328. _logger.LogInformation("托盘输送任务验证报错" + trayresCheck.ResMsg);
  5329. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务验证报错:" + trayresCheck.ResMsg, Time = DateTime.Now });
  5330. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "托盘输送任务验证报错" + trayresCheck.ResMsg);
  5331. return res;
  5332. }
  5333. #endregion 托盘任务验证
  5334. #region Mes箱号校验
  5335. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  5336. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  5337. var reqids = Guid.NewGuid().ToString();
  5338. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  5339. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  5340. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  5341. if (mesresponse.success == false)
  5342. {
  5343. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5344. {
  5345. ZXStateCode = 2,
  5346. EditTime = DateTime.Now,
  5347. Memo = mesresponse.message
  5348. }, p => p.Id == rule.Id);
  5349. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  5350. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5351. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  5352. _logger.LogInformation(res.ResMsg);
  5353. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  5354. continue;
  5355. }
  5356. #endregion Mes箱号校验
  5357. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  5358. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  5359. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  5360. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5361. {
  5362. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  5363. res.ResCode = trayres.ResCode;
  5364. res.ResMsg = trayres.ResMsg;
  5365. return res;
  5366. }
  5367. if (acttype == 1)
  5368. {
  5369. //码垛信息校验
  5370. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  5371. {
  5372. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5373. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  5374. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  5375. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  5376. return res;
  5377. }
  5378. var root = DetermineRoot(palletequip.Code);
  5379. var pallet = new Palletizing()
  5380. {
  5381. PalletMax = rule.FullCountQty,
  5382. PalletizState = 0,
  5383. Equip = palletequip.Code,
  5384. Finish = 0,
  5385. AddWho = "",
  5386. EditWho = "",
  5387. BoxRule = rule.PackRule,
  5388. BoxRuleId = rule.Id,
  5389. IsControlpanel = false,
  5390. TaskNum = int.Parse(trayres.Memo1),
  5391. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  5392. Robot = root
  5393. };
  5394. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  5395. if (pallects.Id == 0)
  5396. {
  5397. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5398. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  5399. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  5400. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  5401. return res;
  5402. }
  5403. var palletizId = pallects.Id;
  5404. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5405. {
  5406. ZXStateCode = 1
  5407. }, p => p.Id == rule.Id);
  5408. List<PalletLayerMath> math = new List<PalletLayerMath>();
  5409. foreach (var invs in invlist2)
  5410. {
  5411. var palletlayer = new PalletLayerMath()
  5412. {
  5413. PalletizingId = palletizId,
  5414. ContGrpId = (long)invs.ContGrpId,
  5415. ContBarCode = invs.ContGrpBarCode,
  5416. Layer = 0,
  5417. SkuCode = rule.SkuCode,
  5418. Finish = 0,
  5419. PboxruleId = rule.Id,
  5420. Istask = 0,
  5421. Palletequip = palletequip.Code,
  5422. IsBlack = invs.IsBlack,
  5423. Depth = invs.Depth,
  5424. SolderCount = invs.SolderCount,
  5425. BoxCode = rule.PBoxCode,
  5426. StockDonse = invs.InDocsNo,
  5427. Wbgroup = invs.WbGroupCode,
  5428. BoxDonse = rule.DocsNo
  5429. };
  5430. math.Add(palletlayer);
  5431. }
  5432. _palletlayerMathrepository.InsertRange(math);
  5433. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5434. {
  5435. PreStock = "1"
  5436. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  5437. #region 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  5438. //invlist2 = invlist2.OrderBy(p => p.Depth).Take(72);
  5439. //foreach (var code in invlist2)
  5440. //{
  5441. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  5442. // if (cell == null)
  5443. // {
  5444. // continue;
  5445. // }
  5446. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5447. // if (invs == null)
  5448. // {
  5449. // continue;
  5450. // }
  5451. // //先判断二升位是否能出库
  5452. // if (code.Depth == 2)
  5453. // {
  5454. // var respon = MoveTask(code.Code);
  5455. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5456. // {
  5457. // continue;
  5458. // }
  5459. // }
  5460. // var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  5461. // {
  5462. // Code = code.ContGrpBarCode,
  5463. // Equip = pallects.Equip,
  5464. // Mater = code.MatCode,
  5465. // Srm = code.SCRel,
  5466. // PalletLayer = 1,
  5467. // Grade = code.Grade,
  5468. // Tunnel = code.Tunnel.ToString(),
  5469. // CellCode = code.Code,
  5470. // SkuCode = rule.SkuCode,
  5471. // ProductMachCode = code.ProductMachCode,
  5472. // Floor = code.Floor,
  5473. // PalletizingId = palletizId,
  5474. // Robot = root,
  5475. // GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  5476. // });
  5477. // if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5478. // {
  5479. // continue;
  5480. // }
  5481. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5482. // {
  5483. // Istask = 1,
  5484. // Layer = 1
  5485. // }, p => p.ContBarCode == code.ContGrpBarCode);
  5486. //}
  5487. ////下完任务后将标识值加1
  5488. //var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == pallects.Robot).Max(p => p.TaskFlag);
  5489. //taskflag = taskflag + 1;
  5490. //_sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + pallects.Equip + "'");
  5491. #endregion 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  5492. res.ResCode = 200;
  5493. res.ResMsg = "成功";
  5494. return res;
  5495. }
  5496. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  5497. {
  5498. var codes = new List<string>();
  5499. codes.AddRange(finstocks.Select(p => p.ContGrpBarCode));
  5500. if (codes.Any())
  5501. {
  5502. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5503. {
  5504. PreStock = "1",
  5505. BomMatCode = trayres.Memo1,//预锁托盘任务id
  5506. BomMatName = rule.PBoxCode, //预锁的箱号
  5507. BomSetId = 0 //代表非控制箱标识
  5508. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5509. //锁定缓存工位
  5510. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  5511. }
  5512. res.ResCode = 200;
  5513. res.ResMsg = "成功";
  5514. return res;
  5515. }
  5516. }
  5517. }
  5518. }
  5519. return res;
  5520. }
  5521. /// <summary>
  5522. /// 码垛SPC非控制装箱(缓存托盘)
  5523. /// </summary>
  5524. /// <param name="request"></param>
  5525. /// <returns></returns>
  5526. public SRes PalletizingSpcNotPackStockOut3(PalletizingPackStockOutRequest request)
  5527. {
  5528. var res = new SRes();
  5529. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  5530. if (palletlist.Any())
  5531. {
  5532. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  5533. if (maxtaskStemp.Any())
  5534. {
  5535. var maxtaskcount = (from tas in maxtaskStemp
  5536. select new TunnelCountTemp()
  5537. {
  5538. Tunnel = tas.Key,
  5539. Count = tas.Count()
  5540. }).ToList();
  5541. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  5542. }
  5543. //箱之间状态卡控限制标识
  5544. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  5545. //某个机械手最大下发的限制状态任务数量
  5546. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  5547. foreach (var item in palletlist)
  5548. {
  5549. //判断任务数量
  5550. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  5551. {
  5552. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  5553. continue;
  5554. }
  5555. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  5556. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  5557. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  5558. {
  5559. //判断是不是第3箱
  5560. //判断是否是第三箱
  5561. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  5562. {
  5563. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  5564. if (item.Id == thirdbox)//第3箱子
  5565. {
  5566. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  5567. {
  5568. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5569. continue;
  5570. }
  5571. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  5572. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  5573. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  5574. {
  5575. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  5576. continue;
  5577. }
  5578. }
  5579. else if (item.Id > thirdbox)
  5580. {
  5581. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  5582. continue;
  5583. }
  5584. }
  5585. //if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  5586. //{
  5587. // _logger.LogInformation("同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5588. // continue;
  5589. //}
  5590. }
  5591. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  5592. if (equips == null)
  5593. {
  5594. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  5595. continue;
  5596. }
  5597. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  5598. if (!palletMach.Any())
  5599. {
  5600. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  5601. continue;
  5602. }
  5603. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  5604. var curdocid = maxdocid + 1;
  5605. if (palletMach.Any())
  5606. {
  5607. var pid = palletMach.First().PalletizingId;
  5608. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  5609. {
  5610. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  5611. }
  5612. }
  5613. foreach (var pallets in palletMach)
  5614. {
  5615. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  5616. if (cell == null)
  5617. {
  5618. continue;
  5619. }
  5620. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5621. if (invs == null)
  5622. {
  5623. continue;
  5624. }
  5625. var root = DetermineRoot(pallets.Palletequip);
  5626. //先判断二升位是否能出库
  5627. if (cell.Depth == 2)
  5628. {
  5629. var respon = MoveTask(cell.Code);
  5630. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5631. {
  5632. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  5633. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  5634. continue;
  5635. }
  5636. }
  5637. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  5638. {
  5639. Code = pallets.ContBarCode,
  5640. CellCode = cell.Code,
  5641. Srm = cell.SCRel,
  5642. Tunnel = cell.Tunnel.ToString(),
  5643. Floor = cell.Floor,
  5644. Grade = invs.Grade,
  5645. Mater = invs.MatCode,
  5646. SkuCode = pallets.SkuCode,
  5647. PalletLayer = 0,
  5648. ProductMachCode = invs.ProductMachCode,
  5649. Equip = item.Equip,
  5650. PalletizingId = item.Id,
  5651. Robot = root,
  5652. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  5653. DocId = curdocid
  5654. });
  5655. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5656. {
  5657. continue;
  5658. }
  5659. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5660. {
  5661. Istask = 1,
  5662. Layer = 0
  5663. }, p => p.ContBarCode == invs.ContGrpBarCode);
  5664. }
  5665. //下完任务后将标识值加1
  5666. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  5667. taskflag = taskflag + 1;
  5668. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  5669. }
  5670. }
  5671. //待码垛箱任务下发
  5672. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  5673. if (palletlisttobe.Any())
  5674. {
  5675. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  5676. {
  5677. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  5678. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  5679. {
  5680. _palletizrepository.AsUpdateable()
  5681. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  5682. .Where(p => p.Id == item.Id)
  5683. .ExecuteCommand();
  5684. }
  5685. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  5686. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  5687. {
  5688. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  5689. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  5690. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  5691. {
  5692. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  5693. continue;
  5694. }
  5695. //箱之间状态卡控限制标识
  5696. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  5697. //判断任务数量
  5698. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  5699. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  5700. {
  5701. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  5702. continue;
  5703. }
  5704. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  5705. if (!_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())// && !_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => mdtempequiplist.Contains(p.PalletizingId) && p.Status < taskstatus).Any()
  5706. {
  5707. //判断是否是第三箱
  5708. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  5709. {
  5710. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  5711. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  5712. if (item.Id == thirdbox)//第3箱子
  5713. {
  5714. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  5715. {
  5716. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5717. continue;
  5718. }
  5719. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  5720. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  5721. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  5722. {
  5723. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  5724. continue;
  5725. }
  5726. }
  5727. else if (item.Id > thirdbox)
  5728. {
  5729. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  5730. continue;
  5731. }
  5732. }
  5733. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  5734. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  5735. {
  5736. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  5737. if (!palletMach.Any())
  5738. {
  5739. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  5740. continue;
  5741. }
  5742. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  5743. var curdocid = maxdocid + 1;
  5744. if (palletMach.Any())
  5745. {
  5746. var pid = palletMach.First().PalletizingId;
  5747. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  5748. {
  5749. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  5750. }
  5751. }
  5752. foreach (var pallets in palletMach)
  5753. {
  5754. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  5755. if (cell == null)
  5756. {
  5757. continue;
  5758. }
  5759. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5760. if (invs == null)
  5761. {
  5762. continue;
  5763. }
  5764. var root = DetermineRoot(pallets.Palletequip);
  5765. //先判断二升位是否能出库
  5766. if (cell.Depth == 2)
  5767. {
  5768. var respon = MoveTask(cell.Code);
  5769. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5770. {
  5771. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  5772. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  5773. continue;
  5774. }
  5775. }
  5776. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  5777. {
  5778. Code = pallets.ContBarCode,
  5779. CellCode = cell.Code,
  5780. Srm = cell.SCRel,
  5781. Tunnel = cell.Tunnel.ToString(),
  5782. Floor = cell.Floor,
  5783. Grade = invs.Grade,
  5784. Mater = invs.MatCode,
  5785. SkuCode = pallets.SkuCode,
  5786. PalletLayer = 0,
  5787. ProductMachCode = invs.ProductMachCode,
  5788. Equip = item.Equip,
  5789. PalletizingId = item.Id,
  5790. Robot = root,
  5791. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  5792. DocId = curdocid
  5793. });
  5794. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5795. {
  5796. continue;
  5797. }
  5798. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5799. {
  5800. Istask = 1,
  5801. Layer = 0
  5802. }, p => p.ContBarCode == invs.ContGrpBarCode);
  5803. }
  5804. //下完任务后将标识值加1
  5805. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  5806. taskflag = taskflag + 1;
  5807. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  5808. }
  5809. }
  5810. }
  5811. else
  5812. {
  5813. _palletizrepository.AsUpdateable()
  5814. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  5815. .Where(p => p.Id == item.Id)
  5816. .ExecuteCommand();
  5817. }
  5818. }
  5819. }
  5820. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  5821. var iscontinue = false;
  5822. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  5823. {
  5824. if (string.IsNullOrEmpty(palletequip.Default1))
  5825. {
  5826. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  5827. {
  5828. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  5829. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5830. if (preinvlist.Any())
  5831. {
  5832. //机械手交叉下任务需求
  5833. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  5834. //{
  5835. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  5836. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5837. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5838. // {
  5839. // }
  5840. // else
  5841. // {
  5842. // iscontinue = false;
  5843. // continue;
  5844. // }
  5845. //}
  5846. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  5847. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  5848. {
  5849. //如果较小的工位已经没有任务那么,则继续下该工位任务
  5850. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  5851. if (minequ != null)
  5852. {
  5853. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5854. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5855. {
  5856. }
  5857. else
  5858. {
  5859. iscontinue = false;
  5860. continue;
  5861. }
  5862. }
  5863. }
  5864. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  5865. {
  5866. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5867. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  5868. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  5869. return res;
  5870. }
  5871. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  5872. //码垛信息校验
  5873. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  5874. {
  5875. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5876. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  5877. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  5878. return res;
  5879. }
  5880. var root = DetermineRoot(palletequip.Code);
  5881. var pallet = new Palletizing()
  5882. {
  5883. PalletMax = rule.FullCountQty,
  5884. PalletizState = 0,
  5885. Equip = palletequip.Code,
  5886. Finish = 0,
  5887. AddWho = "",
  5888. EditWho = "",
  5889. BoxRule = rule.PackRule,
  5890. BoxRuleId = rule.Id,
  5891. IsControlpanel = false,
  5892. TaskNum = int.Parse(palletequip.Default3),
  5893. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  5894. Robot = root
  5895. };
  5896. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  5897. if (pallects.Id == 0)
  5898. {
  5899. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5900. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  5901. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  5902. return res;
  5903. }
  5904. var palletizId = pallects.Id;
  5905. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5906. {
  5907. ZXStateCode = 1
  5908. }, p => p.Id == rule.Id);
  5909. List<PalletLayerMath> math = new List<PalletLayerMath>();
  5910. foreach (var invs in preinvlist)
  5911. {
  5912. var palletlayer = new PalletLayerMath()
  5913. {
  5914. PalletizingId = palletizId,
  5915. ContGrpId = (long)invs.ContGrpId,
  5916. ContBarCode = invs.ContGrpBarCode,
  5917. Layer = 0,
  5918. SkuCode = rule.SkuCode,
  5919. Finish = 0,
  5920. PboxruleId = rule.Id,
  5921. Istask = 0,
  5922. Palletequip = palletequip.Code,
  5923. Depth = invs.Depth,
  5924. IsBlack = invs.IsBlack,
  5925. SolderCount = invs.SolderCount,
  5926. BoxCode = rule.PBoxCode,
  5927. Wbgroup = invs.WbGroupCode,
  5928. StockDonse = invs.InDocsNo,
  5929. BoxDonse = rule.DocsNo
  5930. };
  5931. math.Add(palletlayer);
  5932. }
  5933. _palletlayerMathrepository.InsertRange(math);
  5934. //把库存预锁标志更新掉
  5935. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5936. {
  5937. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  5938. BomMatCode = "",
  5939. PreStock = "1"
  5940. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  5941. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  5942. res.ResMsg = "非控制捞取预锁库存处理成功";
  5943. return res;
  5944. }
  5945. else
  5946. {
  5947. iscontinue = false;
  5948. continue;
  5949. }
  5950. }
  5951. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5952. {
  5953. iscontinue = true;
  5954. break;
  5955. }
  5956. else
  5957. {
  5958. iscontinue = false;
  5959. continue;
  5960. }
  5961. }
  5962. else
  5963. {
  5964. if (!string.IsNullOrEmpty(palletequip.Default3))
  5965. {
  5966. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  5967. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5968. if (preinvlist.Any())
  5969. {
  5970. //机械手交叉下任务需求
  5971. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  5972. //{
  5973. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  5974. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5975. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5976. // {
  5977. // }
  5978. // else
  5979. // {
  5980. // iscontinue = false;
  5981. // continue;
  5982. // }
  5983. //}
  5984. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  5985. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  5986. {
  5987. //如果较小的工位已经没有任务那么,则继续下该工位任务
  5988. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  5989. if (minequ != null)
  5990. {
  5991. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5992. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5993. {
  5994. }
  5995. else
  5996. {
  5997. iscontinue = false;
  5998. continue;
  5999. }
  6000. }
  6001. }
  6002. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  6003. {
  6004. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6005. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  6006. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  6007. return res;
  6008. }
  6009. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  6010. //码垛信息校验
  6011. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  6012. {
  6013. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6014. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  6015. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  6016. return res;
  6017. }
  6018. var root = DetermineRoot(palletequip.Code);
  6019. var pallet = new Palletizing()
  6020. {
  6021. PalletMax = rule.FullCountQty,
  6022. PalletizState = 2,
  6023. Equip = palletequip.Code,
  6024. Finish = 0,
  6025. AddWho = "",
  6026. EditWho = "",
  6027. BoxRule = rule.PackRule,
  6028. BoxRuleId = rule.Id,
  6029. IsControlpanel = false,
  6030. TaskNum = int.Parse(palletequip.Default3),
  6031. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  6032. Robot = root
  6033. };
  6034. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  6035. if (pallects.Id == 0)
  6036. {
  6037. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6038. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  6039. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  6040. return res;
  6041. }
  6042. var palletizId = pallects.Id;
  6043. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6044. {
  6045. ZXStateCode = 1
  6046. }, p => p.Id == rule.Id);
  6047. List<PalletLayerMath> math = new List<PalletLayerMath>();
  6048. foreach (var invs in preinvlist)
  6049. {
  6050. var palletlayer = new PalletLayerMath()
  6051. {
  6052. PalletizingId = palletizId,
  6053. ContGrpId = (long)invs.ContGrpId,
  6054. ContBarCode = invs.ContGrpBarCode,
  6055. Layer = 0,
  6056. SkuCode = rule.SkuCode,
  6057. Finish = 0,
  6058. PboxruleId = rule.Id,
  6059. Istask = 0,
  6060. Palletequip = palletequip.Code,
  6061. Depth = invs.Depth,
  6062. IsBlack = invs.IsBlack,
  6063. SolderCount = invs.SolderCount,
  6064. BoxCode = rule.PBoxCode,
  6065. Wbgroup = invs.WbGroupCode,
  6066. StockDonse = invs.InDocsNo,
  6067. BoxDonse = rule.DocsNo
  6068. };
  6069. math.Add(palletlayer);
  6070. }
  6071. _palletlayerMathrepository.InsertRange(math);
  6072. //把库存预锁标志更新掉
  6073. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6074. {
  6075. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  6076. BomMatCode = "",
  6077. PreStock = "1"
  6078. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  6079. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  6080. res.ResMsg = "非控制捞取预锁库存处理成功";
  6081. return res;
  6082. }
  6083. else
  6084. {
  6085. iscontinue = false;
  6086. continue;
  6087. }
  6088. }
  6089. else
  6090. {
  6091. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  6092. {
  6093. iscontinue = true;
  6094. break;
  6095. }
  6096. else
  6097. {
  6098. iscontinue = false;
  6099. continue;
  6100. }
  6101. }
  6102. }
  6103. }
  6104. if (!iscontinue)
  6105. {
  6106. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  6107. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  6108. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  6109. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  6110. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  6111. {
  6112. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  6113. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6114. res.ResMsg = "没有空闲的码垛工位";
  6115. return res;
  6116. }
  6117. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  6118. {
  6119. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  6120. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6121. res.ResMsg = "没有空闲的码垛工位";
  6122. return res;
  6123. }
  6124. }
  6125. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  6126. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  6127. if (!devices.Where(p => p.pH_STATUS == true).Any())
  6128. {
  6129. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  6130. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6131. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  6132. return res;
  6133. }
  6134. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  6135. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 4 && p.PackRule == "SPC").OrderBy(p => p.EditTime);
  6136. if (prerules != null && prerules.Any())
  6137. {
  6138. foreach (var rule in prerules)
  6139. {
  6140. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  6141. List<string> equips = new List<string>();
  6142. foreach (var pp in sys)
  6143. {
  6144. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  6145. {
  6146. equips.Add(pp.Code);
  6147. }
  6148. }
  6149. if (!equips.Any())
  6150. {
  6151. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  6152. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  6153. //自动更新子托盘配置
  6154. foreach (var item1 in sys)
  6155. {
  6156. if (!item1.SContent.Contains(rule.TrayCode))
  6157. {
  6158. string con = item1.SContent + "," + rule.TrayCode;
  6159. _sysconfigrepository.AsUpdateable()
  6160. .SetColumns(p => new sxSysConfig() { SContent = con })
  6161. .Where(p => p.Id == item1.Id)
  6162. .ExecuteCommand();
  6163. }
  6164. }
  6165. }
  6166. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  6167. if (!invlist2.Any())
  6168. {
  6169. _logger.LogInformation(rule.Id + "规则表预占数据没有查到对应库存信息");
  6170. continue;
  6171. }
  6172. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  6173. if (!dev.Any())
  6174. {
  6175. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  6176. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  6177. continue;
  6178. }
  6179. var robotlist = new List<string>() { "Robot1", "Robot2" };
  6180. sxSysConfig palletequip = null;
  6181. foreach (var robot in robotlist)
  6182. {
  6183. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  6184. {
  6185. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").OrderBy(p => p.TaskFlag).First();
  6186. //码垛工位
  6187. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  6188. {
  6189. palletequip = palletequiptemp;
  6190. break;
  6191. }
  6192. //缓存工位1
  6193. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  6194. {
  6195. palletequip = palletequiptemp;
  6196. break;
  6197. }
  6198. //缓存工位2
  6199. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  6200. {
  6201. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  6202. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  6203. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  6204. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  6205. {
  6206. palletequip = palletequiptemp;
  6207. break;
  6208. }
  6209. }
  6210. }
  6211. }
  6212. if (palletequip == null)
  6213. {
  6214. res.ResMsg = "没有空闲的码垛工位";
  6215. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  6216. return res;
  6217. }
  6218. int acttype = 0;
  6219. //判断是缓存工位锁定库存还是码垛工位直接下任务
  6220. if (string.IsNullOrEmpty(palletequip.Default1))
  6221. {
  6222. if (string.IsNullOrEmpty(palletequip.Cache1State))
  6223. {
  6224. acttype = 1;//直接执行下任务
  6225. }
  6226. else
  6227. {
  6228. //等待下一轮循环,往math表插数据放在前面
  6229. res.ResMsg = "等待下一轮循环";
  6230. return res;
  6231. }
  6232. }
  6233. else
  6234. {
  6235. if (string.IsNullOrEmpty(palletequip.Cache1State))
  6236. {
  6237. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  6238. if (!string.IsNullOrEmpty(palletequip.Default3))
  6239. {
  6240. res.ResMsg = "等待下一轮循环";
  6241. return res;
  6242. }
  6243. else
  6244. {
  6245. acttype = 2;//预锁库存
  6246. }
  6247. }
  6248. else
  6249. {
  6250. //判断缓存工位2(缓存工位1的托盘要到位之后)
  6251. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  6252. {
  6253. //使用缓存2工位
  6254. acttype = 3;
  6255. }
  6256. else
  6257. {
  6258. res.ResMsg = "没有空闲的码垛工位";
  6259. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  6260. return res;
  6261. }
  6262. }
  6263. }
  6264. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode, ActType = acttype };
  6265. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  6266. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  6267. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  6268. {
  6269. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  6270. res.ResCode = trayres.ResCode;
  6271. res.ResMsg = trayres.ResMsg;
  6272. return res;
  6273. }
  6274. if (acttype == 1)
  6275. {
  6276. //码垛信息校验
  6277. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  6278. {
  6279. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6280. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  6281. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  6282. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  6283. return res;
  6284. }
  6285. var root = DetermineRoot(palletequip.Code);
  6286. var pallet = new Palletizing()
  6287. {
  6288. PalletMax = rule.FullCountQty,
  6289. PalletizState = 0,
  6290. Equip = palletequip.Code,
  6291. Finish = 0,
  6292. AddWho = "",
  6293. EditWho = "",
  6294. BoxRule = rule.PackRule,
  6295. BoxRuleId = rule.Id,
  6296. IsControlpanel = false,
  6297. TaskNum = int.Parse(trayres.Memo1),
  6298. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  6299. Robot = root
  6300. };
  6301. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  6302. if (pallects.Id == 0)
  6303. {
  6304. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6305. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  6306. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  6307. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  6308. return res;
  6309. }
  6310. var palletizId = pallects.Id;
  6311. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6312. {
  6313. ZXStateCode = 1
  6314. }, p => p.Id == rule.Id);
  6315. List<PalletLayerMath> math = new List<PalletLayerMath>();
  6316. foreach (var invs in invlist2)
  6317. {
  6318. var palletlayer = new PalletLayerMath()
  6319. {
  6320. PalletizingId = palletizId,
  6321. ContGrpId = (long)invs.ContGrpId,
  6322. ContBarCode = invs.ContGrpBarCode,
  6323. Layer = 0,
  6324. SkuCode = rule.SkuCode,
  6325. Finish = 0,
  6326. PboxruleId = rule.Id,
  6327. Istask = 0,
  6328. Palletequip = palletequip.Code,
  6329. IsBlack = invs.IsBlack,
  6330. Depth = invs.Depth,
  6331. SolderCount = invs.SolderCount,
  6332. BoxCode = rule.PBoxCode,
  6333. StockDonse = invs.InDocsNo,
  6334. Wbgroup = invs.WbGroupCode,
  6335. BoxDonse = rule.DocsNo
  6336. };
  6337. math.Add(palletlayer);
  6338. }
  6339. _palletlayerMathrepository.InsertRange(math);
  6340. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6341. {
  6342. PreStock = "1"
  6343. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  6344. res.ResCode = 200;
  6345. res.ResMsg = "成功";
  6346. return res;
  6347. }
  6348. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  6349. {
  6350. var codes = new List<string>();
  6351. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  6352. if (codes.Any())
  6353. {
  6354. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6355. {
  6356. PreStock = "1",
  6357. BomMatCode = trayres.Memo1,//预锁托盘任务id
  6358. BomMatName = rule.PBoxCode, //预锁的箱号
  6359. BomSetId = 0 //代表非控制箱标识
  6360. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  6361. //锁定缓存工位
  6362. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  6363. }
  6364. res.ResCode = 200;
  6365. res.ResMsg = "成功";
  6366. return res;
  6367. }
  6368. }
  6369. }
  6370. else
  6371. {
  6372. res.ResMsg = "没有预占状态的规则数据";
  6373. }
  6374. return res;
  6375. }
  6376. /// <summary>
  6377. /// 码垛SPC非控制装箱计算预占箱号
  6378. /// </summary>
  6379. /// <param name="request"></param>
  6380. /// <returns></returns>
  6381. public SRes PalletizingSpcNotPackRulePre(PalletizingPackStockOutRequest request)
  6382. {
  6383. var res = new SRes();
  6384. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  6385. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  6386. {
  6387. res.ResMsg = "预占箱数已经大于设置值";
  6388. return res;
  6389. }
  6390. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  6391. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6392. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.IsControlpanel == false && p.IsTorsChk == false) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  6393. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  6394. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6395. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  6396. on stock.InDocsNo equals rule1.DocsNo
  6397. select new StockTemp
  6398. {
  6399. MatCode = stock.MatCode,
  6400. InvBarCode = stock.InvBarCode,
  6401. Grade = stock.Grade,
  6402. InvStateCode = stock.InvStateCode,
  6403. ProductTime = stock.ProductTime,
  6404. WbGroupCode = stock.WbGroupCode,
  6405. IsTorsChk = stock.IsTorsChk,
  6406. TorsChkQty = stock.TorsChkQty,
  6407. TorsChkValue = stock.TorsChkValue,
  6408. HoldTime = stock.HoldTime,
  6409. ProductMachCode = stock.ProductMachCode,
  6410. IsControlpanel = stock.IsControlpanel,
  6411. HWTypeCode = stock.HWTypeCode,
  6412. SolderCount = stock.SolderCount,
  6413. IsRework = stock.IsRework,
  6414. IsBlack = stock.IsBlack,
  6415. Col = loc.Col,
  6416. Layer = loc.Layer,
  6417. Shelf = loc.Shelf,
  6418. Depth = loc.Depth,
  6419. Code = loc.Code,
  6420. Tunnel = loc.Tunnel,
  6421. SCRel = loc.SCRel,
  6422. Floor = loc.Floor,
  6423. WarehouseCode = loc.WarehouseCode,
  6424. ContGrpBarCode = loc.ContGrpBarCode,
  6425. ContGrpId = loc.ContGrpId,
  6426. Id = loc.Id,
  6427. StateNum = loc.StateNum,
  6428. SkuCode = rule1.SkuCode,
  6429. Wind = stock.Wind,
  6430. InDocsNo = stock.InDocsNo,
  6431. BatchNo = stock.BatchNo
  6432. };
  6433. var wbConf = _sysconfigrepository.GetFirst(p => p.Code == "WbGroupConf").SContent.Split(',').ToList();//允许装到普通箱的检测箱机器组,多个机器组之间用英文格式逗号分隔
  6434. //查找满足时效但是没有全部检测完成的盘所在的机器组
  6435. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6436. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && p.Ovced == 0 && string.IsNullOrEmpty(p.PreStock)
  6437. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours && wbConf.Contains(p.WbGroupCode))
  6438. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6439. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  6440. on stock.InDocsNo equals rule1.DocsNo
  6441. select new StockTemp
  6442. {
  6443. MatCode = stock.MatCode,
  6444. InvBarCode = stock.InvBarCode,
  6445. Grade = stock.Grade,
  6446. InvStateCode = stock.InvStateCode,
  6447. ProductTime = stock.ProductTime,
  6448. WbGroupCode = stock.WbGroupCode,
  6449. IsTorsChk = stock.IsTorsChk,
  6450. TorsChkQty = stock.TorsChkQty,
  6451. TorsChkValue = stock.TorsChkValue,
  6452. HoldTime = stock.HoldTime,
  6453. ProductMachCode = stock.ProductMachCode,
  6454. IsControlpanel = stock.IsControlpanel,
  6455. HWTypeCode = stock.HWTypeCode,
  6456. SolderCount = stock.SolderCount,
  6457. IsRework = stock.IsRework,
  6458. IsBlack = stock.IsBlack,
  6459. Col = loc.Col,
  6460. Layer = loc.Layer,
  6461. Shelf = loc.Shelf,
  6462. Depth = loc.Depth,
  6463. Code = loc.Code,
  6464. Tunnel = loc.Tunnel,
  6465. SCRel = loc.SCRel,
  6466. Floor = loc.Floor,
  6467. WarehouseCode = loc.WarehouseCode,
  6468. ContGrpBarCode = loc.ContGrpBarCode,
  6469. ContGrpId = loc.ContGrpId,
  6470. Id = loc.Id,
  6471. StateNum = loc.StateNum,
  6472. SkuCode = rule1.SkuCode,
  6473. Wind = stock.Wind,
  6474. InDocsNo = stock.InDocsNo,
  6475. BatchNo = stock.BatchNo
  6476. };
  6477. invlist = invlist.Union(invlistTors);
  6478. if (!invlist.Any())
  6479. {
  6480. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  6481. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6482. res.ResMsg = "库存不足";
  6483. return res;
  6484. }
  6485. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  6486. invlist = invlist.Distinct(new CompareStock());
  6487. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  6488. if (tunlist.Any())
  6489. {
  6490. if (tunlist.Where(p => p.Default2 == "1").Any())
  6491. {
  6492. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6493. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6494. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  6495. }
  6496. if (tunlist.Where(p => p.Default2 == "2").Any())
  6497. {
  6498. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6499. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6500. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  6501. }
  6502. if (tunlist.Where(p => p.Default2 == "3").Any())
  6503. {
  6504. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6505. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6506. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  6507. }
  6508. }
  6509. if (!invlist.Any())
  6510. {
  6511. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  6512. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6513. res.ResMsg = "禁用巷道后 | 库存不足";
  6514. return res;
  6515. }
  6516. var invlist2 = invlist;
  6517. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  6518. if (!sku.Any())
  6519. {
  6520. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  6521. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6522. res.ResMsg = "库中没有SKU或SKU不能为空";
  6523. return res;
  6524. }
  6525. var batchlist = invlist.Where(p => p.IsBlack == true).Select(p => p.BatchNo).Distinct().ToList();
  6526. //var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && invlist.GroupBy(v => v.InDocsNo).ToList().Select(v => v.Key).Contains(p.DocsNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind));
  6527. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && batchlist.Contains(p.BatchNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36));
  6528. if (!rulelist.Any())
  6529. {
  6530. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  6531. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  6532. _logger.LogInformation("非控制不满足装箱:" + msg);
  6533. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  6534. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  6535. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  6536. return res;
  6537. }
  6538. foreach (var item in sku)
  6539. {
  6540. //找库存中存在的批次
  6541. var batchlisttemp = invlist.Where(p => p.IsBlack == true && p.SkuCode == item.Key).Select(p => p.BatchNo).Distinct().ToList();
  6542. if (!batchlisttemp.Any())
  6543. {
  6544. string msg = "SKU:" + item.Key + ",没有黑盘";
  6545. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  6546. _logger.LogInformation("非控制不满足装箱:" + msg);
  6547. res.ResMsg = msg;
  6548. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有黑盘,SKU:" + item.Key);
  6549. continue;
  6550. }
  6551. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.PackRule == "SPC" && p.ZXStateCode == 0 && batchlisttemp.Contains(p.BatchNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36)).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  6552. if (!rules.Any())
  6553. {
  6554. string msg = "SKU:" + item.Key + "批次:" + JsonConvert.SerializeObject(batchlisttemp) + ",没有可用箱号";
  6555. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  6556. _logger.LogInformation("非控制不满足装箱:" + msg);
  6557. res.ResMsg = msg;
  6558. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,SKU:" + item.Key + ",单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  6559. continue;
  6560. }
  6561. var rulegroup = rules.GroupBy(p => new
  6562. {
  6563. p.Wind,
  6564. p.SpoolType,
  6565. p.FullCountQty,
  6566. p.DocsNo,
  6567. p.BatchNo
  6568. }).ToList();
  6569. foreach (var rulestem in rulegroup)
  6570. {
  6571. //先判断该单号下是否有黑盘,如果没有则直接跳过
  6572. if (!invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).Any())
  6573. {
  6574. WreTimeOutRecord(invlist.Where(p => p.IsBlack == false && p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), "该单号批次下没有黑盘" + rulestem.Key.DocsNo + ",批次:" + rulestem.Key.BatchNo);
  6575. continue;
  6576. }
  6577. var blackcounttemp = invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).Count();
  6578. if (rulestem.Key.SpoolType == "BS40" || rulestem.Key.SpoolType == "BS60")
  6579. {
  6580. if (blackcounttemp < 2)
  6581. {
  6582. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == false && p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), "该单号批次下黑盘数量不足" + rulestem.Key.DocsNo + ",批次:" + rulestem.Key.BatchNo);
  6583. continue;
  6584. }
  6585. }
  6586. //else
  6587. //{
  6588. //}
  6589. var rule = rules.Where(p => p.SkuCode == item.Key && p.SpoolType == rulestem.Key.SpoolType && p.Wind == rulestem.Key.Wind && p.FullCountQty == rulestem.Key.FullCountQty && p.DocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode).FirstOrDefault();
  6590. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  6591. List<string> equips = new List<string>();
  6592. foreach (var pp in sys)
  6593. {
  6594. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  6595. {
  6596. equips.Add(pp.Code);
  6597. }
  6598. }
  6599. if (!equips.Any())
  6600. {
  6601. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  6602. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  6603. //自动更新子托盘配置
  6604. foreach (var item1 in sys)
  6605. {
  6606. if (!item1.SContent.Contains(rule.TrayCode))
  6607. {
  6608. string con = item1.SContent + "," + rule.TrayCode;
  6609. _sysconfigrepository.AsUpdateable()
  6610. .SetColumns(p => new sxSysConfig() { SContent = con })
  6611. .Where(p => p.Id == item1.Id)
  6612. .ExecuteCommand();
  6613. }
  6614. }
  6615. continue;
  6616. }
  6617. //var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  6618. //if (!dev.Any())
  6619. //{
  6620. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key, Time = DateTime.Now });
  6621. // _logger.LogInformation(rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key);
  6622. // WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  6623. // continue;
  6624. //}
  6625. //只有黑盘的机器组
  6626. var blackgrouplist = invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).Select(p => p.WbGroupCode).Distinct().ToList();
  6627. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode && blackgrouplist.Contains(p.WbGroupCode)).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  6628. if (!wbgrouplist.Any())
  6629. {
  6630. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  6631. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  6632. continue;
  6633. }
  6634. ; //找到重绕盘,拼接进去,重绕盘不需要扭转
  6635. var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6636. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.InDocsNo.StartsWith("CHA")) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  6637. && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  6638. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6639. where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  6640. select new StockTemp
  6641. {
  6642. MatCode = stock.MatCode,
  6643. InvBarCode = stock.InvBarCode,
  6644. Grade = stock.Grade,
  6645. InvStateCode = stock.InvStateCode,
  6646. ProductTime = stock.ProductTime,
  6647. WbGroupCode = stock.WbGroupCode,
  6648. IsTorsChk = stock.IsTorsChk,
  6649. TorsChkQty = stock.TorsChkQty,
  6650. TorsChkValue = stock.TorsChkValue,
  6651. HoldTime = stock.HoldTime,
  6652. InDocsNo = stock.InDocsNo,
  6653. ProductMachCode = stock.ProductMachCode,
  6654. IsControlpanel = stock.IsControlpanel,
  6655. HWTypeCode = stock.HWTypeCode,
  6656. SolderCount = stock.SolderCount,
  6657. IsRework = stock.IsRework,
  6658. IsBlack = stock.IsBlack,
  6659. Col = loc.Col,
  6660. Layer = loc.Layer,
  6661. Shelf = loc.Shelf,
  6662. Depth = loc.Depth,
  6663. Code = loc.Code,
  6664. Tunnel = loc.Tunnel,
  6665. SCRel = loc.SCRel,
  6666. Floor = loc.Floor,
  6667. WarehouseCode = loc.WarehouseCode,
  6668. ContGrpBarCode = loc.ContGrpBarCode,
  6669. ContGrpId = loc.ContGrpId,
  6670. Id = loc.Id,
  6671. StateNum = loc.StateNum,
  6672. SkuCode = "",
  6673. Wind = stock.Wind
  6674. };
  6675. //过滤重饶盘被禁用的巷道
  6676. invlistchongrao = invlistchongrao.Distinct();
  6677. if (tunlist.Any())
  6678. {
  6679. if (tunlist.Where(p => p.Default2 == "1").Any())
  6680. {
  6681. var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6682. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6683. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  6684. }
  6685. if (tunlist.Where(p => p.Default2 == "2").Any())
  6686. {
  6687. var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6688. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6689. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  6690. }
  6691. if (tunlist.Where(p => p.Default2 == "3").Any())
  6692. {
  6693. var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6694. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6695. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  6696. }
  6697. }
  6698. //重绕盘数量限制BS80 10个(30%);BS60 21个(30%);BS40 21个(30%)
  6699. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6700. {
  6701. invlistchongrao = invlistchongrao.Take(21);
  6702. }
  6703. else
  6704. {
  6705. invlistchongrao = invlistchongrao.Take(10);
  6706. }
  6707. var tempsign = false;
  6708. foreach (var wbgroup in wbgrouplist)
  6709. {
  6710. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  6711. //invlistchongrao = invlistchongrao.Where(p=>string.IsNullOrEmpty(p.WbGroupCode) || p.WbGroupCode == wbgroup.Key).OrderBy(p => p.ProductTime);
  6712. invlist2 = invlistchongrao.Union(invlist2);
  6713. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty && invlist2.Where(p => p.IsBlack == true).Any())
  6714. {
  6715. //tempsign = true;
  6716. //break;
  6717. }
  6718. else
  6719. {
  6720. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  6721. {
  6722. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有黑盘;SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind + ",批次:" + rule.BatchNo);
  6723. }
  6724. else
  6725. {
  6726. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind + ",批次:" + rule.BatchNo);
  6727. }
  6728. continue;
  6729. }
  6730. if (!invlist2.Any())
  6731. {
  6732. string msg = "没有对应单号的库存,单号:" + rule.DocsNo + ",SKU:" + item.Key + ",绕向:" + rule.Wind + ",机器组:" + wbgroup.Key;
  6733. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  6734. _logger.LogInformation("非控制不满足装箱:" + msg);
  6735. res.ResMsg = msg;
  6736. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count());
  6737. continue;
  6738. }
  6739. if (!string.IsNullOrEmpty(rule.SpoolType))
  6740. {
  6741. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  6742. }
  6743. if (!string.IsNullOrEmpty(rule.Wind))
  6744. {
  6745. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  6746. }
  6747. //焊点、返工盘、黑盘一些基本属性筛选
  6748. int pro = 0;
  6749. //不再限制最后一箱黑盘数量,保持统一,BS60两个,BS80一个,2024-5-18
  6750. pro = 0;
  6751. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  6752. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6753. {
  6754. rule.BlackCount = int.Parse(blackcount.Default1);
  6755. }
  6756. else
  6757. {
  6758. rule.BlackCount = int.Parse(blackcount.Default2);
  6759. }
  6760. var blackinvlist = new List<StockTemp>();
  6761. if (pro == 1)
  6762. {
  6763. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo && p.BatchNo == rule.BatchNo).OrderBy(p => p.ProductTime).ToList();
  6764. if (!blackinvlist.Any())
  6765. {
  6766. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",批次:" + rule.BatchNo + "下的黑盘数量为0";
  6767. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  6768. _logger.LogInformation("非控制不满足装箱:" + msg);
  6769. res.ResMsg = msg;
  6770. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6771. continue;
  6772. }
  6773. blackinvlist = blackinvlist.Where(p => p.IsBlack == true).ToList();
  6774. }
  6775. else
  6776. {
  6777. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo && p.BatchNo == rule.BatchNo).OrderBy(p => p.ProductTime).ToList();
  6778. if (!blackinvlist.Any())
  6779. {
  6780. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",批次:" + rule.BatchNo + "下的黑盘数量为0";
  6781. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  6782. _logger.LogInformation("非控制不满足装箱:" + msg);
  6783. res.ResMsg = msg;
  6784. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6785. continue;
  6786. }
  6787. blackinvlist = blackinvlist.Take(rule.BlackCount).ToList();
  6788. }
  6789. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6790. {
  6791. if (blackinvlist.Count <= 1)
  6792. {
  6793. string msg = "BS60工字轮黑盘数量至少2个,当前黑盘数量" + blackinvlist.Count + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向" + rule.Wind + "SKU:" + rule.SkuCode + ",单号:" + rule.DocsNo;
  6794. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut14", new RedisErrorInfo() { Equip = "NoControlOut14", Con = msg, Time = DateTime.Now });
  6795. _logger.LogInformation("非控制不满足装箱:" + msg);
  6796. res.ResMsg = msg;
  6797. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6798. continue;
  6799. }
  6800. }
  6801. invlist2 = invlist2.Where(p => !blackinvlist.Select(q => q.ContGrpBarCode).Contains(p.ContGrpBarCode) && p.IsBlack == false).ToList();
  6802. var tempoutrecord = invlist2.ToList();
  6803. var solderinvlist = new List<StockTemp>();
  6804. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  6805. {
  6806. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  6807. var solcount = rulemaxcount - blackinvlist.Count;
  6808. if (solcount <= 0)
  6809. {
  6810. solcount = 0;
  6811. };
  6812. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  6813. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  6814. }
  6815. else
  6816. {
  6817. //不允许焊点盘
  6818. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  6819. }
  6820. var returninvlist = new List<StockTemp>();
  6821. if (rule.ReturnCount > 0)
  6822. {
  6823. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  6824. invlist2 = invlist2.Where(p => p.IsRework == false);
  6825. }
  6826. else
  6827. {
  6828. invlist2 = invlist2.Where(p => p.IsRework == false);
  6829. }
  6830. if (!invlist2.Any())
  6831. {
  6832. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  6833. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  6834. _logger.LogInformation("非控制不满足装箱:" + msg);
  6835. res.ResMsg = msg;
  6836. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  6837. continue;
  6838. }
  6839. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) < rule.FullCountQty)
  6840. {
  6841. string msg = "sku:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + invlist2.First().HWTypeCode + ",SPC非控制箱不满足装箱数量,需要装" + rule.FullCountQty + "实际数量:" + (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) + ";普通盘" + invlist2.Count() + ",焊点盘" + solderinvlist.Count + ",返工盘" + returninvlist.Count + ",黑盘" + blackinvlist.Count;
  6842. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  6843. _logger.LogInformation("非控制不满足装箱:" + msg);
  6844. res.ResMsg = msg;
  6845. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  6846. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6847. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6848. WreTimeOutRecord(blackinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6849. continue;
  6850. }
  6851. //var firstproducttime = invlist2.Where(p => !p.InDocsNo.StartsWith("CHA")).Any() ? invlist2.Where(p=>!p.InDocsNo.StartsWith("CHA")).OrderBy(p => p.ProductTime).First().ProductTime : invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  6852. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  6853. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 12); //12小时之内的按堆垛机平均分
  6854. #region 按照堆垛机平均分配任务
  6855. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count);//符合条件的普通盘数量
  6856. var mastinvlist = solderinvlist.Union(returninvlist).Union(blackinvlist);
  6857. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  6858. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  6859. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  6860. select new SrmTaskTmep
  6861. {
  6862. Srm = x.Key,
  6863. TaskCount = x.Count(),
  6864. LocList = x.Select(q => q.Code).ToList()
  6865. };
  6866. var srmtasktobe = new List<SrmTaskTmep>();
  6867. foreach (var srmlistitem in srmlist)
  6868. {
  6869. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  6870. {
  6871. srmtasktobe.Add(new SrmTaskTmep()
  6872. {
  6873. Srm = srmlistitem,
  6874. TaskCount = 0,
  6875. LocList = new List<string>()
  6876. });
  6877. }
  6878. }
  6879. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  6880. var srmtasktobetemplocs = new List<string>();
  6881. for (int i = 0; i < tempcount; i++)
  6882. {
  6883. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  6884. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  6885. foreach (var srmtasktobeitem in srmtasktobe)
  6886. {
  6887. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  6888. {
  6889. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  6890. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  6891. srmtasktobetemplocs.Add(first.Code);
  6892. break;
  6893. }
  6894. }
  6895. }
  6896. #endregion 按照堆垛机平均分配任务
  6897. var tempbuchong = new List<StockTemp>();
  6898. if (tempcount > srmtasktobetemplocs.Count())
  6899. {
  6900. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  6901. }
  6902. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count));
  6903. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist).Union(blackinvlist);
  6904. invlist2 = invlist2.Union(tempbuchong);
  6905. var finstocks = invlist2.ToList();
  6906. //最后验证数据
  6907. #region 最后验证数据
  6908. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  6909. {
  6910. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6911. continue;
  6912. }
  6913. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  6914. {
  6915. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6916. continue;
  6917. }
  6918. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  6919. {
  6920. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6921. continue;
  6922. }
  6923. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  6924. {
  6925. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", finstocks.Select(p => p.WbGroupCode).ToList(), invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6926. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  6927. continue;
  6928. }
  6929. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  6930. {
  6931. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6932. continue;
  6933. }
  6934. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  6935. {
  6936. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6937. continue;
  6938. }
  6939. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  6940. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  6941. {
  6942. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6943. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  6944. continue;
  6945. }
  6946. #endregion 最后验证数据
  6947. #region Mes箱号校验
  6948. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  6949. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  6950. var reqids = Guid.NewGuid().ToString();
  6951. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  6952. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  6953. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  6954. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  6955. if (mesresponse.success == false)
  6956. {
  6957. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6958. {
  6959. ZXStateCode = 2,
  6960. EditTime = DateTime.Now,
  6961. Memo = mesresponse.message
  6962. }, p => p.Id == rule.Id);
  6963. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  6964. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6965. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  6966. _logger.LogInformation(res.ResMsg);
  6967. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  6968. break;
  6969. }
  6970. else
  6971. {
  6972. try
  6973. {
  6974. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  6975. _db.BeginTran();
  6976. //非控制箱预占状态更新成4
  6977. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6978. {
  6979. ZXStateCode = 4,
  6980. EditTime = DateTime.Now,
  6981. Memo = mesresponse.message
  6982. }, p => p.Id == rule.Id);
  6983. var presign = rule.Id.ToString();
  6984. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6985. {
  6986. PreStock = presign,
  6987. EditTime = DateTime.Now,
  6988. Memo = "箱号预占用:" + rule.PBoxCode
  6989. }, p => listid.Contains(p.ContGrpId));
  6990. _db.CommitTran();
  6991. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  6992. }
  6993. catch (Exception ex)
  6994. {
  6995. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  6996. _db.RollbackTran();
  6997. }
  6998. return res;
  6999. }
  7000. #endregion Mes箱号校验
  7001. }
  7002. }
  7003. }
  7004. return res;
  7005. }
  7006. /// <summary>
  7007. /// 码垛SPC非控制装箱计算预占箱号-去掉黑盘和批次限制
  7008. /// </summary>
  7009. /// <param name="request"></param>
  7010. /// <returns></returns>
  7011. public SRes PalletizingSpcNotPackRulePre2(PalletizingPackStockOutRequest request)
  7012. {
  7013. var res = new SRes();
  7014. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  7015. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  7016. {
  7017. res.ResMsg = "预占箱数已经大于设置值";
  7018. return res;
  7019. }
  7020. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//超时时间配置
  7021. //获取库存列表
  7022. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7023. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.IsControlpanel == false && p.IsTorsChk == false) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && !p.ProductMachCode.Contains("R")
  7024. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  7025. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7026. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7027. on stock.InDocsNo equals rule1.DocsNo
  7028. select new StockTemp
  7029. {
  7030. MatCode = stock.MatCode,
  7031. InvBarCode = stock.InvBarCode,
  7032. Grade = stock.Grade,
  7033. InvStateCode = stock.InvStateCode,
  7034. ProductTime = stock.ProductTime,
  7035. WbGroupCode = stock.WbGroupCode,
  7036. IsTorsChk = stock.IsTorsChk,
  7037. TorsChkQty = stock.TorsChkQty,
  7038. TorsChkValue = stock.TorsChkValue,
  7039. HoldTime = stock.HoldTime,
  7040. ProductMachCode = stock.ProductMachCode,
  7041. IsControlpanel = stock.IsControlpanel,
  7042. HWTypeCode = stock.HWTypeCode,
  7043. SolderCount = stock.SolderCount,
  7044. IsRework = stock.IsRework,
  7045. IsBlack = stock.IsBlack,
  7046. Col = loc.Col,
  7047. Layer = loc.Layer,
  7048. Shelf = loc.Shelf,
  7049. Depth = loc.Depth,
  7050. Code = loc.Code,
  7051. Tunnel = loc.Tunnel,
  7052. SCRel = loc.SCRel,
  7053. Floor = loc.Floor,
  7054. WarehouseCode = loc.WarehouseCode,
  7055. ContGrpBarCode = loc.ContGrpBarCode,
  7056. ContGrpId = loc.ContGrpId,
  7057. Id = loc.Id,
  7058. StateNum = loc.StateNum,
  7059. SkuCode = rule1.SkuCode,
  7060. Wind = stock.Wind,
  7061. InDocsNo = stock.InDocsNo,
  7062. BatchNo = stock.BatchNo
  7063. };
  7064. var invlistchognrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7065. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.IsControlpanel == false && p.IsTorsChk == false) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.ProductMachCode.Contains("R")
  7066. && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7067. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7068. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7069. on stock.InDocsNo equals rule1.DocsNo
  7070. select new StockTemp
  7071. {
  7072. MatCode = stock.MatCode,
  7073. InvBarCode = stock.InvBarCode,
  7074. Grade = stock.Grade,
  7075. InvStateCode = stock.InvStateCode,
  7076. ProductTime = stock.ProductTime,
  7077. WbGroupCode = stock.WbGroupCode,
  7078. IsTorsChk = stock.IsTorsChk,
  7079. TorsChkQty = stock.TorsChkQty,
  7080. TorsChkValue = stock.TorsChkValue,
  7081. HoldTime = stock.HoldTime,
  7082. ProductMachCode = stock.ProductMachCode,
  7083. IsControlpanel = stock.IsControlpanel,
  7084. HWTypeCode = stock.HWTypeCode,
  7085. SolderCount = stock.SolderCount,
  7086. IsRework = stock.IsRework,
  7087. IsBlack = stock.IsBlack,
  7088. Col = loc.Col,
  7089. Layer = loc.Layer,
  7090. Shelf = loc.Shelf,
  7091. Depth = loc.Depth,
  7092. Code = loc.Code,
  7093. Tunnel = loc.Tunnel,
  7094. SCRel = loc.SCRel,
  7095. Floor = loc.Floor,
  7096. WarehouseCode = loc.WarehouseCode,
  7097. ContGrpBarCode = loc.ContGrpBarCode,
  7098. ContGrpId = loc.ContGrpId,
  7099. Id = loc.Id,
  7100. StateNum = loc.StateNum,
  7101. SkuCode = rule1.SkuCode,
  7102. Wind = stock.Wind,
  7103. InDocsNo = stock.InDocsNo,
  7104. BatchNo = stock.BatchNo
  7105. };
  7106. //查找满足时效但是没有全部检测完成的盘所在的机器组
  7107. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7108. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && string.IsNullOrEmpty(p.PreStock) && !p.ProductMachCode.Contains("R")
  7109. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  7110. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7111. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7112. on stock.InDocsNo equals rule1.DocsNo
  7113. select new StockTemp
  7114. {
  7115. MatCode = stock.MatCode,
  7116. InvBarCode = stock.InvBarCode,
  7117. Grade = stock.Grade,
  7118. InvStateCode = stock.InvStateCode,
  7119. ProductTime = stock.ProductTime,
  7120. WbGroupCode = stock.WbGroupCode,
  7121. IsTorsChk = stock.IsTorsChk,
  7122. TorsChkQty = stock.TorsChkQty,
  7123. TorsChkValue = stock.TorsChkValue,
  7124. HoldTime = stock.HoldTime,
  7125. ProductMachCode = stock.ProductMachCode,
  7126. IsControlpanel = stock.IsControlpanel,
  7127. HWTypeCode = stock.HWTypeCode,
  7128. SolderCount = stock.SolderCount,
  7129. IsRework = stock.IsRework,
  7130. IsBlack = stock.IsBlack,
  7131. Col = loc.Col,
  7132. Layer = loc.Layer,
  7133. Shelf = loc.Shelf,
  7134. Depth = loc.Depth,
  7135. Code = loc.Code,
  7136. Tunnel = loc.Tunnel,
  7137. SCRel = loc.SCRel,
  7138. Floor = loc.Floor,
  7139. WarehouseCode = loc.WarehouseCode,
  7140. ContGrpBarCode = loc.ContGrpBarCode,
  7141. ContGrpId = loc.ContGrpId,
  7142. Id = loc.Id,
  7143. StateNum = loc.StateNum,
  7144. SkuCode = rule1.SkuCode,
  7145. Wind = stock.Wind,
  7146. InDocsNo = stock.InDocsNo,
  7147. BatchNo = stock.BatchNo
  7148. };
  7149. var invlistTorschongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7150. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && string.IsNullOrEmpty(p.PreStock) && p.ProductMachCode.Contains("R")
  7151. && p.ContUsageQty <= 0 && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7152. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7153. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7154. on stock.InDocsNo equals rule1.DocsNo
  7155. select new StockTemp
  7156. {
  7157. MatCode = stock.MatCode,
  7158. InvBarCode = stock.InvBarCode,
  7159. Grade = stock.Grade,
  7160. InvStateCode = stock.InvStateCode,
  7161. ProductTime = stock.ProductTime,
  7162. WbGroupCode = stock.WbGroupCode,
  7163. IsTorsChk = stock.IsTorsChk,
  7164. TorsChkQty = stock.TorsChkQty,
  7165. TorsChkValue = stock.TorsChkValue,
  7166. HoldTime = stock.HoldTime,
  7167. ProductMachCode = stock.ProductMachCode,
  7168. IsControlpanel = stock.IsControlpanel,
  7169. HWTypeCode = stock.HWTypeCode,
  7170. SolderCount = stock.SolderCount,
  7171. IsRework = stock.IsRework,
  7172. IsBlack = stock.IsBlack,
  7173. Col = loc.Col,
  7174. Layer = loc.Layer,
  7175. Shelf = loc.Shelf,
  7176. Depth = loc.Depth,
  7177. Code = loc.Code,
  7178. Tunnel = loc.Tunnel,
  7179. SCRel = loc.SCRel,
  7180. Floor = loc.Floor,
  7181. WarehouseCode = loc.WarehouseCode,
  7182. ContGrpBarCode = loc.ContGrpBarCode,
  7183. ContGrpId = loc.ContGrpId,
  7184. Id = loc.Id,
  7185. StateNum = loc.StateNum,
  7186. SkuCode = rule1.SkuCode,
  7187. Wind = stock.Wind,
  7188. InDocsNo = stock.InDocsNo,
  7189. BatchNo = stock.BatchNo
  7190. };
  7191. invlist = invlist.Union(invlistchognrao);
  7192. invlist = invlist.Union(invlistTors);
  7193. invlist = invlist.Union(invlistTorschongrao);
  7194. if (!invlist.Any())
  7195. {
  7196. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  7197. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7198. res.ResMsg = "库存不足";
  7199. return res;
  7200. }
  7201. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  7202. invlist = invlist.Distinct(new CompareStock());
  7203. //禁用巷道过滤
  7204. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  7205. if (tunlist.Any())
  7206. {
  7207. if (tunlist.Where(p => p.Default2 == "1").Any())
  7208. {
  7209. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7210. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7211. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  7212. }
  7213. if (tunlist.Where(p => p.Default2 == "2").Any())
  7214. {
  7215. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7216. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7217. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  7218. }
  7219. if (tunlist.Where(p => p.Default2 == "3").Any())
  7220. {
  7221. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7222. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7223. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  7224. }
  7225. }
  7226. if (!invlist.Any())
  7227. {
  7228. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  7229. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7230. res.ResMsg = "禁用巷道后 | 库存不足";
  7231. return res;
  7232. }
  7233. var invlist2 = invlist;
  7234. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  7235. if (!sku.Any())
  7236. {
  7237. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  7238. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7239. res.ResMsg = "库中没有SKU或SKU不能为空";
  7240. return res;
  7241. }
  7242. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36));
  7243. if (!rulelist.Any())
  7244. {
  7245. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  7246. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  7247. _logger.LogInformation("非控制不满足装箱:" + msg);
  7248. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  7249. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  7250. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  7251. return res;
  7252. }
  7253. //SKU循环
  7254. foreach (var item in sku)
  7255. {
  7256. //满足sku下的箱号列表
  7257. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.PackRule == "SPC" && p.ZXStateCode == 0 && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36)).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  7258. if (!rules.Any())
  7259. {
  7260. string msg = "SKU:" + item.Key + ",没有可用箱号";
  7261. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  7262. _logger.LogInformation("非控制不满足装箱:" + msg);
  7263. res.ResMsg = msg;
  7264. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,SKU:" + item.Key + ",单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  7265. continue;
  7266. }
  7267. var rulegroup = rules.GroupBy(p => new
  7268. {
  7269. p.Wind,
  7270. p.SpoolType,
  7271. p.FullCountQty
  7272. }).ToList();
  7273. //绕向、工字轮循环
  7274. foreach (var rulestem in rulegroup)
  7275. {
  7276. // 满足sku、绕向、工字轮规格、满箱个数的箱号列表
  7277. var rule = rules.Where(p => p.SkuCode == item.Key && p.SpoolType == rulestem.Key.SpoolType && p.Wind == rulestem.Key.Wind && p.FullCountQty == rulestem.Key.FullCountQty).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode).FirstOrDefault();
  7278. //拆盘机配置,可用于禁用拆盘机
  7279. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  7280. List<string> equips = new List<string>();
  7281. foreach (var pp in sys)
  7282. {
  7283. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  7284. {
  7285. equips.Add(pp.Code);
  7286. }
  7287. }
  7288. if (!equips.Any())
  7289. {
  7290. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  7291. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  7292. //自动更新子托盘配置,不需要手动配置
  7293. foreach (var item1 in sys)
  7294. {
  7295. if (!item1.SContent.Contains(rule.TrayCode))
  7296. {
  7297. string con = item1.SContent + "," + rule.TrayCode;
  7298. _sysconfigrepository.AsUpdateable()
  7299. .SetColumns(p => new sxSysConfig() { SContent = con })
  7300. .Where(p => p.Id == item1.Id)
  7301. .ExecuteCommand();
  7302. }
  7303. }
  7304. continue;
  7305. }
  7306. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  7307. if (!wbgrouplist.Any())
  7308. {
  7309. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  7310. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  7311. continue;
  7312. }
  7313. #region 重绕盘老规则
  7314. //找到重绕盘,拼接进去,重绕盘不需要扭转
  7315. //var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7316. // join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.InDocsNo.StartsWith("CHA")) && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  7317. // && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7318. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7319. // where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  7320. // select new StockTemp
  7321. // {
  7322. // MatCode = stock.MatCode,
  7323. // InvBarCode = stock.InvBarCode,
  7324. // Grade = stock.Grade,
  7325. // InvStateCode = stock.InvStateCode,
  7326. // ProductTime = stock.ProductTime,
  7327. // WbGroupCode = stock.WbGroupCode,
  7328. // IsTorsChk = stock.IsTorsChk,
  7329. // TorsChkQty = stock.TorsChkQty,
  7330. // TorsChkValue = stock.TorsChkValue,
  7331. // HoldTime = stock.HoldTime,
  7332. // InDocsNo = stock.InDocsNo,
  7333. // ProductMachCode = stock.ProductMachCode,
  7334. // IsControlpanel = stock.IsControlpanel,
  7335. // HWTypeCode = stock.HWTypeCode,
  7336. // SolderCount = stock.SolderCount,
  7337. // IsRework = stock.IsRework,
  7338. // IsBlack = stock.IsBlack,
  7339. // Col = loc.Col,
  7340. // Layer = loc.Layer,
  7341. // Shelf = loc.Shelf,
  7342. // Depth = loc.Depth,
  7343. // Code = loc.Code,
  7344. // Tunnel = loc.Tunnel,
  7345. // SCRel = loc.SCRel,
  7346. // Floor = loc.Floor,
  7347. // WarehouseCode = loc.WarehouseCode,
  7348. // ContGrpBarCode = loc.ContGrpBarCode,
  7349. // ContGrpId = loc.ContGrpId,
  7350. // Id = loc.Id,
  7351. // StateNum = loc.StateNum,
  7352. // SkuCode = "",
  7353. // Wind = stock.Wind
  7354. // };
  7355. //过滤重饶盘被禁用的巷道
  7356. //invlistchongrao = invlistchongrao.Distinct();
  7357. //if (tunlist.Any())
  7358. //{
  7359. // if (tunlist.Where(p => p.Default2 == "1").Any())
  7360. // {
  7361. // var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7362. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7363. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  7364. // }
  7365. // if (tunlist.Where(p => p.Default2 == "2").Any())
  7366. // {
  7367. // var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7368. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7369. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  7370. // }
  7371. // if (tunlist.Where(p => p.Default2 == "3").Any())
  7372. // {
  7373. // var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7374. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7375. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  7376. // }
  7377. //}
  7378. //重绕盘数量限制BS80 10个(30%);BS60 21个(30%);BS40 21个(30%)
  7379. //if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  7380. //{
  7381. // invlistchongrao = invlistchongrao.Take(21);
  7382. //}
  7383. //else
  7384. //{
  7385. // invlistchongrao = invlistchongrao.Take(10);
  7386. //}
  7387. #endregion 重绕盘老规则
  7388. ;
  7389. //机器组循环
  7390. foreach (var wbgroup in wbgrouplist)
  7391. {
  7392. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  7393. //invlist2 = invlistchongrao.Union(invlist2);
  7394. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  7395. {
  7396. }
  7397. else
  7398. {
  7399. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  7400. continue;
  7401. }
  7402. if (!string.IsNullOrEmpty(rule.SpoolType))
  7403. {
  7404. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  7405. }
  7406. if (!string.IsNullOrEmpty(rule.Wind))
  7407. {
  7408. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  7409. }
  7410. //焊点属性筛选
  7411. var tempoutrecord = invlist2.ToList();
  7412. var solderinvlist = new List<StockTemp>();
  7413. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  7414. {
  7415. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  7416. var solcount = rulemaxcount;
  7417. if (solcount <= 0)
  7418. {
  7419. solcount = 0;
  7420. };
  7421. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  7422. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  7423. }
  7424. else
  7425. {
  7426. //不允许焊点盘
  7427. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  7428. }
  7429. var returninvlist = new List<StockTemp>();
  7430. if (rule.ReturnCount > 0)
  7431. {
  7432. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  7433. invlist2 = invlist2.Where(p => p.IsRework == false);
  7434. }
  7435. else
  7436. {
  7437. invlist2 = invlist2.Where(p => p.IsRework == false);
  7438. }
  7439. if (!invlist2.Any())
  7440. {
  7441. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  7442. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  7443. _logger.LogInformation("非控制不满足装箱:" + msg);
  7444. res.ResMsg = msg;
  7445. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  7446. continue;
  7447. }
  7448. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count) < rule.FullCountQty)
  7449. {
  7450. string msg = "sku:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + invlist2.First().HWTypeCode + ",SPC非控制箱不满足装箱数量,需要装" + rule.FullCountQty + "实际数量:" + (invlist2.Count() + solderinvlist.Count + returninvlist.Count) + ";普通盘" + invlist2.Count() + ",焊点盘" + solderinvlist.Count + ",返工盘" + returninvlist.Count;
  7451. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  7452. _logger.LogInformation("非控制不满足装箱:" + msg);
  7453. res.ResMsg = msg;
  7454. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  7455. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  7456. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  7457. continue;
  7458. }
  7459. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  7460. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 72); //72小时之内的按堆垛机平均分
  7461. #region 按照堆垛机平均分配任务,6小时之内
  7462. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count);//符合条件的普通盘数量
  7463. var mastinvlist = solderinvlist.Union(returninvlist);
  7464. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  7465. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  7466. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  7467. select new SrmTaskTmep
  7468. {
  7469. Srm = x.Key,
  7470. TaskCount = x.Count(),
  7471. LocList = x.Select(q => q.Code).ToList()
  7472. };
  7473. var srmtasktobe = new List<SrmTaskTmep>();
  7474. foreach (var srmlistitem in srmlist)
  7475. {
  7476. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  7477. {
  7478. srmtasktobe.Add(new SrmTaskTmep()
  7479. {
  7480. Srm = srmlistitem,
  7481. TaskCount = 0,
  7482. LocList = new List<string>()
  7483. });
  7484. }
  7485. }
  7486. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  7487. var srmtasktobetemplocs = new List<string>();
  7488. for (int i = 0; i < tempcount; i++)
  7489. {
  7490. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  7491. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  7492. foreach (var srmtasktobeitem in srmtasktobe)
  7493. {
  7494. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  7495. {
  7496. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  7497. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  7498. srmtasktobetemplocs.Add(first.Code);
  7499. break;
  7500. }
  7501. }
  7502. }
  7503. #endregion 按照堆垛机平均分配任务,6小时之内
  7504. var tempbuchong = new List<StockTemp>();
  7505. if (tempcount > srmtasktobetemplocs.Count())
  7506. {
  7507. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  7508. }
  7509. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count));
  7510. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist);
  7511. invlist2 = invlist2.Union(tempbuchong);
  7512. var finstocks = invlist2.ToList();
  7513. //最后验证数据
  7514. #region 最后验证数据
  7515. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  7516. {
  7517. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7518. continue;
  7519. }
  7520. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  7521. {
  7522. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7523. continue;
  7524. }
  7525. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  7526. {
  7527. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7528. continue;
  7529. }
  7530. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  7531. {
  7532. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7533. continue;
  7534. }
  7535. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  7536. {
  7537. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7538. continue;
  7539. }
  7540. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  7541. {
  7542. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7543. continue;
  7544. }
  7545. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  7546. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  7547. {
  7548. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7549. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  7550. continue;
  7551. }
  7552. #endregion 最后验证数据
  7553. #region Mes箱号校验
  7554. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  7555. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  7556. var reqids = Guid.NewGuid().ToString();
  7557. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  7558. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  7559. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  7560. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  7561. if (mesresponse.success == false)
  7562. {
  7563. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  7564. {
  7565. ZXStateCode = 2,
  7566. EditTime = DateTime.Now,
  7567. Memo = mesresponse.message
  7568. }, p => p.Id == rule.Id);
  7569. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  7570. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  7571. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  7572. _logger.LogInformation(res.ResMsg);
  7573. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  7574. break;
  7575. }
  7576. else
  7577. {
  7578. try
  7579. {
  7580. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  7581. _db.BeginTran();
  7582. //非控制箱预占状态更新成4
  7583. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  7584. {
  7585. ZXStateCode = 4,
  7586. EditTime = DateTime.Now,
  7587. Memo = mesresponse.message
  7588. }, p => p.Id == rule.Id);
  7589. var presign = rule.Id.ToString();
  7590. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  7591. {
  7592. PreStock = presign,
  7593. EditTime = DateTime.Now,
  7594. Memo = "箱号预占用:" + rule.PBoxCode
  7595. }, p => listid.Contains(p.ContGrpId));
  7596. _db.CommitTran();
  7597. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  7598. }
  7599. catch (Exception ex)
  7600. {
  7601. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  7602. _db.RollbackTran();
  7603. }
  7604. return res;
  7605. }
  7606. #endregion Mes箱号校验
  7607. }
  7608. }
  7609. }
  7610. return res;
  7611. }
  7612. /// <summary>
  7613. /// 码垛SPC控制装箱(缓存底托)
  7614. /// </summary>
  7615. /// <param name="request"></param>
  7616. /// <returns></returns>
  7617. public SRes PalletizingSpcPackStockOut2(PalletizingPackStockOutRequest request)
  7618. {
  7619. var res = new SRes();
  7620. var timesign = IdFactory.NewId();
  7621. _logger.LogInformation("控制计时埋点1" + timesign);
  7622. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  7623. if (palletlist.Any())
  7624. {
  7625. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  7626. if (maxtaskStemp.Any())
  7627. {
  7628. var maxtaskcount = (from tas in maxtaskStemp
  7629. select new TunnelCountTemp()
  7630. {
  7631. Tunnel = tas.Key,
  7632. Count = tas.Count()
  7633. }).ToList();
  7634. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  7635. }
  7636. //箱之间状态卡控限制标识
  7637. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  7638. //某个机械手最大下发的限制状态任务数量
  7639. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  7640. foreach (var item in palletlist)
  7641. {
  7642. //判断任务数量
  7643. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  7644. {
  7645. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  7646. continue;
  7647. }
  7648. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  7649. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  7650. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  7651. {
  7652. //判断是否是第三箱
  7653. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  7654. {
  7655. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  7656. if (item.Id == thirdbox)//第3箱子
  7657. {
  7658. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  7659. {
  7660. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  7661. continue;
  7662. }
  7663. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  7664. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  7665. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  7666. {
  7667. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  7668. continue;
  7669. }
  7670. }
  7671. else if (item.Id > thirdbox)
  7672. {
  7673. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  7674. continue;
  7675. }
  7676. }
  7677. }
  7678. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  7679. if (equips == null)
  7680. {
  7681. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut2", new RedisErrorInfo() { Equip = "ControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  7682. continue;
  7683. }
  7684. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  7685. if (!palletMach.Any())
  7686. {
  7687. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut3", new RedisErrorInfo() { Equip = "ControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  7688. continue;
  7689. }
  7690. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  7691. var curdocid = maxdocid + 1;
  7692. if (palletMach.Any())
  7693. {
  7694. var pid = palletMach.First().PalletizingId;
  7695. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  7696. {
  7697. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  7698. }
  7699. }
  7700. foreach (var pallets in palletMach)
  7701. {
  7702. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7703. if (cell == null)
  7704. {
  7705. continue;
  7706. }
  7707. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7708. if (invs == null)
  7709. {
  7710. continue;
  7711. }
  7712. var root = DetermineRoot(pallets.Palletequip);
  7713. //先判断二升位是否能出库
  7714. if (cell.Depth == 2)
  7715. {
  7716. var respon = MoveTask(cell.Code);
  7717. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7718. {
  7719. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7720. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态," + respon.ResMsg);
  7721. continue;
  7722. }
  7723. }
  7724. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7725. {
  7726. Code = pallets.ContBarCode,
  7727. CellCode = cell.Code,
  7728. Srm = cell.SCRel,
  7729. Tunnel = cell.Tunnel.ToString(),
  7730. Floor = cell.Floor,
  7731. Grade = invs.Grade,
  7732. Mater = invs.MatCode,
  7733. SkuCode = pallets.SkuCode,
  7734. PalletLayer = 0,
  7735. ProductMachCode = invs.ProductMachCode,
  7736. Equip = item.Equip,
  7737. PalletizingId = item.Id,
  7738. Robot = root,
  7739. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  7740. DocId = curdocid
  7741. });
  7742. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7743. {
  7744. _logger.LogInformation(cell.Code + "下发装箱任务失败," + taskresponse.ResMsg);
  7745. continue;
  7746. }
  7747. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7748. {
  7749. Istask = 1,
  7750. Layer = 0
  7751. }, p => p.ContBarCode == invs.ContGrpBarCode);
  7752. }
  7753. //下完任务后将标识值加1
  7754. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  7755. taskflag = taskflag + 1;
  7756. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  7757. #region 分层下任务暂时不用
  7758. //if (tasklayer != 12 && tasklayer < 12)
  7759. //{
  7760. // palletMach = palletMach.Take(12 - tasklayer);
  7761. // foreach (var pallets in palletMach)
  7762. // {
  7763. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7764. // if (cell == null)
  7765. // {
  7766. // continue;
  7767. // }
  7768. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7769. // if (invs == null)
  7770. // {
  7771. // continue;
  7772. // }
  7773. // var root = "";
  7774. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  7775. // {
  7776. // root = "Robot1";
  7777. // }
  7778. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  7779. // {
  7780. // root = "Robot2";
  7781. // }
  7782. // //先判断二升位是否能出库
  7783. // if (cell.Depth == 2)
  7784. // {
  7785. // var respon = MoveTask(cell.Code);
  7786. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7787. // {
  7788. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7789. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  7790. // continue;
  7791. // }
  7792. // }
  7793. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7794. // {
  7795. // Code = pallets.ContBarCode,
  7796. // CellCode = cell.Code,
  7797. // Srm = cell.SCRel,
  7798. // Tunnel = cell.Tunnel.ToString(),
  7799. // Floor = cell.Floor,
  7800. // Grade = invs.Grade,
  7801. // Mater = invs.MatCode,
  7802. // SkuCode = pallets.SkuCode,
  7803. // PalletLayer = curlayer,
  7804. // ProductMachCode = invs.ProductMachCode,
  7805. // Equip = item.Equip,
  7806. // PalletizingId = item.Id,
  7807. // Robot = root,
  7808. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  7809. // });
  7810. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7811. // {
  7812. // continue;
  7813. // }
  7814. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7815. // {
  7816. // Istask = 1,
  7817. // Layer = curlayer
  7818. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  7819. // }
  7820. // //return res;
  7821. //}
  7822. //else
  7823. //{
  7824. // foreach (var pallets in palletMach)
  7825. // {
  7826. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7827. // if (cell == null)
  7828. // {
  7829. // continue;
  7830. // }
  7831. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7832. // if (invs == null)
  7833. // {
  7834. // continue;
  7835. // }
  7836. // var root = "";
  7837. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  7838. // {
  7839. // root = "Robot1";
  7840. // }
  7841. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  7842. // {
  7843. // root = "Robot2";
  7844. // }
  7845. // //先判断二升位是否能出库
  7846. // if (cell.Depth == 2)
  7847. // {
  7848. // var respon = MoveTask(cell.Code);
  7849. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7850. // {
  7851. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7852. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  7853. // continue;
  7854. // }
  7855. // }
  7856. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7857. // {
  7858. // Code = pallets.ContBarCode,
  7859. // CellCode = cell.Code,
  7860. // Srm = cell.SCRel,
  7861. // Tunnel = cell.Tunnel.ToString(),
  7862. // Floor = cell.Floor,
  7863. // Grade = invs.Grade,
  7864. // Mater = invs.MatCode,
  7865. // SkuCode = pallets.SkuCode,
  7866. // PalletLayer = curlayer + 1,
  7867. // ProductMachCode = invs.ProductMachCode,
  7868. // Equip = item.Equip,
  7869. // PalletizingId = item.Id,
  7870. // Robot = root,
  7871. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  7872. // });
  7873. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7874. // {
  7875. // continue;
  7876. // }
  7877. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7878. // {
  7879. // Istask = 1,
  7880. // Layer = curlayer + 1
  7881. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  7882. // }
  7883. // //return res;
  7884. //}
  7885. #endregion 分层下任务暂时不用
  7886. }
  7887. }
  7888. _logger.LogInformation("控制计时埋点2" + timesign);
  7889. //待码垛箱任务下发
  7890. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  7891. if (palletlisttobe.Any())
  7892. {
  7893. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  7894. {
  7895. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  7896. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  7897. {
  7898. _palletizrepository.AsUpdateable()
  7899. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  7900. .Where(p => p.Id == item.Id)
  7901. .ExecuteCommand();
  7902. }
  7903. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  7904. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  7905. {
  7906. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  7907. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  7908. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  7909. {
  7910. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  7911. continue;
  7912. }
  7913. //箱之间状态卡控限制标识
  7914. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  7915. //判断任务数量
  7916. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  7917. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  7918. {
  7919. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  7920. continue;
  7921. }
  7922. if (!_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any()) //&& !_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => mdtempequiplist.Contains(p.PalletizingId) && p.Status < taskstatus).Any()
  7923. {
  7924. //判断是否是第三箱
  7925. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  7926. {
  7927. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  7928. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  7929. if (item.Id == thirdbox)//第3箱子
  7930. {
  7931. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  7932. {
  7933. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  7934. continue;
  7935. }
  7936. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  7937. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  7938. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  7939. {
  7940. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  7941. continue;
  7942. }
  7943. }
  7944. else if (item.Id > thirdbox)
  7945. {
  7946. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  7947. continue;
  7948. }
  7949. }
  7950. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  7951. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)//先控制只多下发一层1个任务
  7952. {
  7953. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  7954. if (!palletMach.Any())
  7955. {
  7956. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  7957. continue;
  7958. }
  7959. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  7960. var curdocid = maxdocid + 1;
  7961. if (palletMach.Any())
  7962. {
  7963. var pid = palletMach.First().PalletizingId;
  7964. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  7965. {
  7966. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  7967. }
  7968. }
  7969. foreach (var pallets in palletMach)
  7970. {
  7971. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7972. if (cell == null)
  7973. {
  7974. continue;
  7975. }
  7976. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7977. if (invs == null)
  7978. {
  7979. continue;
  7980. }
  7981. var root = DetermineRoot(pallets.Palletequip);
  7982. //先判断二升位是否能出库
  7983. if (cell.Depth == 2)
  7984. {
  7985. var respon = MoveTask(cell.Code);
  7986. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7987. {
  7988. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7989. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  7990. continue;
  7991. }
  7992. }
  7993. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7994. {
  7995. Code = pallets.ContBarCode,
  7996. CellCode = cell.Code,
  7997. Srm = cell.SCRel,
  7998. Tunnel = cell.Tunnel.ToString(),
  7999. Floor = cell.Floor,
  8000. Grade = invs.Grade,
  8001. Mater = invs.MatCode,
  8002. SkuCode = pallets.SkuCode,
  8003. PalletLayer = 0,
  8004. ProductMachCode = invs.ProductMachCode,
  8005. Equip = item.Equip,
  8006. PalletizingId = item.Id,
  8007. Robot = root,
  8008. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  8009. DocId = curdocid
  8010. });
  8011. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8012. {
  8013. continue;
  8014. }
  8015. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8016. {
  8017. Istask = 1,
  8018. Layer = 0
  8019. }, p => p.ContBarCode == invs.ContGrpBarCode);
  8020. }
  8021. //下完任务后将标识值加1
  8022. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  8023. taskflag = taskflag + 1;
  8024. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  8025. }
  8026. }
  8027. }
  8028. else
  8029. {
  8030. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  8031. //{
  8032. // PalletizState = 0
  8033. //}, p => p.Id == item.Id);
  8034. _palletizrepository.AsUpdateable()
  8035. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  8036. .Where(p => p.Id == item.Id)
  8037. .ExecuteCommand();
  8038. }
  8039. }
  8040. }
  8041. _logger.LogInformation("控制计时埋点3" + timesign);
  8042. //取视图码垛设备号
  8043. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  8044. var iscontinue = false;
  8045. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))//一个码垛位只能有一个进行中搬运任务,Memo标识
  8046. {
  8047. if (string.IsNullOrEmpty(palletequip.Default1))
  8048. {
  8049. if (!string.IsNullOrEmpty(palletequip.Default3))
  8050. {
  8051. //机械手交叉下任务需求
  8052. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  8053. //{
  8054. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  8055. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p=>p.TaskFlag).First();
  8056. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8057. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8058. // {
  8059. // }
  8060. // else
  8061. // {
  8062. // iscontinue = false;
  8063. // continue;
  8064. // }
  8065. //}
  8066. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  8067. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  8068. {
  8069. //如果较小的工位已经没有任务那么,则继续下该工位任务
  8070. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  8071. if (minequ != null)
  8072. {
  8073. if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8074. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8075. {
  8076. }
  8077. else
  8078. {
  8079. iscontinue = false;
  8080. continue;
  8081. }
  8082. }
  8083. }
  8084. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  8085. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8086. if (preinvlist.Any())
  8087. {
  8088. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  8089. {
  8090. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8091. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  8092. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  8093. return res;
  8094. }
  8095. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  8096. //码垛信息校验
  8097. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  8098. {
  8099. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8100. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  8101. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  8102. return res;
  8103. }
  8104. var root = DetermineRoot(palletequip.Code);
  8105. var pallet = new Palletizing()
  8106. {
  8107. PalletMax = rule.FullCountQty,
  8108. PalletizState = 0,
  8109. Equip = palletequip.Code,
  8110. Finish = 0,
  8111. AddWho = "",
  8112. EditWho = "",
  8113. BoxRule = rule.PackRule,
  8114. BoxRuleId = rule.Id,
  8115. IsControlpanel = true,
  8116. TaskNum = int.Parse(palletequip.Default3),
  8117. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  8118. Robot = root
  8119. };
  8120. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8121. if (pallects.Id == 0)
  8122. {
  8123. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8124. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  8125. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  8126. return res;
  8127. }
  8128. var palletizId = pallects.Id;
  8129. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  8130. {
  8131. ZXStateCode = 1
  8132. }, p => p.Id == rule.Id);
  8133. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8134. foreach (var invs in preinvlist)
  8135. {
  8136. var palletlayer = new PalletLayerMath()
  8137. {
  8138. PalletizingId = palletizId,
  8139. ContGrpId = (long)invs.ContGrpId,
  8140. ContBarCode = invs.ContGrpBarCode,
  8141. Layer = 0,
  8142. SkuCode = rule.SkuCode,
  8143. Finish = 0,
  8144. PboxruleId = rule.Id,
  8145. Istask = 0,
  8146. Palletequip = palletequip.Code,
  8147. Depth = invs.Depth,
  8148. IsBlack = invs.IsBlack,
  8149. SolderCount = invs.SolderCount,
  8150. BoxCode = rule.PBoxCode,
  8151. Wbgroup = invs.WbGroupCode,
  8152. StockDonse = invs.InDocsNo,
  8153. BoxDonse = rule.DocsNo
  8154. };
  8155. math.Add(palletlayer);
  8156. }
  8157. _palletlayerMathrepository.InsertRange(math);
  8158. //把库存预锁标志更新掉
  8159. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8160. {
  8161. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  8162. BomMatCode = "",
  8163. PreStock = "1"
  8164. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  8165. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  8166. res.ResMsg = "控制捞取预锁库存处理成功";
  8167. return res;
  8168. }
  8169. else
  8170. {
  8171. iscontinue = false;
  8172. continue;
  8173. }
  8174. }
  8175. if (string.IsNullOrEmpty(palletequip.Cache1State))
  8176. {
  8177. iscontinue = true;
  8178. break;
  8179. }
  8180. else
  8181. {
  8182. iscontinue = false;
  8183. continue;
  8184. }
  8185. }
  8186. else
  8187. {
  8188. if (!string.IsNullOrEmpty(palletequip.Default3))
  8189. {
  8190. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  8191. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8192. if (preinvlist.Any())
  8193. {
  8194. //机械手交叉下任务需求
  8195. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  8196. //{
  8197. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  8198. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  8199. // if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8200. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8201. // {
  8202. // }
  8203. // else
  8204. // {
  8205. // iscontinue = false;
  8206. // continue;
  8207. // }
  8208. //}
  8209. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  8210. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  8211. {
  8212. //如果较小的工位已经没有任务那么,则继续下该工位任务
  8213. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  8214. if (minequ != null)
  8215. {
  8216. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8217. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8218. {
  8219. }
  8220. else
  8221. {
  8222. iscontinue = false;
  8223. continue;
  8224. }
  8225. }
  8226. }
  8227. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  8228. {
  8229. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8230. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  8231. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  8232. return res;
  8233. }
  8234. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  8235. //码垛信息校验
  8236. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  8237. {
  8238. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8239. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  8240. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  8241. return res;
  8242. }
  8243. var root = DetermineRoot(palletequip.Code);
  8244. var pallet = new Palletizing()
  8245. {
  8246. PalletMax = rule.FullCountQty,
  8247. PalletizState = 2,
  8248. Equip = palletequip.Code,
  8249. Finish = 0,
  8250. AddWho = "",
  8251. EditWho = "",
  8252. BoxRule = rule.PackRule,
  8253. BoxRuleId = rule.Id,
  8254. IsControlpanel = true,
  8255. TaskNum = int.Parse(palletequip.Default3),
  8256. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  8257. Robot = root
  8258. };
  8259. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8260. if (pallects.Id == 0)
  8261. {
  8262. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8263. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  8264. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  8265. return res;
  8266. }
  8267. var palletizId = pallects.Id;
  8268. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  8269. {
  8270. ZXStateCode = 1
  8271. }, p => p.Id == rule.Id);
  8272. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8273. foreach (var invs in preinvlist)
  8274. {
  8275. var palletlayer = new PalletLayerMath()
  8276. {
  8277. PalletizingId = palletizId,
  8278. ContGrpId = (long)invs.ContGrpId,
  8279. ContBarCode = invs.ContGrpBarCode,
  8280. Layer = 0,
  8281. SkuCode = rule.SkuCode,
  8282. Finish = 0,
  8283. PboxruleId = rule.Id,
  8284. Istask = 0,
  8285. Palletequip = palletequip.Code,
  8286. Depth = invs.Depth,
  8287. IsBlack = invs.IsBlack,
  8288. SolderCount = invs.SolderCount,
  8289. BoxCode = rule.PBoxCode,
  8290. Wbgroup = invs.WbGroupCode,
  8291. StockDonse = invs.InDocsNo,
  8292. BoxDonse = rule.DocsNo
  8293. };
  8294. math.Add(palletlayer);
  8295. }
  8296. _palletlayerMathrepository.InsertRange(math);
  8297. //把库存预锁标志更新掉
  8298. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8299. {
  8300. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  8301. BomMatCode = "",
  8302. PreStock = "1"
  8303. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  8304. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  8305. res.ResMsg = "非控制捞取预锁库存处理成功";
  8306. return res;
  8307. }
  8308. else
  8309. {
  8310. iscontinue = false;
  8311. continue;
  8312. }
  8313. }
  8314. else
  8315. {
  8316. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  8317. {
  8318. iscontinue = true;
  8319. break;
  8320. }
  8321. else
  8322. {
  8323. iscontinue = false;
  8324. continue;
  8325. }
  8326. }
  8327. }
  8328. }
  8329. _logger.LogInformation("控制计时埋点4" + timesign);
  8330. if (!iscontinue)
  8331. {
  8332. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  8333. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  8334. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  8335. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  8336. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  8337. {
  8338. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  8339. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8340. res.ResMsg = "没有空闲的码垛工位";
  8341. return res;
  8342. }
  8343. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  8344. {
  8345. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  8346. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8347. res.ResMsg = "没有空闲的码垛工位";
  8348. return res;
  8349. }
  8350. }
  8351. _logger.LogInformation("控制计时埋点5" + timesign);
  8352. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  8353. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  8354. if (!devices.Where(p => p.pH_STATUS == true).Any())
  8355. {
  8356. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut5", new RedisErrorInfo() { Equip = "ControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  8357. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8358. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  8359. return res;
  8360. }
  8361. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  8362. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//过期时间
  8363. var time1 = decimal.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TorsChkDateCount").SContent);//扭转检测时效允许时间间隔(小时)
  8364. _logger.LogInformation("控制计时埋点6" + timesign);
  8365. //查找满足时效但是没有全部检测完成的盘所在的机器组
  8366. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8367. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && p.Ovced == 0 && string.IsNullOrEmpty(p.PreStock)
  8368. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8369. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8370. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8371. on stock.InDocsNo equals rule1.DocsNo
  8372. select new
  8373. {
  8374. stock.MatCode,
  8375. stock.InvBarCode,
  8376. stock.Grade,
  8377. stock.InvStateCode,
  8378. stock.ProductTime,
  8379. stock.WbGroupCode,
  8380. stock.IsTorsChk,
  8381. stock.TorsChkQty,
  8382. stock.TorsChkValue,
  8383. stock.TorsChkChord,
  8384. stock.TorsChkFlatness,
  8385. stock.HoldTime,
  8386. stock.ProductMachCode,
  8387. stock.IsControlpanel,
  8388. stock.HWTypeCode,
  8389. stock.IsBlack,
  8390. stock.SolderCount,
  8391. stock.IsRework,
  8392. loc.Col,
  8393. loc.Layer,
  8394. loc.Shelf,
  8395. loc.Depth,
  8396. loc.Code,
  8397. loc.Tunnel,
  8398. loc.SCRel,
  8399. loc.Floor,
  8400. loc.WarehouseCode,
  8401. loc.ContGrpBarCode,
  8402. loc.ContGrpId,
  8403. loc.Id,
  8404. loc.StateNum,
  8405. rule1.SkuCode,
  8406. stock.Wind,
  8407. stock.InDocsNo
  8408. };
  8409. //if (templist.Any())
  8410. //{
  8411. // invlist = invlist.Where(p => !templist.Distinct().Contains(p.WbGroupCode));
  8412. //}
  8413. //invlist = invlist.Where(p => p.WbGroupCode == "C15" && p.Wind == "L" && p.SkuCode == "6210010401");
  8414. if (!invlist.Any())
  8415. {
  8416. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "控制盘出库装箱库存不足", Time = DateTime.Now });
  8417. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8418. res.ResMsg = "控制盘出库装箱库存不足";
  8419. return res;
  8420. }
  8421. //var date1 = DateTime.Parse("2024-3-25");
  8422. //var date2 = DateTime.Parse("2024-3-26");
  8423. _logger.LogInformation("控制计时埋点7" + timesign);
  8424. invlist = invlist.Distinct();
  8425. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  8426. if (tunlist.Any())
  8427. {
  8428. if (tunlist.Where(p => p.Default2 == "1").Any())
  8429. {
  8430. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8431. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  8432. }
  8433. if (tunlist.Where(p => p.Default2 == "2").Any())
  8434. {
  8435. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8436. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  8437. }
  8438. if (tunlist.Where(p => p.Default2 == "3").Any())
  8439. {
  8440. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8441. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  8442. }
  8443. }
  8444. if (!invlist.Any())
  8445. {
  8446. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "出库巷道被禁用,不满足控制盘出库装箱数量", Time = DateTime.Now });
  8447. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8448. res.ResMsg = "出库巷道被禁用,不满足控制盘出库装箱数量";
  8449. return res;
  8450. }
  8451. //invlist = invlist.Where(p => p.WbGroupCode == "C14" && p.ProductTime > date1 && p.ProductTime < date2);
  8452. var invlist2 = invlist;
  8453. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  8454. if (!sku.Any())
  8455. {
  8456. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut7", new RedisErrorInfo() { Equip = "ControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  8457. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8458. res.ResMsg = "库中没有SKU或SKU不能为空";
  8459. return res;
  8460. }
  8461. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && invlist.GroupBy(v => v.InDocsNo).ToList().Select(v => v.Key).Contains(p.DocsNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind));
  8462. if (!rulelist.Any())
  8463. {
  8464. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct()));
  8465. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut8", new RedisErrorInfo() { Equip = "ControlOut8", Con = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription(), Time = DateTime.Now });
  8466. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  8467. res.ResMsg = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  8468. return res;
  8469. }
  8470. _logger.LogInformation("控制计时埋点8" + timesign);
  8471. foreach (var item in sku)
  8472. {
  8473. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.PackRule == "SPC" && p.ZXStateCode == 0 && !string.IsNullOrEmpty(p.Wind) && !string.IsNullOrEmpty(p.BatchNo)).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  8474. if (!rules.Any())
  8475. {
  8476. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut9", new RedisErrorInfo() { Equip = "ControlOut9", Con = "SKU:" + item.Key + ",没有可用箱号", Time = DateTime.Now });
  8477. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,SKU:" + item.Key + ",单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct()));
  8478. continue;
  8479. }
  8480. var rulegroup = rules.GroupBy(p => new
  8481. {
  8482. p.Wind,
  8483. p.SpoolType,
  8484. p.FullCountQty,
  8485. p.DocsNo
  8486. }).ToList();
  8487. foreach (var rulestemp in rulegroup)
  8488. {
  8489. var rule = rules.Where(p => p.SpoolType == rulestemp.Key.SpoolType && p.Wind == rulestemp.Key.Wind && p.FullCountQty == rulestemp.Key.FullCountQty && p.DocsNo == rulestemp.Key.DocsNo).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode).FirstOrDefault();
  8490. //var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  8491. //if (!syslist.Any())
  8492. //{
  8493. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  8494. // _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  8495. // continue;
  8496. //}
  8497. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  8498. List<string> equips = new List<string>();
  8499. foreach (var pp in sys)
  8500. {
  8501. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  8502. {
  8503. equips.Add(pp.Code);
  8504. }
  8505. }
  8506. if (!equips.Any())
  8507. {
  8508. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key, Time = DateTime.Now });
  8509. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key);
  8510. //自动更新子托盘配置
  8511. foreach (var item1 in sys)
  8512. {
  8513. if (!item1.SContent.Contains(rule.TrayCode))
  8514. {
  8515. string con = item1.SContent + "," + rule.TrayCode;
  8516. _sysconfigrepository.AsUpdateable()
  8517. .SetColumns(p => new sxSysConfig() { SContent = con })
  8518. .Where(p => p.Id == item1.Id)
  8519. .ExecuteCommand();
  8520. }
  8521. }
  8522. continue;
  8523. }
  8524. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  8525. if (!dev.Any())
  8526. {
  8527. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  8528. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  8529. WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestemp.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  8530. continue;
  8531. }
  8532. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  8533. if (!wbgrouplist.Any())
  8534. {
  8535. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut12", new RedisErrorInfo() { Equip = "ControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  8536. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  8537. continue;
  8538. }
  8539. _logger.LogInformation("控制计时埋点9" + timesign);
  8540. List<string> codes = new List<string>();
  8541. foreach (var wbgroup in wbgrouplist)
  8542. {
  8543. codes.Clear();
  8544. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime);
  8545. //invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind).OrderBy(p => p.ProductTime);
  8546. if (!invlist2.Any())
  8547. {
  8548. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut13", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱规则,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  8549. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "SPC控制箱数量不足 ,SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind);
  8550. continue;
  8551. }
  8552. //计算同一天的 当天13:00到第二天8点是一个组,可以装一箱
  8553. var currentTime = invlist2.FirstOrDefault().ProductTime;
  8554. var startTime = currentTime.Date.AddHours(13);
  8555. var endTime = currentTime.Date.AddDays(1).AddHours(8);
  8556. invlist2 = invlist2.Where(p => p.ProductTime >= startTime && p.ProductTime <= endTime);
  8557. var tempoutrecord = invlist2.ToList();
  8558. //焊点、返工盘、黑盘一些基本属性筛选
  8559. if (!string.IsNullOrEmpty(rule.SpoolType))
  8560. {
  8561. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  8562. }
  8563. if (!string.IsNullOrEmpty(rule.Wind))
  8564. {
  8565. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  8566. }
  8567. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  8568. {
  8569. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  8570. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  8571. }
  8572. else
  8573. {
  8574. //不允许焊点盘
  8575. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  8576. }
  8577. if (rule.ReturnCount > 0)
  8578. {
  8579. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  8580. invlist2 = tt.Union(invlist2);
  8581. }
  8582. else
  8583. {
  8584. invlist2 = invlist2.Where(p => p.IsRework == false);
  8585. }
  8586. if (!invlist2.Any())
  8587. {
  8588. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut13", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱规则,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  8589. res.ResMsg = "不满足装箱条件";
  8590. if (tempoutrecord != null && tempoutrecord.Any())
  8591. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  8592. continue;
  8593. }
  8594. _logger.LogInformation("控制计时埋点10" + timesign);
  8595. var currentTimes = invlist2.OrderBy(p => p.ProductTime).FirstOrDefault().ProductTime;
  8596. var invnows = _billInvnowrepository.AsQueryable().Where(p => p.WbGroupCode == invlist2.FirstOrDefault().WbGroupCode && p.Wind == rule.Wind && p.IsTorsChk == true && p.IsControlpanel == true && p.HWTypeCode == rule.SpoolType && p.ContUsageQty <= 0 &&
  8597. (p.TorsChkQty <= 0 || p.TorsChkQty > 0 && (p.InvStateCode == InvState.InvEcecState_BuildUp.ToString() || p.InvStateCode == InvState.InvEcecState_In.ToString())) && p.ProductTime >= currentTimes.Date.AddHours(13) && p.ProductTime <= currentTimes.Date.AddDays(1).AddHours(8)
  8598. && p.MatCode == invlist2.FirstOrDefault().MatCode && string.IsNullOrEmpty(p.PreStock) && p.Grade == "A" && p.InDocsNo == rule.DocsNo).ToList();
  8599. if (invnows.Where(p => p.TorsChkQty == 0).Any())
  8600. {
  8601. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  8602. var timehold = double.Parse((invnows.First().HoldTime + decimal.Parse(TorschkDate.SContent)).ToString());
  8603. var temp = invnows.Where(p => p.TorsChkQty == 0 && (DateTime.Now - p.ProductTime).TotalHours >= timehold).Select(p => p.ContGrpBarCode);
  8604. invnows = invnows.Where(p => !temp.Contains(p.ContGrpBarCode)).ToList();
  8605. }
  8606. if (invlist2.Count() != invnows.Count && invlist2.Count() < rule.FullCountQty)
  8607. {
  8608. if (invnows.Count == invnows.Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.TorsChkQty > 0).Count())
  8609. {
  8610. //已经全部检测完,并且数量小于满数量,则继续执行
  8611. }
  8612. else
  8613. {
  8614. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱条件,该批次检测盘没有全部检测完,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  8615. res.ResMsg = "不满足装箱条件,该批次检测盘没有全部检测完";
  8616. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱,该批次检测盘没有全部检测完," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + rule.SpoolType);
  8617. continue;
  8618. }
  8619. }
  8620. _logger.LogInformation("控制计时埋点11" + timesign);
  8621. if (invlist2.Count() < rule.FullCountQty)
  8622. {
  8623. //非控制盘
  8624. var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8625. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == false && p.IsTorsChk == false
  8626. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  8627. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8628. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8629. //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  8630. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8631. on stock.InDocsNo equals rule1.DocsNo
  8632. select new
  8633. {
  8634. stock.MatCode,
  8635. stock.InvBarCode,
  8636. stock.Grade,
  8637. stock.InvStateCode,
  8638. stock.ProductTime,
  8639. stock.WbGroupCode,
  8640. stock.IsTorsChk,
  8641. stock.TorsChkQty,
  8642. stock.TorsChkValue,
  8643. stock.HoldTime,
  8644. stock.ProductMachCode,
  8645. stock.IsControlpanel,
  8646. stock.HWTypeCode,
  8647. stock.IsBlack,
  8648. stock.SolderCount,
  8649. stock.IsRework,
  8650. stock.InDocsNo,
  8651. stock.Ovced,
  8652. loc.Col,
  8653. loc.Layer,
  8654. loc.Shelf,
  8655. loc.Depth,
  8656. loc.Code,
  8657. loc.Tunnel,
  8658. loc.SCRel,
  8659. loc.Floor,
  8660. loc.WarehouseCode,
  8661. loc.ContGrpBarCode,
  8662. loc.ContGrpId,
  8663. loc.Id,
  8664. loc.StateNum,
  8665. rule1.SkuCode,
  8666. rule1.DocsNo
  8667. };
  8668. //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  8669. var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8670. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty == 1 && p.Ovced == 1
  8671. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  8672. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8673. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8674. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8675. on stock.InDocsNo equals rule1.DocsNo
  8676. select new
  8677. {
  8678. stock.MatCode,
  8679. stock.InvBarCode,
  8680. stock.Grade,
  8681. stock.InvStateCode,
  8682. stock.ProductTime,
  8683. stock.WbGroupCode,
  8684. stock.IsTorsChk,
  8685. stock.TorsChkQty,
  8686. stock.TorsChkValue,
  8687. stock.HoldTime,
  8688. stock.ProductMachCode,
  8689. stock.IsControlpanel,
  8690. stock.HWTypeCode,
  8691. stock.IsBlack,
  8692. stock.SolderCount,
  8693. stock.IsRework,
  8694. stock.InDocsNo,
  8695. stock.Ovced,
  8696. loc.Col,
  8697. loc.Layer,
  8698. loc.Shelf,
  8699. loc.Depth,
  8700. loc.Code,
  8701. loc.Tunnel,
  8702. loc.SCRel,
  8703. loc.Floor,
  8704. loc.WarehouseCode,
  8705. loc.ContGrpBarCode,
  8706. loc.ContGrpId,
  8707. loc.Id,
  8708. loc.StateNum,
  8709. rule1.SkuCode,
  8710. rule1.DocsNo
  8711. };
  8712. _logger.LogInformation("控制计时埋点12" + timesign);
  8713. if (tunlist.Any())
  8714. {
  8715. if (tunlist.Where(p => p.Default2 == "1").Any())
  8716. {
  8717. var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8718. list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  8719. var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8720. list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  8721. }
  8722. if (tunlist.Where(p => p.Default2 == "2").Any())
  8723. {
  8724. var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8725. list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  8726. var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8727. list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  8728. }
  8729. if (tunlist.Where(p => p.Default2 == "3").Any())
  8730. {
  8731. var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8732. list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  8733. var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8734. list2 = list2.Except(www).Distinct(); //过滤3层被禁用的出库巷道
  8735. }
  8736. }
  8737. list = list.Where(p => p.SkuCode == item.Key).Distinct();
  8738. list2 = list2.Where(p => p.SkuCode == item.Key).Distinct();
  8739. if (list2.Any())
  8740. {
  8741. list = list.Union(list2);
  8742. }
  8743. if (list.Count() < rule.FullCountQty - invlist2.Count())
  8744. {
  8745. string msg = "检测盘不满足装箱数量,数量" + (invlist2.Count() + list.Count()) + ",SKU:" + rule.SkuCode + ",绕向" + rule.Wind + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",型号:" + rule.SpoolType;
  8746. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut14", new RedisErrorInfo() { Equip = "ControlOut14", Con = msg, Time = DateTime.Now });
  8747. res.ResMsg = "不满足装箱条件," + msg;
  8748. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  8749. WreTimeOutRecord(list.Select(p => p.ContGrpBarCode).ToList(), msg);
  8750. continue;
  8751. }
  8752. #region 黑盘逻辑去掉
  8753. //if (!invlist2.Where(p => p.IsBlack == true).Any())
  8754. //{
  8755. // var black = list.Where(p => p.IsBlack == true && p.SolderCount == 0 && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime).Take(2);
  8756. // if (!black.Any())
  8757. // {
  8758. // string msg = "补的非控制盘中没有当前单号下的黑盘,当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + "单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8759. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut15", new RedisErrorInfo() { Equip = "ControlOut15", Con = msg, Time = DateTime.Now });
  8760. // res.ResMsg = "不满足装箱条件,"+ msg;
  8761. // continue;
  8762. // }
  8763. // else
  8764. // {
  8765. // if (rule.SpoolType == "BS60")
  8766. // {
  8767. // if (black.Count() <= 1)
  8768. // {
  8769. // string msg = "非控制盘中BS60类型工字轮黑盘数量最少2个,实际数量:" + list.Where(p => p.IsBlack == true).Count() + ",当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8770. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut17", new RedisErrorInfo() { Equip = "ControlOut17", Con = msg, Time = DateTime.Now });
  8771. // res.ResMsg = "不满足装箱条件," + msg;
  8772. // continue;
  8773. // }
  8774. // else
  8775. // {
  8776. // codes.AddRange(black.Select(p => p.ContGrpBarCode));
  8777. // codes.AddRange(list.Where(p => p.IsBlack == false && p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count() - black.Count()).Select(p => p.ContGrpBarCode));
  8778. // }
  8779. // }
  8780. // else
  8781. // {
  8782. // codes.AddRange(black.Select(p => p.ContGrpBarCode));
  8783. // codes.AddRange(list.Where(p => p.IsBlack == false && p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count() - black.Count()).Select(p => p.ContGrpBarCode));
  8784. // }
  8785. // }
  8786. //}
  8787. //else
  8788. //{
  8789. // list = list.Where(p => p.IsBlack == false && p.SolderCount == 0).OrderBy(p => p.ProductTime);
  8790. // codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  8791. //}
  8792. #endregion 黑盘逻辑去掉
  8793. list = list.Where(p => (p.IsBlack == false && p.Ovced == 0) || p.Ovced == 1).OrderBy(p => p.ProductTime);
  8794. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  8795. {
  8796. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  8797. var templist = list.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(rulemaxcount).ToList();
  8798. list = list.Where(p => p.SolderCount == 0).Union(templist);
  8799. }
  8800. else
  8801. {
  8802. //不允许焊点盘
  8803. list = list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  8804. }
  8805. codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  8806. _logger.LogInformation("控制计时埋点13" + timesign);
  8807. }
  8808. else
  8809. {
  8810. #region 黑盘逻辑去掉
  8811. //if (!invlist2.Where(p => p.IsBlack == true).Any() && invlist2.Count() >= rule.FullCountQty && invnows.Any(p => p.IsBlack == true))
  8812. //{
  8813. // string msg = "满足装箱数量,存在同一批次的黑盘,但还未扭转入库,优先装同一批次黑盘";
  8814. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut21", new RedisErrorInfo() { Equip = "ControlOut21", Con = msg, Time = DateTime.Now });
  8815. // res.ResMsg = "不满足装箱条件,"+ msg;
  8816. // continue;
  8817. //}
  8818. //if (!invlist2.Where(p => p.IsBlack == true).Any() && invlist2.Count() >= rule.FullCountQty)
  8819. //{
  8820. // var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8821. // join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == false && p.IsTorsChk == false
  8822. // && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind && p.IsBlack == true
  8823. // && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8824. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8825. // join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8826. // on stock.InDocsNo equals rule1.DocsNo
  8827. // select new
  8828. // {
  8829. // stock.MatCode,
  8830. // stock.InvBarCode,
  8831. // stock.Grade,
  8832. // stock.InvStateCode,
  8833. // stock.ProductTime,
  8834. // stock.WbGroupCode,
  8835. // stock.IsTorsChk,
  8836. // stock.TorsChkQty,
  8837. // stock.TorsChkValue,
  8838. // stock.HoldTime,
  8839. // stock.ProductMachCode,
  8840. // stock.IsControlpanel,
  8841. // stock.HWTypeCode,
  8842. // stock.IsBlack,
  8843. // stock.SolderCount,
  8844. // stock.IsRework,
  8845. // stock.InDocsNo,
  8846. // loc.Col,
  8847. // loc.Layer,
  8848. // loc.Shelf,
  8849. // loc.Depth,
  8850. // loc.Code,
  8851. // loc.Tunnel,
  8852. // loc.SCRel,
  8853. // loc.Floor,
  8854. // loc.WarehouseCode,
  8855. // loc.ContGrpBarCode,
  8856. // loc.ContGrpId,
  8857. // loc.Id,
  8858. // loc.StateNum,
  8859. // rule1.SkuCode,
  8860. // rule1.DocsNo
  8861. // };
  8862. // //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  8863. // var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8864. // join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty == 1 && p.Ovced == 1
  8865. // && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind && p.IsBlack == true
  8866. // && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8867. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8868. // //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  8869. // join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8870. // on stock.InDocsNo equals rule1.DocsNo
  8871. // select new
  8872. // {
  8873. // stock.MatCode,
  8874. // stock.InvBarCode,
  8875. // stock.Grade,
  8876. // stock.InvStateCode,
  8877. // stock.ProductTime,
  8878. // stock.WbGroupCode,
  8879. // stock.IsTorsChk,
  8880. // stock.TorsChkQty,
  8881. // stock.TorsChkValue,
  8882. // stock.HoldTime,
  8883. // stock.ProductMachCode,
  8884. // stock.IsControlpanel,
  8885. // stock.HWTypeCode,
  8886. // stock.IsBlack,
  8887. // stock.SolderCount,
  8888. // stock.IsRework,
  8889. // stock.InDocsNo,
  8890. // loc.Col,
  8891. // loc.Layer,
  8892. // loc.Shelf,
  8893. // loc.Depth,
  8894. // loc.Code,
  8895. // loc.Tunnel,
  8896. // loc.SCRel,
  8897. // loc.Floor,
  8898. // loc.WarehouseCode,
  8899. // loc.ContGrpBarCode,
  8900. // loc.ContGrpId,
  8901. // loc.Id,
  8902. // loc.StateNum,
  8903. // rule1.SkuCode,
  8904. // rule1.DocsNo
  8905. // };
  8906. // if (tunlist.Any())
  8907. // {
  8908. // if (tunlist.Where(p => p.Default2 == "1").Any())
  8909. // {
  8910. // var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8911. // list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  8912. // var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8913. // list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  8914. // }
  8915. // if (tunlist.Where(p => p.Default2 == "2").Any())
  8916. // {
  8917. // var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8918. // list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  8919. // var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8920. // list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  8921. // }
  8922. // if (tunlist.Where(p => p.Default2 == "3").Any())
  8923. // {
  8924. // var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8925. // list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  8926. // var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8927. // list2 = list2.Except(www).Distinct();//过滤3层被禁用的出库巷道
  8928. // }
  8929. // }
  8930. // list2 = list2.Where(p => p.SkuCode == item.Key && p.InDocsNo == rule.DocsNo && p.SolderCount == 0).Distinct();
  8931. // list = list.Where(p => p.SkuCode == item.Key && p.InDocsNo == rule.DocsNo && p.SolderCount == 0).Distinct();
  8932. // if (list2.Any())
  8933. // {
  8934. // list = list.Union(list2);
  8935. // }
  8936. // if (!list.Any())
  8937. // {
  8938. // string msg = "数量已满足装箱,但补的非控制盘中没有当前单号下的黑盘并且黑盘存在焊点,当前检测盘不允许装箱,机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8939. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut16", new RedisErrorInfo() { Equip = "ControlOut16", Con = msg, Time = DateTime.Now });
  8940. // res.ResMsg = "不满足装箱条件,"+ msg;
  8941. // continue;
  8942. // }
  8943. // else
  8944. // {
  8945. // if (rule.SpoolType == "BS60")
  8946. // {
  8947. // if (list.Where(p => p.IsBlack == true && p.SolderCount == 0).Count() <= 1)
  8948. // {
  8949. // string msg = "非控制盘中BS60类型工字轮黑盘数量最少2个,实际数量:" + list.Where(p => p.IsBlack == true).Count() + ",当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8950. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut17", new RedisErrorInfo() { Equip = "ControlOut17", Con = msg, Time = DateTime.Now });
  8951. // res.ResMsg = "不满足装箱条件,"+ msg;
  8952. // continue;
  8953. // }
  8954. // else
  8955. // {
  8956. // codes.AddRange(list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(2).Select(p => p.ContGrpBarCode));
  8957. // }
  8958. // }
  8959. // else
  8960. // {
  8961. // codes.AddRange(list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(1).Select(p => p.ContGrpBarCode));
  8962. // }
  8963. // invlist2 = invlist2.Take(rule.FullCountQty - codes.Count);
  8964. // }
  8965. //}
  8966. #endregion 黑盘逻辑去掉
  8967. invlist2 = invlist2.Take(rule.FullCountQty);
  8968. }
  8969. if (invlist2.Count() + codes.Count < rule.FullCountQty)
  8970. {
  8971. string msg = "不满足装箱数量,数量:" + (invlist2.Count() + codes.Count) + ",当前检测盘不允许装箱;机器组" + invlist2.First().WbGroupCode + ",绕向" + invlist2.First().Wind + ",工字轮类型" + invlist2.First().HWTypeCode + ",下盘时间" + invlist2.First().ProductTime.Date + ",SKU:" + item.Key;
  8972. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut18", new RedisErrorInfo() { Equip = "ControlOut18", Con = msg, Time = DateTime.Now });
  8973. res.ResMsg = "不满足装箱条件," + msg;
  8974. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  8975. WreTimeOutRecord(codes.ToList(), msg);
  8976. continue;
  8977. }
  8978. else
  8979. {
  8980. _logger.LogInformation("控制计时埋点14" + timesign);
  8981. //最后验证数据
  8982. var fincodes = invlist2.Select(p => p.ContGrpBarCode).Distinct().ToList();
  8983. fincodes.AddRange(codes);
  8984. var finstocks = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && fincodes.Contains(p.ContGrpBarCode)).ToList();
  8985. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  8986. {
  8987. _logger.LogInformation("控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  8988. continue;
  8989. }
  8990. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  8991. {
  8992. _logger.LogInformation("控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  8993. continue;
  8994. }
  8995. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  8996. {
  8997. _logger.LogInformation("控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  8998. continue;
  8999. }
  9000. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  9001. {
  9002. _logger.LogInformation("控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9003. continue;
  9004. }
  9005. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  9006. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  9007. {
  9008. _logger.LogInformation("控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9009. continue;
  9010. }
  9011. var invlist2temp = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct().Select(p => p.ContGrpBarCode).ToList();
  9012. invlist2temp.AddRange(codes);
  9013. if (invlist2temp.Distinct().Count() != 36 && invlist2temp.Distinct().Count() != 72)
  9014. {
  9015. _logger.LogInformation("控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9016. continue;
  9017. }
  9018. _logger.LogInformation("控制装箱预锁:埋点1");
  9019. _logger.LogInformation("控制计时埋点15" + timesign);
  9020. var robotlist = new List<string>() { "Robot1", "Robot2" };
  9021. sxSysConfig palletequip = null;
  9022. foreach (var robot in robotlist)
  9023. {
  9024. //获取下工位的最新状态
  9025. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot).OrderBy(p => p.TaskFlag).ToList();
  9026. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  9027. //{
  9028. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  9029. //}
  9030. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  9031. //{
  9032. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  9033. //}
  9034. //else
  9035. //{
  9036. // res.ResMsg = "没有空闲的码垛工位";
  9037. // return res;
  9038. //}
  9039. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  9040. {
  9041. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").OrderBy(p => p.TaskFlag).First();
  9042. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  9043. {
  9044. palletequip = palletequiptemp;
  9045. break;
  9046. }
  9047. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  9048. {
  9049. palletequip = palletequiptemp;
  9050. break;
  9051. }
  9052. //缓存工位2
  9053. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  9054. {
  9055. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  9056. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  9057. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  9058. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  9059. {
  9060. palletequip = palletequiptemp;
  9061. break;
  9062. }
  9063. }
  9064. }
  9065. }
  9066. if (palletequip == null)
  9067. {
  9068. res.ResMsg = "没有空闲的码垛工位";
  9069. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  9070. return res;
  9071. }
  9072. _logger.LogInformation("控制计时埋点16" + timesign);
  9073. int acttype = 0;
  9074. //判断是缓存工位锁定库存还是码垛工位直接下任务
  9075. if (string.IsNullOrEmpty(palletequip.Default1))
  9076. {
  9077. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9078. {
  9079. acttype = 1;//直接执行下任务
  9080. }
  9081. else
  9082. {
  9083. //等待下一轮循环,往math表插数据放在前面
  9084. res.ResMsg = "等待下一轮循环";
  9085. return res;
  9086. }
  9087. }
  9088. else
  9089. {
  9090. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9091. {
  9092. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  9093. if (!string.IsNullOrEmpty(palletequip.Default3))
  9094. {
  9095. res.ResMsg = "等待下一轮循环";
  9096. return res;
  9097. }
  9098. else
  9099. {
  9100. acttype = 2;//预锁库存
  9101. }
  9102. }
  9103. else
  9104. {
  9105. //判断缓存工位2(缓存工位1的托盘要到位之后)
  9106. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  9107. {
  9108. //使用缓存2工位
  9109. acttype = 3;
  9110. }
  9111. else
  9112. {
  9113. res.ResMsg = "没有空闲的码垛工位";
  9114. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  9115. return res;
  9116. }
  9117. }
  9118. }
  9119. #region 托盘任务验证
  9120. _logger.LogInformation("控制计时埋点17" + timesign);
  9121. var TrayportageCheck = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  9122. var responseCheck = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTaskCheck", JsonConvert.SerializeObject(TrayportageCheck));
  9123. var trayresCheck = JsonConvert.DeserializeObject<SRes>(responseCheck);
  9124. if (trayresCheck.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9125. {
  9126. res.ResCode = trayresCheck.ResCode;
  9127. res.ResMsg = trayresCheck.ResMsg;
  9128. _logger.LogInformation("托盘输送任务验证报错" + trayresCheck.ResMsg);
  9129. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务验证报错:" + trayresCheck.ResMsg, Time = DateTime.Now });
  9130. WreTimeOutRecord(fincodes.ToList(), "托盘输送任务验证报错" + trayresCheck.ResMsg);
  9131. return res;
  9132. }
  9133. _logger.LogInformation("控制计时埋点18" + timesign);
  9134. #endregion 托盘任务验证
  9135. #region Mes箱号校验
  9136. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  9137. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  9138. var reqids = Guid.NewGuid().ToString();
  9139. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  9140. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  9141. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  9142. if (mesresponse.success == false)
  9143. {
  9144. _logger.LogInformation("控制装箱预锁:埋点2申请箱号mes反回" + mesresponse.message);
  9145. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9146. {
  9147. ZXStateCode = 2,
  9148. EditTime = DateTime.Now,
  9149. Memo = mesresponse.message
  9150. }, p => p.Id == rule.Id);
  9151. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut19", new RedisErrorInfo() { Equip = "ControlOut19", Con = mesresponse.message, Time = DateTime.Now });
  9152. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9153. res.ResMsg = "控制装箱:申请箱号mes返回" + mesresponse.message;
  9154. WreTimeOutRecord(fincodes.ToList(), res.ResMsg);
  9155. _logger.LogInformation(res.ResMsg);
  9156. continue;
  9157. }
  9158. _logger.LogInformation("控制计时埋点19" + timesign);
  9159. #endregion Mes箱号校验
  9160. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  9161. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  9162. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  9163. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9164. {
  9165. res.ResCode = trayres.ResCode;
  9166. res.ResMsg = trayres.ResMsg;
  9167. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  9168. return res;
  9169. }
  9170. invlist2 = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct();
  9171. _logger.LogInformation("控制计时埋点20" + timesign);
  9172. if (acttype == 1)
  9173. {
  9174. //码垛信息校验
  9175. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  9176. {
  9177. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9178. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  9179. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  9180. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "已经存在未装箱中数据");
  9181. return res;
  9182. }
  9183. var root = DetermineRoot(palletequip.Code);
  9184. var pallet = new Palletizing()
  9185. {
  9186. PalletMax = rule.FullCountQty,
  9187. PalletizState = 0,
  9188. Equip = palletequip.Code,
  9189. Finish = 0,
  9190. AddWho = "",
  9191. EditWho = "",
  9192. BoxRule = rule.PackRule,
  9193. BoxRuleId = rule.Id,
  9194. IsControlpanel = true,
  9195. TaskNum = int.Parse(trayres.Memo1),
  9196. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9197. Robot = root
  9198. };
  9199. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9200. if (pallects.Id == 0)
  9201. {
  9202. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9203. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9204. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9205. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "装箱主表数据保存失败");
  9206. return res;
  9207. }
  9208. var palletizId = pallects.Id;
  9209. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9210. {
  9211. ZXStateCode = 1
  9212. }, p => p.Id == rule.Id);
  9213. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9214. foreach (var invs in invlist2)
  9215. {
  9216. var palletlayer = new PalletLayerMath()
  9217. {
  9218. PalletizingId = palletizId,
  9219. ContGrpId = (long)invs.ContGrpId,
  9220. ContBarCode = invs.ContGrpBarCode,
  9221. Layer = 0,
  9222. SkuCode = rule.SkuCode,
  9223. Finish = 0,
  9224. PboxruleId = rule.Id,
  9225. Istask = 0,
  9226. Palletequip = palletequip.Code,
  9227. Depth = invs.Depth,
  9228. IsBlack = invs.IsBlack,
  9229. SolderCount = invs.SolderCount,
  9230. BoxCode = rule.PBoxCode,
  9231. Wbgroup = invs.WbGroupCode,
  9232. StockDonse = invs.InDocsNo,
  9233. BoxDonse = rule.DocsNo
  9234. };
  9235. math.Add(palletlayer);
  9236. }
  9237. _palletlayerMathrepository.InsertRange(math);
  9238. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9239. {
  9240. PreStock = "1"
  9241. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  9242. if (codes.Any())
  9243. {
  9244. List<PalletLayerMath> list = new List<PalletLayerMath>();
  9245. foreach (var items in codes)
  9246. {
  9247. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == items && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9248. var cell = _basewarecellrepository.GetFirst(p => p.ContGrpBarCode == stock.ContGrpBarCode && p.Row == stock.PutRow && p.Col == stock.PutCol && p.Layer == stock.PutLayer);
  9249. var layer = new PalletLayerMath()
  9250. {
  9251. ContGrpId = (long)stock.ContGrpId,
  9252. ContBarCode = stock.ContGrpBarCode,
  9253. Layer = 0,
  9254. SkuCode = rule.SkuCode,
  9255. Finish = 0,
  9256. PboxruleId = rule.Id,
  9257. Istask = 0,
  9258. Palletequip = palletequip.Code,
  9259. Depth = cell.Depth,
  9260. IsBlack = stock.IsBlack,
  9261. SolderCount = stock.SolderCount,
  9262. BoxCode = rule.PBoxCode,
  9263. Wbgroup = stock.WbGroupCode,
  9264. StockDonse = stock.InDocsNo,
  9265. BoxDonse = rule.DocsNo,
  9266. PalletizingId = palletizId
  9267. };
  9268. list.Add(layer);
  9269. }
  9270. _palletlayerMathrepository.InsertRange(list);
  9271. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9272. {
  9273. PreStock = "1"
  9274. }, p => list.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  9275. }
  9276. #region 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  9277. //invlist2 = invlist2.OrderBy(p => p.Depth).Take(72);
  9278. //foreach (var code in invlist2)
  9279. //{
  9280. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  9281. // if (cell == null)
  9282. // {
  9283. // continue;
  9284. // }
  9285. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9286. // if (invs == null)
  9287. // {
  9288. // continue;
  9289. // }
  9290. // //先判断二升位是否能出库
  9291. // if (code.Depth == 2)
  9292. // {
  9293. // var respon = MoveTask(code.Code);
  9294. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9295. // {
  9296. // continue;
  9297. // }
  9298. // }
  9299. // var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  9300. // {
  9301. // Code = code.ContGrpBarCode,
  9302. // Equip = pallects.Equip,
  9303. // Mater = code.MatCode,
  9304. // Srm = code.SCRel,
  9305. // PalletLayer = 1,
  9306. // Grade = code.Grade,
  9307. // Tunnel = code.Tunnel.ToString(),
  9308. // CellCode = code.Code,
  9309. // SkuCode = rule.SkuCode,
  9310. // ProductMachCode = code.ProductMachCode,
  9311. // Floor = code.Floor,
  9312. // PalletizingId = palletizId,
  9313. // Robot = root,
  9314. // GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  9315. // });
  9316. // if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9317. // {
  9318. // continue;
  9319. // }
  9320. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9321. // {
  9322. // Istask = 1,
  9323. // Layer = 1
  9324. // }, p => p.ContBarCode == code.ContGrpBarCode);
  9325. //}
  9326. ////下完任务后将标识值加1
  9327. //var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == pallects.Robot).Max(p => p.TaskFlag);
  9328. //taskflag = taskflag + 1;
  9329. //_sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + pallects.Equip + "'");
  9330. #endregion 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  9331. res.ResCode = 200;
  9332. res.ResMsg = "成功";
  9333. }
  9334. else if (acttype == 2 || acttype == 3)
  9335. {
  9336. _logger.LogInformation("控制装箱预锁:埋点9");
  9337. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  9338. if (codes.Any())
  9339. {
  9340. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9341. {
  9342. PreStock = "1",
  9343. BomMatCode = trayres.Memo1,//预锁托盘任务id
  9344. BomMatName = rule.PBoxCode, //预锁的箱号
  9345. BomSetId = 1 //代表控制箱标识
  9346. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9347. //锁定缓存工位
  9348. _logger.LogInformation(string.Format("控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  9349. }
  9350. res.ResCode = 200;
  9351. res.ResMsg = "成功";
  9352. }
  9353. _logger.LogInformation("控制计时埋点21" + timesign);
  9354. return res;
  9355. }
  9356. }
  9357. }
  9358. }
  9359. return res;
  9360. }
  9361. /// <summary>
  9362. /// 码垛SPC控制装箱(缓存底托)
  9363. /// </summary>
  9364. /// <param name="request"></param>
  9365. /// <returns></returns>
  9366. public SRes PalletizingSpcPackStockOut3(PalletizingPackStockOutRequest request)
  9367. {
  9368. var res = new SRes();
  9369. var timesign = IdFactory.NewId();
  9370. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  9371. if (palletlist.Any())
  9372. {
  9373. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  9374. if (maxtaskStemp.Any())
  9375. {
  9376. var maxtaskcount = (from tas in maxtaskStemp
  9377. select new TunnelCountTemp()
  9378. {
  9379. Tunnel = tas.Key,
  9380. Count = tas.Count()
  9381. }).ToList();
  9382. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  9383. }
  9384. //箱之间状态卡控限制标识
  9385. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  9386. //某个机械手最大下发的限制状态任务数量
  9387. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  9388. foreach (var item in palletlist)
  9389. {
  9390. //判断任务数量
  9391. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  9392. {
  9393. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  9394. continue;
  9395. }
  9396. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  9397. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  9398. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  9399. {
  9400. //判断是否是第三箱
  9401. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  9402. {
  9403. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  9404. if (item.Id == thirdbox)//第3箱子
  9405. {
  9406. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  9407. {
  9408. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  9409. continue;
  9410. }
  9411. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  9412. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  9413. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  9414. {
  9415. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  9416. continue;
  9417. }
  9418. }
  9419. else if (item.Id > thirdbox)
  9420. {
  9421. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  9422. continue;
  9423. }
  9424. }
  9425. }
  9426. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  9427. if (equips == null)
  9428. {
  9429. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut2", new RedisErrorInfo() { Equip = "ControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  9430. continue;
  9431. }
  9432. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  9433. if (!palletMach.Any())
  9434. {
  9435. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut3", new RedisErrorInfo() { Equip = "ControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  9436. continue;
  9437. }
  9438. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  9439. var curdocid = maxdocid + 1;
  9440. if (palletMach.Any())
  9441. {
  9442. var pid = palletMach.First().PalletizingId;
  9443. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  9444. {
  9445. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  9446. }
  9447. }
  9448. foreach (var pallets in palletMach)
  9449. {
  9450. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  9451. if (cell == null)
  9452. {
  9453. continue;
  9454. }
  9455. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9456. if (invs == null)
  9457. {
  9458. continue;
  9459. }
  9460. var root = DetermineRoot(pallets.Palletequip);
  9461. //先判断二升位是否能出库
  9462. if (cell.Depth == 2)
  9463. {
  9464. var respon = MoveTask(cell.Code);
  9465. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9466. {
  9467. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  9468. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态," + respon.ResMsg);
  9469. continue;
  9470. }
  9471. }
  9472. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  9473. {
  9474. Code = pallets.ContBarCode,
  9475. CellCode = cell.Code,
  9476. Srm = cell.SCRel,
  9477. Tunnel = cell.Tunnel.ToString(),
  9478. Floor = cell.Floor,
  9479. Grade = invs.Grade,
  9480. Mater = invs.MatCode,
  9481. SkuCode = pallets.SkuCode,
  9482. PalletLayer = 0,
  9483. ProductMachCode = invs.ProductMachCode,
  9484. Equip = item.Equip,
  9485. PalletizingId = item.Id,
  9486. Robot = root,
  9487. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  9488. DocId = curdocid
  9489. });
  9490. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9491. {
  9492. _logger.LogInformation(cell.Code + "下发装箱任务失败," + taskresponse.ResMsg);
  9493. continue;
  9494. }
  9495. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9496. {
  9497. Istask = 1,
  9498. Layer = 0
  9499. }, p => p.ContBarCode == invs.ContGrpBarCode);
  9500. }
  9501. //下完任务后将标识值加1
  9502. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  9503. taskflag = taskflag + 1;
  9504. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  9505. }
  9506. }
  9507. //待码垛箱任务下发
  9508. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  9509. if (palletlisttobe.Any())
  9510. {
  9511. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  9512. {
  9513. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  9514. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  9515. {
  9516. _palletizrepository.AsUpdateable()
  9517. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  9518. .Where(p => p.Id == item.Id)
  9519. .ExecuteCommand();
  9520. }
  9521. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  9522. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  9523. {
  9524. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  9525. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  9526. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  9527. {
  9528. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  9529. continue;
  9530. }
  9531. //箱之间状态卡控限制标识
  9532. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  9533. //判断任务数量
  9534. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  9535. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  9536. {
  9537. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  9538. continue;
  9539. }
  9540. if (!_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any()) //&& !_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => mdtempequiplist.Contains(p.PalletizingId) && p.Status < taskstatus).Any()
  9541. {
  9542. //判断是否是第三箱
  9543. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  9544. {
  9545. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  9546. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  9547. if (item.Id == thirdbox)//第3箱子
  9548. {
  9549. if (_palletlayerMathrepository.GetList(p => p.PalletizingId == prepalletid && p.Istask == 0).Any() || _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == prepalletid && p.Status < taskstatus).Any())
  9550. {
  9551. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  9552. continue;
  9553. }
  9554. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  9555. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  9556. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  9557. {
  9558. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  9559. continue;
  9560. }
  9561. }
  9562. else if (item.Id > thirdbox)
  9563. {
  9564. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  9565. continue;
  9566. }
  9567. }
  9568. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  9569. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)//先控制只多下发一层1个任务
  9570. {
  9571. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  9572. if (!palletMach.Any())
  9573. {
  9574. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  9575. continue;
  9576. }
  9577. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  9578. var curdocid = maxdocid + 1;
  9579. if (palletMach.Any())
  9580. {
  9581. var pid = palletMach.First().PalletizingId;
  9582. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  9583. {
  9584. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  9585. }
  9586. }
  9587. foreach (var pallets in palletMach)
  9588. {
  9589. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  9590. if (cell == null)
  9591. {
  9592. continue;
  9593. }
  9594. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9595. if (invs == null)
  9596. {
  9597. continue;
  9598. }
  9599. var root = DetermineRoot(pallets.Palletequip);
  9600. //先判断二升位是否能出库
  9601. if (cell.Depth == 2)
  9602. {
  9603. var respon = MoveTask(cell.Code);
  9604. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9605. {
  9606. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  9607. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  9608. continue;
  9609. }
  9610. }
  9611. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  9612. {
  9613. Code = pallets.ContBarCode,
  9614. CellCode = cell.Code,
  9615. Srm = cell.SCRel,
  9616. Tunnel = cell.Tunnel.ToString(),
  9617. Floor = cell.Floor,
  9618. Grade = invs.Grade,
  9619. Mater = invs.MatCode,
  9620. SkuCode = pallets.SkuCode,
  9621. PalletLayer = 0,
  9622. ProductMachCode = invs.ProductMachCode,
  9623. Equip = item.Equip,
  9624. PalletizingId = item.Id,
  9625. Robot = root,
  9626. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  9627. DocId = curdocid
  9628. });
  9629. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9630. {
  9631. continue;
  9632. }
  9633. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9634. {
  9635. Istask = 1,
  9636. Layer = 0
  9637. }, p => p.ContBarCode == invs.ContGrpBarCode);
  9638. }
  9639. //下完任务后将标识值加1
  9640. var taskflag = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == item.Robot).Max(p => p.TaskFlag);
  9641. taskflag = taskflag + 1;
  9642. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  9643. }
  9644. }
  9645. }
  9646. else
  9647. {
  9648. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  9649. //{
  9650. // PalletizState = 0
  9651. //}, p => p.Id == item.Id);
  9652. _palletizrepository.AsUpdateable()
  9653. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  9654. .Where(p => p.Id == item.Id)
  9655. .ExecuteCommand();
  9656. }
  9657. }
  9658. }
  9659. //取视图码垛设备号
  9660. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  9661. var iscontinue = false;
  9662. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))//一个码垛位只能有一个进行中搬运任务,Memo标识
  9663. {
  9664. if (string.IsNullOrEmpty(palletequip.Default1))
  9665. {
  9666. if (!string.IsNullOrEmpty(palletequip.Default3))
  9667. {
  9668. //机械手交叉下任务需求
  9669. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  9670. //{
  9671. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  9672. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p=>p.TaskFlag).First();
  9673. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9674. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9675. // {
  9676. // }
  9677. // else
  9678. // {
  9679. // iscontinue = false;
  9680. // continue;
  9681. // }
  9682. //}
  9683. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  9684. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  9685. {
  9686. //如果较小的工位已经没有任务那么,则继续下该工位任务
  9687. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  9688. if (minequ != null)
  9689. {
  9690. if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9691. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9692. {
  9693. }
  9694. else
  9695. {
  9696. iscontinue = false;
  9697. continue;
  9698. }
  9699. }
  9700. }
  9701. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  9702. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9703. if (preinvlist.Any())
  9704. {
  9705. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  9706. {
  9707. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9708. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  9709. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  9710. return res;
  9711. }
  9712. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  9713. //码垛信息校验
  9714. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  9715. {
  9716. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9717. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  9718. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  9719. return res;
  9720. }
  9721. var root = DetermineRoot(palletequip.Code);
  9722. var pallet = new Palletizing()
  9723. {
  9724. PalletMax = rule.FullCountQty,
  9725. PalletizState = 0,
  9726. Equip = palletequip.Code,
  9727. Finish = 0,
  9728. AddWho = "",
  9729. EditWho = "",
  9730. BoxRule = rule.PackRule,
  9731. BoxRuleId = rule.Id,
  9732. IsControlpanel = true,
  9733. TaskNum = int.Parse(palletequip.Default3),
  9734. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9735. Robot = root
  9736. };
  9737. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9738. if (pallects.Id == 0)
  9739. {
  9740. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9741. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9742. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9743. return res;
  9744. }
  9745. var palletizId = pallects.Id;
  9746. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9747. {
  9748. ZXStateCode = 1
  9749. }, p => p.Id == rule.Id);
  9750. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9751. foreach (var invs in preinvlist)
  9752. {
  9753. var palletlayer = new PalletLayerMath()
  9754. {
  9755. PalletizingId = palletizId,
  9756. ContGrpId = (long)invs.ContGrpId,
  9757. ContBarCode = invs.ContGrpBarCode,
  9758. Layer = 0,
  9759. SkuCode = rule.SkuCode,
  9760. Finish = 0,
  9761. PboxruleId = rule.Id,
  9762. Istask = 0,
  9763. Palletequip = palletequip.Code,
  9764. Depth = invs.Depth,
  9765. IsBlack = invs.IsBlack,
  9766. SolderCount = invs.SolderCount,
  9767. BoxCode = rule.PBoxCode,
  9768. Wbgroup = invs.WbGroupCode,
  9769. StockDonse = invs.InDocsNo,
  9770. BoxDonse = rule.DocsNo
  9771. };
  9772. math.Add(palletlayer);
  9773. }
  9774. _palletlayerMathrepository.InsertRange(math);
  9775. //把库存预锁标志更新掉
  9776. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9777. {
  9778. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  9779. BomMatCode = "",
  9780. PreStock = "1"
  9781. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  9782. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  9783. res.ResMsg = "非控制捞取预锁库存处理成功";
  9784. return res;
  9785. }
  9786. else
  9787. {
  9788. iscontinue = false;
  9789. continue;
  9790. }
  9791. }
  9792. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9793. {
  9794. iscontinue = true;
  9795. break;
  9796. }
  9797. else
  9798. {
  9799. iscontinue = false;
  9800. continue;
  9801. }
  9802. }
  9803. else
  9804. {
  9805. if (!string.IsNullOrEmpty(palletequip.Default3))
  9806. {
  9807. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  9808. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9809. if (preinvlist.Any())
  9810. {
  9811. //机械手交叉下任务需求
  9812. //if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).Min(p => p.TaskFlag) < palletequip.TaskFlag)
  9813. //{
  9814. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  9815. // var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot).OrderBy(p => p.TaskFlag).First();
  9816. // if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9817. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9818. // {
  9819. // }
  9820. // else
  9821. // {
  9822. // iscontinue = false;
  9823. // continue;
  9824. // }
  9825. //}
  9826. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  9827. if (equiplist.Where(p => p.Code == palletequip.Code).Any() && _palletizrepository.AsQueryable().Where(p => p.Robot == palletequip.Robot).OrderByDescending(p => p.Id).First().Equip == palletequip.Code)
  9828. {
  9829. //如果较小的工位已经没有任务那么,则继续下该工位任务
  9830. var minequ = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == palletequip.Robot && p.Code != palletequip.Code).FirstOrDefault();
  9831. if (minequ != null)
  9832. {
  9833. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9834. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9835. {
  9836. }
  9837. else
  9838. {
  9839. iscontinue = false;
  9840. continue;
  9841. }
  9842. }
  9843. }
  9844. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  9845. {
  9846. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9847. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  9848. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  9849. return res;
  9850. }
  9851. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  9852. //码垛信息校验
  9853. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  9854. {
  9855. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9856. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  9857. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  9858. return res;
  9859. }
  9860. var root = DetermineRoot(palletequip.Code);
  9861. var pallet = new Palletizing()
  9862. {
  9863. PalletMax = rule.FullCountQty,
  9864. PalletizState = 2,
  9865. Equip = palletequip.Code,
  9866. Finish = 0,
  9867. AddWho = "",
  9868. EditWho = "",
  9869. BoxRule = rule.PackRule,
  9870. BoxRuleId = rule.Id,
  9871. IsControlpanel = true,
  9872. TaskNum = int.Parse(palletequip.Default3),
  9873. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9874. Robot = root
  9875. };
  9876. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9877. if (pallects.Id == 0)
  9878. {
  9879. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9880. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9881. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9882. return res;
  9883. }
  9884. var palletizId = pallects.Id;
  9885. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9886. {
  9887. ZXStateCode = 1
  9888. }, p => p.Id == rule.Id);
  9889. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9890. foreach (var invs in preinvlist)
  9891. {
  9892. var palletlayer = new PalletLayerMath()
  9893. {
  9894. PalletizingId = palletizId,
  9895. ContGrpId = (long)invs.ContGrpId,
  9896. ContBarCode = invs.ContGrpBarCode,
  9897. Layer = 0,
  9898. SkuCode = rule.SkuCode,
  9899. Finish = 0,
  9900. PboxruleId = rule.Id,
  9901. Istask = 0,
  9902. Palletequip = palletequip.Code,
  9903. Depth = invs.Depth,
  9904. IsBlack = invs.IsBlack,
  9905. SolderCount = invs.SolderCount,
  9906. BoxCode = rule.PBoxCode,
  9907. Wbgroup = invs.WbGroupCode,
  9908. StockDonse = invs.InDocsNo,
  9909. BoxDonse = rule.DocsNo
  9910. };
  9911. math.Add(palletlayer);
  9912. }
  9913. _palletlayerMathrepository.InsertRange(math);
  9914. //把库存预锁标志更新掉
  9915. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9916. {
  9917. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  9918. BomMatCode = "",
  9919. PreStock = "1"
  9920. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  9921. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  9922. res.ResMsg = "非控制捞取预锁库存处理成功";
  9923. return res;
  9924. }
  9925. else
  9926. {
  9927. iscontinue = false;
  9928. continue;
  9929. }
  9930. }
  9931. else
  9932. {
  9933. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  9934. {
  9935. iscontinue = true;
  9936. break;
  9937. }
  9938. else
  9939. {
  9940. iscontinue = false;
  9941. continue;
  9942. }
  9943. }
  9944. }
  9945. }
  9946. if (!iscontinue)
  9947. {
  9948. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  9949. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  9950. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  9951. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  9952. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  9953. {
  9954. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  9955. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9956. res.ResMsg = "没有空闲的码垛工位";
  9957. return res;
  9958. }
  9959. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  9960. {
  9961. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  9962. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9963. res.ResMsg = "没有空闲的码垛工位";
  9964. return res;
  9965. }
  9966. }
  9967. //判断是否启用手动拆盘
  9968. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  9969. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  9970. if (!devices.Where(p => p.pH_STATUS == true).Any())
  9971. {
  9972. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut5", new RedisErrorInfo() { Equip = "ControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  9973. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9974. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  9975. return res;
  9976. }
  9977. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  9978. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 3 && p.PackRule == "SPC").OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  9979. foreach (var rule in prerules)
  9980. {
  9981. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  9982. List<string> equips = new List<string>();
  9983. foreach (var pp in sys)
  9984. {
  9985. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  9986. {
  9987. equips.Add(pp.Code);
  9988. }
  9989. }
  9990. if (!equips.Any())
  9991. {
  9992. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码,", Time = DateTime.Now });
  9993. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  9994. //自动更新子托盘配置
  9995. foreach (var item1 in sys)
  9996. {
  9997. if (!item1.SContent.Contains(rule.TrayCode))
  9998. {
  9999. string con = item1.SContent + "," + rule.TrayCode;
  10000. _sysconfigrepository.AsUpdateable()
  10001. .SetColumns(p => new sxSysConfig() { SContent = con })
  10002. .Where(p => p.Id == item1.Id)
  10003. .ExecuteCommand();
  10004. }
  10005. }
  10006. continue;
  10007. }
  10008. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  10009. if (!invlist2.Any())
  10010. {
  10011. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10012. res.ResMsg = rule.Id + "控制盘预占用规则表没有查到库存数据";
  10013. return res;
  10014. }
  10015. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  10016. if (!dev.Any())
  10017. {
  10018. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  10019. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  10020. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  10021. continue;
  10022. }
  10023. var fincodes = invlist2.Select(p => p.ContGrpBarCode).ToList();
  10024. var robotlist = new List<string>() { "Robot1", "Robot2" };
  10025. sxSysConfig palletequip = null;
  10026. foreach (var robot in robotlist)
  10027. {
  10028. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  10029. {
  10030. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").OrderBy(p => p.TaskFlag).First();
  10031. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  10032. {
  10033. palletequip = palletequiptemp;
  10034. break;
  10035. }
  10036. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  10037. {
  10038. palletequip = palletequiptemp;
  10039. break;
  10040. }
  10041. //缓存工位2
  10042. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  10043. {
  10044. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  10045. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  10046. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  10047. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  10048. {
  10049. palletequip = palletequiptemp;
  10050. break;
  10051. }
  10052. }
  10053. }
  10054. }
  10055. if (palletequip == null)
  10056. {
  10057. res.ResMsg = "没有空闲的码垛工位";
  10058. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  10059. return res;
  10060. }
  10061. int acttype = 0;
  10062. //判断是缓存工位锁定库存还是码垛工位直接下任务
  10063. if (string.IsNullOrEmpty(palletequip.Default1))
  10064. {
  10065. if (string.IsNullOrEmpty(palletequip.Cache1State))
  10066. {
  10067. acttype = 1;//直接执行下任务
  10068. }
  10069. else
  10070. {
  10071. //等待下一轮循环,往math表插数据放在前面
  10072. res.ResMsg = "等待下一轮循环";
  10073. return res;
  10074. }
  10075. }
  10076. else
  10077. {
  10078. if (string.IsNullOrEmpty(palletequip.Cache1State))
  10079. {
  10080. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  10081. if (!string.IsNullOrEmpty(palletequip.Default3))
  10082. {
  10083. res.ResMsg = "等待下一轮循环";
  10084. return res;
  10085. }
  10086. else
  10087. {
  10088. acttype = 2;//预锁库存
  10089. }
  10090. }
  10091. else
  10092. {
  10093. //判断缓存工位2(缓存工位1的托盘要到位之后)
  10094. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  10095. {
  10096. //使用缓存2工位
  10097. acttype = 3;
  10098. }
  10099. else
  10100. {
  10101. res.ResMsg = "没有空闲的码垛工位";
  10102. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  10103. return res;
  10104. }
  10105. }
  10106. }
  10107. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode, ActType = acttype };
  10108. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  10109. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  10110. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10111. {
  10112. res.ResCode = trayres.ResCode;
  10113. res.ResMsg = trayres.ResMsg;
  10114. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  10115. return res;
  10116. }
  10117. if (acttype == 1)
  10118. {
  10119. //码垛信息校验
  10120. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  10121. {
  10122. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10123. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  10124. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  10125. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "已经存在未装箱中数据");
  10126. return res;
  10127. }
  10128. var root = DetermineRoot(palletequip.Code);
  10129. var pallet = new Palletizing()
  10130. {
  10131. PalletMax = rule.FullCountQty,
  10132. PalletizState = 0,
  10133. Equip = palletequip.Code,
  10134. Finish = 0,
  10135. AddWho = "",
  10136. EditWho = "",
  10137. BoxRule = rule.PackRule,
  10138. BoxRuleId = rule.Id,
  10139. IsControlpanel = true,
  10140. TaskNum = int.Parse(trayres.Memo1),
  10141. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  10142. Robot = root
  10143. };
  10144. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  10145. if (pallects.Id == 0)
  10146. {
  10147. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10148. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  10149. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  10150. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "装箱主表数据保存失败");
  10151. return res;
  10152. }
  10153. var palletizId = pallects.Id;
  10154. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10155. {
  10156. ZXStateCode = 1
  10157. }, p => p.Id == rule.Id);
  10158. List<PalletLayerMath> math = new List<PalletLayerMath>();
  10159. foreach (var invs in invlist2)
  10160. {
  10161. var palletlayer = new PalletLayerMath()
  10162. {
  10163. PalletizingId = palletizId,
  10164. ContGrpId = (long)invs.ContGrpId,
  10165. ContBarCode = invs.ContGrpBarCode,
  10166. Layer = 0,
  10167. SkuCode = rule.SkuCode,
  10168. Finish = 0,
  10169. PboxruleId = rule.Id,
  10170. Istask = 0,
  10171. Palletequip = palletequip.Code,
  10172. Depth = invs.Depth,
  10173. IsBlack = invs.IsBlack,
  10174. SolderCount = invs.SolderCount,
  10175. BoxCode = rule.PBoxCode,
  10176. Wbgroup = invs.WbGroupCode,
  10177. StockDonse = invs.InDocsNo,
  10178. BoxDonse = rule.DocsNo
  10179. };
  10180. math.Add(palletlayer);
  10181. }
  10182. _palletlayerMathrepository.InsertRange(math);
  10183. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10184. {
  10185. PreStock = "1"
  10186. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  10187. res.ResCode = 200;
  10188. res.ResMsg = "成功";
  10189. return res;
  10190. }
  10191. else if (acttype == 2 || acttype == 3)
  10192. {
  10193. if (fincodes.Any())
  10194. {
  10195. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10196. {
  10197. PreStock = "1",
  10198. BomMatCode = trayres.Memo1,//预锁托盘任务id
  10199. BomMatName = rule.PBoxCode, //预锁的箱号
  10200. BomSetId = 1 //代表控制箱标识
  10201. }, p => fincodes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10202. //锁定缓存工位
  10203. _logger.LogInformation(string.Format("控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(fincodes)));
  10204. }
  10205. res.ResCode = 200;
  10206. res.ResMsg = "成功";
  10207. return res;
  10208. }
  10209. return res;
  10210. }
  10211. return res;
  10212. }
  10213. /// <summary>
  10214. /// 码垛SPC控制装箱计算预占箱号
  10215. /// </summary>
  10216. /// <param name="request"></param>
  10217. /// <returns></returns>
  10218. public SRes PalletizingSpcPackRulePre(PalletizingPackStockOutRequest request)
  10219. {
  10220. var res = new SRes();
  10221. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  10222. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  10223. {
  10224. res.ResMsg = "预占箱数已经大于设置值";
  10225. return res;
  10226. }
  10227. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//过期时间
  10228. var time1 = decimal.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TorsChkDateCount").SContent);//扭转检测时效允许时间间隔(小时)
  10229. var wbConf = _sysconfigrepository.GetFirst(p => p.Code == "WbGroupConf").SContent.Split(',').ToList();//允许装到普通箱的检测箱机器组,多个机器组之间用英文格式逗号分隔
  10230. //查找满足时效但是没有全部检测完成的盘所在的机器组
  10231. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10232. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && p.Ovced == 0 && string.IsNullOrEmpty(p.PreStock)
  10233. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours && !wbConf.Contains(p.WbGroupCode))
  10234. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10235. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10236. on stock.InDocsNo equals rule1.DocsNo
  10237. select new
  10238. {
  10239. stock.MatCode,
  10240. stock.InvBarCode,
  10241. stock.Grade,
  10242. stock.InvStateCode,
  10243. stock.ProductTime,
  10244. stock.WbGroupCode,
  10245. stock.IsTorsChk,
  10246. stock.TorsChkQty,
  10247. stock.TorsChkValue,
  10248. stock.TorsChkChord,
  10249. stock.TorsChkFlatness,
  10250. stock.HoldTime,
  10251. stock.ProductMachCode,
  10252. stock.IsControlpanel,
  10253. stock.HWTypeCode,
  10254. stock.IsBlack,
  10255. stock.SolderCount,
  10256. stock.IsRework,
  10257. loc.Col,
  10258. loc.Layer,
  10259. loc.Shelf,
  10260. loc.Depth,
  10261. loc.Code,
  10262. loc.Tunnel,
  10263. loc.SCRel,
  10264. loc.Floor,
  10265. loc.WarehouseCode,
  10266. loc.ContGrpBarCode,
  10267. loc.ContGrpId,
  10268. loc.Id,
  10269. loc.StateNum,
  10270. rule1.SkuCode,
  10271. stock.Wind,
  10272. stock.InDocsNo
  10273. };
  10274. //if (templist.Any())
  10275. //{
  10276. // invlist = invlist.Where(p => !templist.Distinct().Contains(p.WbGroupCode));
  10277. //}
  10278. //invlist = invlist.Where(p => p.WbGroupCode == "C15" && p.Wind == "L" && p.SkuCode == "6210010401");
  10279. if (!invlist.Any())
  10280. {
  10281. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "控制盘出库装箱库存不足", Time = DateTime.Now });
  10282. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10283. res.ResMsg = "控制盘出库装箱库存不足";
  10284. return res;
  10285. }
  10286. //var date1 = DateTime.Parse("2024-6-30");
  10287. //var date2 = DateTime.Parse("2024-7-1");
  10288. invlist = invlist.Distinct();
  10289. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  10290. if (tunlist.Any())
  10291. {
  10292. if (tunlist.Where(p => p.Default2 == "1").Any())
  10293. {
  10294. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10295. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  10296. }
  10297. if (tunlist.Where(p => p.Default2 == "2").Any())
  10298. {
  10299. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10300. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  10301. }
  10302. if (tunlist.Where(p => p.Default2 == "3").Any())
  10303. {
  10304. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10305. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  10306. }
  10307. }
  10308. if (!invlist.Any())
  10309. {
  10310. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "出库巷道被禁用,不满足控制盘出库装箱数量", Time = DateTime.Now });
  10311. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10312. res.ResMsg = "出库巷道被禁用,不满足控制盘出库装箱数量";
  10313. return res;
  10314. }
  10315. //invlist = invlist.Where(p => p.SkuCode == "6210120101" && p.ProductTime > date1 && p.ProductTime < date2);
  10316. var invlist2 = invlist;
  10317. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  10318. if (!sku.Any())
  10319. {
  10320. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut7", new RedisErrorInfo() { Equip = "ControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  10321. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10322. res.ResMsg = "库中没有SKU或SKU不能为空";
  10323. return res;
  10324. }
  10325. //var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && invlist.GroupBy(v => v.InDocsNo).ToList().Select(v => v.Key).Contains(p.DocsNo) && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind));
  10326. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && !string.IsNullOrEmpty(p.BatchNo) && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36));
  10327. if (!rulelist.Any())
  10328. {
  10329. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct()));
  10330. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut8", new RedisErrorInfo() { Equip = "ControlOut8", Con = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription(), Time = DateTime.Now });
  10331. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  10332. res.ResMsg = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  10333. return res;
  10334. }
  10335. foreach (var item in sku)
  10336. {
  10337. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.PackRule == "SPC" && p.ZXStateCode == 0 && !string.IsNullOrEmpty(p.Wind) && !string.IsNullOrEmpty(p.BatchNo) && (p.FullCountQty == 72 || p.FullCountQty == 36)).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  10338. if (!rules.Any())
  10339. {
  10340. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut9", new RedisErrorInfo() { Equip = "ControlOut9", Con = "SKU:" + item.Key + ",没有可用箱号", Time = DateTime.Now });
  10341. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,SKU:" + item.Key + ",单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct()));
  10342. continue;
  10343. }
  10344. var rulegroup = rules.GroupBy(p => new
  10345. {
  10346. p.Wind,
  10347. p.SpoolType,
  10348. p.FullCountQty,
  10349. p.DocsNo
  10350. }).ToList();
  10351. foreach (var rulestemp in rulegroup)
  10352. {
  10353. var rule = rules.Where(p => p.SpoolType == rulestemp.Key.SpoolType && p.Wind == rulestemp.Key.Wind && p.FullCountQty == rulestemp.Key.FullCountQty && p.DocsNo == rulestemp.Key.DocsNo).OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode).FirstOrDefault();
  10354. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  10355. List<string> equips = new List<string>();
  10356. foreach (var pp in sys)
  10357. {
  10358. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  10359. {
  10360. equips.Add(pp.Code);
  10361. }
  10362. }
  10363. if (!equips.Any())
  10364. {
  10365. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key, Time = DateTime.Now });
  10366. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key);
  10367. //自动更新子托盘配置
  10368. foreach (var item1 in sys)
  10369. {
  10370. if (!item1.SContent.Contains(rule.TrayCode))
  10371. {
  10372. string con = item1.SContent + "," + rule.TrayCode;
  10373. _sysconfigrepository.AsUpdateable()
  10374. .SetColumns(p => new sxSysConfig() { SContent = con })
  10375. .Where(p => p.Id == item1.Id)
  10376. .ExecuteCommand();
  10377. }
  10378. }
  10379. continue;
  10380. }
  10381. //var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  10382. //if (!dev.Any())
  10383. //{
  10384. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  10385. // _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  10386. // WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestemp.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  10387. // continue;
  10388. //}
  10389. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  10390. if (!wbgrouplist.Any())
  10391. {
  10392. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut12", new RedisErrorInfo() { Equip = "ControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  10393. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  10394. continue;
  10395. }
  10396. List<string> codes = new List<string>();
  10397. foreach (var wbgroup in wbgrouplist)
  10398. {
  10399. codes.Clear();
  10400. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime);
  10401. if (!invlist2.Any())
  10402. {
  10403. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut13", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱规则,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  10404. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "SPC控制箱数量不足 ,SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind);
  10405. continue;
  10406. }
  10407. //计算同一天的 当天13:00到第二天8点是一个组,可以装一箱
  10408. var currentTime = invlist2.FirstOrDefault().ProductTime;
  10409. var startTime = currentTime.Hour >= 13 ? currentTime.Date.AddHours(13) : currentTime.Date.AddDays(-1).AddHours(13);
  10410. var endTime = currentTime.Hour >= 13 ? currentTime.Date.AddDays(1).AddHours(8) : currentTime.Date.AddHours(8);
  10411. //var startTime = currentTime.Date.AddHours(13);
  10412. //var endTime = currentTime.Date.AddDays(1).AddHours(8);
  10413. invlist2 = invlist2.Where(p => p.ProductTime >= startTime && p.ProductTime <= endTime);
  10414. var tempoutrecord = invlist2.ToList();
  10415. //焊点、返工盘、黑盘一些基本属性筛选
  10416. if (!string.IsNullOrEmpty(rule.SpoolType))
  10417. {
  10418. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  10419. }
  10420. if (!string.IsNullOrEmpty(rule.Wind))
  10421. {
  10422. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  10423. }
  10424. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  10425. {
  10426. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  10427. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  10428. }
  10429. else
  10430. {
  10431. //不允许焊点盘
  10432. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  10433. }
  10434. if (rule.ReturnCount > 0)
  10435. {
  10436. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  10437. invlist2 = tt.Union(invlist2);
  10438. }
  10439. else
  10440. {
  10441. invlist2 = invlist2.Where(p => p.IsRework == false);
  10442. }
  10443. if (!invlist2.Any())
  10444. {
  10445. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut13", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱规则,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  10446. res.ResMsg = "不满足装箱条件";
  10447. if (tempoutrecord != null && tempoutrecord.Any())
  10448. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  10449. continue;
  10450. }
  10451. var currentTimes = invlist2.OrderBy(p => p.ProductTime).FirstOrDefault().ProductTime;
  10452. var invnows = _billInvnowrepository.AsQueryable().Where(p => p.WbGroupCode == invlist2.FirstOrDefault().WbGroupCode && p.Wind == rule.Wind && p.IsTorsChk == true && p.IsControlpanel == true && p.HWTypeCode == rule.SpoolType && p.ContUsageQty <= 0 &&
  10453. (p.TorsChkQty <= 0 || p.TorsChkQty > 0 && (p.InvStateCode == InvState.InvEcecState_BuildUp.ToString() || p.InvStateCode == InvState.InvEcecState_In.ToString())) && p.ProductTime >= currentTimes.Date.AddHours(13) && p.ProductTime <= currentTimes.Date.AddDays(1).AddHours(8)
  10454. && p.MatCode == invlist2.FirstOrDefault().MatCode && string.IsNullOrEmpty(p.PreStock) && p.Grade == "A" && p.InDocsNo == rule.DocsNo).ToList();
  10455. if (invnows.Where(p => p.TorsChkQty == 0).Any())
  10456. {
  10457. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  10458. var timehold = double.Parse((invnows.First().HoldTime + decimal.Parse(TorschkDate.SContent)).ToString());
  10459. var temp = invnows.Where(p => p.TorsChkQty == 0 && (DateTime.Now - p.ProductTime).TotalHours >= timehold).Select(p => p.ContGrpBarCode);
  10460. invnows = invnows.Where(p => !temp.Contains(p.ContGrpBarCode)).ToList();
  10461. }
  10462. if (invlist2.Count() != invnows.Count && invlist2.Count() < rule.FullCountQty)
  10463. {
  10464. if (invnows.Count == invnows.Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.TorsChkQty > 0).Count())
  10465. {
  10466. //已经全部检测完,并且数量小于满数量,则继续执行
  10467. }
  10468. else
  10469. {
  10470. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut13", Con = "SPC控制箱不满足装箱条件,该批次检测盘没有全部检测完,箱号:" + rule.PBoxCode + ",SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo, Time = DateTime.Now });
  10471. res.ResMsg = "不满足装箱条件,该批次检测盘没有全部检测完";
  10472. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱,该批次检测盘没有全部检测完," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + rule.SpoolType);
  10473. continue;
  10474. }
  10475. }
  10476. if (invlist2.Count() < rule.FullCountQty)
  10477. {
  10478. //非控制盘
  10479. var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10480. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == false && p.IsTorsChk == false
  10481. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  10482. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  10483. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10484. //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  10485. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10486. on stock.InDocsNo equals rule1.DocsNo
  10487. select new
  10488. {
  10489. stock.MatCode,
  10490. stock.InvBarCode,
  10491. stock.Grade,
  10492. stock.InvStateCode,
  10493. stock.ProductTime,
  10494. stock.WbGroupCode,
  10495. stock.IsTorsChk,
  10496. stock.TorsChkQty,
  10497. stock.TorsChkValue,
  10498. stock.HoldTime,
  10499. stock.ProductMachCode,
  10500. stock.IsControlpanel,
  10501. stock.HWTypeCode,
  10502. stock.IsBlack,
  10503. stock.SolderCount,
  10504. stock.IsRework,
  10505. stock.InDocsNo,
  10506. stock.Ovced,
  10507. loc.Col,
  10508. loc.Layer,
  10509. loc.Shelf,
  10510. loc.Depth,
  10511. loc.Code,
  10512. loc.Tunnel,
  10513. loc.SCRel,
  10514. loc.Floor,
  10515. loc.WarehouseCode,
  10516. loc.ContGrpBarCode,
  10517. loc.ContGrpId,
  10518. loc.Id,
  10519. loc.StateNum,
  10520. rule1.SkuCode,
  10521. rule1.DocsNo
  10522. };
  10523. //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  10524. var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10525. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty == 1 && p.Ovced == 1
  10526. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  10527. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  10528. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10529. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10530. on stock.InDocsNo equals rule1.DocsNo
  10531. select new
  10532. {
  10533. stock.MatCode,
  10534. stock.InvBarCode,
  10535. stock.Grade,
  10536. stock.InvStateCode,
  10537. stock.ProductTime,
  10538. stock.WbGroupCode,
  10539. stock.IsTorsChk,
  10540. stock.TorsChkQty,
  10541. stock.TorsChkValue,
  10542. stock.HoldTime,
  10543. stock.ProductMachCode,
  10544. stock.IsControlpanel,
  10545. stock.HWTypeCode,
  10546. stock.IsBlack,
  10547. stock.SolderCount,
  10548. stock.IsRework,
  10549. stock.InDocsNo,
  10550. stock.Ovced,
  10551. loc.Col,
  10552. loc.Layer,
  10553. loc.Shelf,
  10554. loc.Depth,
  10555. loc.Code,
  10556. loc.Tunnel,
  10557. loc.SCRel,
  10558. loc.Floor,
  10559. loc.WarehouseCode,
  10560. loc.ContGrpBarCode,
  10561. loc.ContGrpId,
  10562. loc.Id,
  10563. loc.StateNum,
  10564. rule1.SkuCode,
  10565. rule1.DocsNo
  10566. };
  10567. if (tunlist.Any())
  10568. {
  10569. if (tunlist.Where(p => p.Default2 == "1").Any())
  10570. {
  10571. var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10572. list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  10573. var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10574. list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  10575. }
  10576. if (tunlist.Where(p => p.Default2 == "2").Any())
  10577. {
  10578. var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10579. list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  10580. var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10581. list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  10582. }
  10583. if (tunlist.Where(p => p.Default2 == "3").Any())
  10584. {
  10585. var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10586. list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  10587. var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10588. list2 = list2.Except(www).Distinct(); //过滤3层被禁用的出库巷道
  10589. }
  10590. }
  10591. list = list.Where(p => p.SkuCode == item.Key).Distinct();
  10592. list2 = list2.Where(p => p.SkuCode == item.Key).Distinct();
  10593. if (list2.Any())
  10594. {
  10595. list = list.Union(list2);
  10596. }
  10597. if (list.Count() < rule.FullCountQty - invlist2.Count())
  10598. {
  10599. string msg = "检测盘不满足装箱数量,数量" + (invlist2.Count() + list.Count()) + ",SKU:" + rule.SkuCode + ",绕向" + rule.Wind + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",型号:" + rule.SpoolType;
  10600. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut14", new RedisErrorInfo() { Equip = "ControlOut14", Con = msg, Time = DateTime.Now });
  10601. res.ResMsg = "不满足装箱条件," + msg;
  10602. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  10603. WreTimeOutRecord(list.Select(p => p.ContGrpBarCode).ToList(), msg);
  10604. continue;
  10605. }
  10606. list = list.Where(p => (p.IsBlack == false && p.Ovced == 0) || p.Ovced == 1).OrderBy(p => p.ProductTime);
  10607. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  10608. {
  10609. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  10610. //要减去扭转盘invlist2焊点盘的个数
  10611. rulemaxcount = rulemaxcount - invlist2.Where(p => p.SolderCount > 0).Count();
  10612. if (rulemaxcount < 0) rulemaxcount = 0;
  10613. var templist = list.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(rulemaxcount).ToList();
  10614. list = list.Where(p => p.SolderCount == 0).Union(templist);
  10615. }
  10616. else
  10617. {
  10618. //不允许焊点盘
  10619. list = list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  10620. }
  10621. codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  10622. }
  10623. else
  10624. {
  10625. invlist2 = invlist2.Take(rule.FullCountQty);
  10626. }
  10627. if (invlist2.Count() + codes.Count < rule.FullCountQty)
  10628. {
  10629. string msg = "不满足装箱数量,数量:" + (invlist2.Count() + codes.Count) + ",当前检测盘不允许装箱;机器组" + invlist2.First().WbGroupCode + ",绕向" + invlist2.First().Wind + ",工字轮类型" + invlist2.First().HWTypeCode + ",下盘时间" + invlist2.First().ProductTime.Date + ",SKU:" + item.Key;
  10630. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut18", new RedisErrorInfo() { Equip = "ControlOut18", Con = msg, Time = DateTime.Now });
  10631. res.ResMsg = "不满足装箱条件," + msg;
  10632. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  10633. WreTimeOutRecord(codes.ToList(), msg);
  10634. continue;
  10635. }
  10636. else
  10637. {
  10638. //最后验证数据
  10639. var fincodes = invlist2.Select(p => p.ContGrpBarCode).Distinct().ToList();
  10640. fincodes.AddRange(codes);
  10641. var finstocks = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && fincodes.Contains(p.ContGrpBarCode)).ToList();
  10642. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  10643. {
  10644. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10645. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpBarCode" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  10646. continue;
  10647. }
  10648. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  10649. {
  10650. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10651. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpId" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  10652. continue;
  10653. }
  10654. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  10655. {
  10656. _logger.LogInformation("控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10657. continue;
  10658. }
  10659. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  10660. {
  10661. _logger.LogInformation("控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10662. continue;
  10663. }
  10664. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  10665. {
  10666. _logger.LogInformation("控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10667. continue;
  10668. }
  10669. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  10670. {
  10671. _logger.LogInformation("控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10672. continue;
  10673. }
  10674. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  10675. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  10676. {
  10677. _logger.LogInformation("控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10678. continue;
  10679. }
  10680. var invlist2temp = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct().Select(p => p.ContGrpBarCode).ToList();
  10681. invlist2temp.AddRange(codes);
  10682. if (invlist2temp.Distinct().Count() != 36 && invlist2temp.Distinct().Count() != 72)
  10683. {
  10684. _logger.LogInformation("控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10685. continue;
  10686. }
  10687. #region Mes箱号校验
  10688. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  10689. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  10690. var reqids = Guid.NewGuid().ToString();
  10691. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  10692. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  10693. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  10694. if (mesresponse.success == false)
  10695. {
  10696. _logger.LogInformation("控制装箱预锁:埋点2申请箱号mes反回" + mesresponse.message);
  10697. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10698. {
  10699. ZXStateCode = 2,
  10700. EditTime = DateTime.Now,
  10701. Memo = mesresponse.message
  10702. }, p => p.Id == rule.Id);
  10703. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut19", new RedisErrorInfo() { Equip = "ControlOut19", Con = mesresponse.message, Time = DateTime.Now });
  10704. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10705. res.ResMsg = "控制装箱:申请箱号mes返回" + mesresponse.message;
  10706. WreTimeOutRecord(fincodes.ToList(), res.ResMsg);
  10707. _logger.LogInformation(res.ResMsg);
  10708. break;
  10709. }
  10710. else
  10711. {
  10712. try
  10713. {
  10714. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  10715. _db.BeginTran();
  10716. //控制箱预占状态更新成3
  10717. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10718. {
  10719. ZXStateCode = 3,
  10720. EditTime = DateTime.Now,
  10721. Memo = mesresponse.message
  10722. }, p => p.Id == rule.Id);
  10723. var presign = rule.Id.ToString();
  10724. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10725. {
  10726. PreStock = presign,
  10727. EditTime = DateTime.Now,
  10728. Memo = "箱号预占用:" + rule.PBoxCode
  10729. }, p => listid.Contains(p.ContGrpId));
  10730. _db.CommitTran();
  10731. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  10732. }
  10733. catch (Exception ex)
  10734. {
  10735. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  10736. _db.RollbackTran();
  10737. }
  10738. return res;
  10739. }
  10740. #endregion Mes箱号校验
  10741. }
  10742. }
  10743. }
  10744. }
  10745. return res;
  10746. }
  10747. private SRes PalletizingPackTask(PalletizingPackTaskRequest request)
  10748. {
  10749. lock (lockerPalletizingPackTask)
  10750. {
  10751. var res = new SRes();
  10752. //if (_wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddrTo == request.Equip && p.PalletizingId != request.PalletizingId && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Any())
  10753. //{
  10754. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10755. // res.ResMsg = request.Equip + "存在上一箱未完成的任务,不允许下发新的任务";
  10756. // return res;
  10757. //}
  10758. try
  10759. {
  10760. var wcs = new WCS_TaskInfo()
  10761. {
  10762. Status = TaskStatus.NewBuild,
  10763. Type = TaskType.OutDepot,
  10764. Priority = 0,
  10765. Device = request.Srm,
  10766. SrmStation = request.Srm,
  10767. AddrFrom = request.CellCode,
  10768. BarCode = request.Code,
  10769. AddWho = "wms",
  10770. EditWho = "wms",
  10771. WarehouseCode = "sxhouse",
  10772. AddrTo = request.Equip,
  10773. FullQty = 1,
  10774. AgvTaskID = request.PalletLayer, //层配层数
  10775. Tunnel = request.Tunnel,
  10776. MaterialCode = request.Mater,
  10777. MatCode = request.Mater,
  10778. OutType = OutTypeEnum.自动出库任务,
  10779. BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
  10780. Floor = request.Floor,
  10781. Grade = request.Grade,
  10782. WorkBench = request.ProductMachCode,
  10783. PalletizingId = request.PalletizingId,
  10784. Robot = request.Robot,
  10785. GoodsType = request.GoodsType,
  10786. ManualRemarks = request.Memo,
  10787. DocID = request.DocId
  10788. };
  10789. _db.BeginTran();
  10790. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10791. {
  10792. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  10793. EditTime = DateTime.Now
  10794. }, p => p.ContGrpBarCode == request.Code);
  10795. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  10796. {
  10797. StateNum = LocationState.LocationState_StockOut,
  10798. EditTime = DateTime.Now
  10799. }, p => p.Code == request.CellCode);
  10800. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  10801. var flow = _mapper.Map<BillInvflow>(stock);
  10802. flow.Id = GetId();
  10803. flow.AddTime = DateTime.Now;
  10804. flow.EditTime = DateTime.Now;
  10805. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  10806. flow.Memo = "装箱码垛出库";
  10807. _billInvflow.Insert(flow);
  10808. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  10809. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  10810. var wcsdtl = new WCS_TaskDtl()
  10811. {
  10812. ID = Guid.NewGuid(),
  10813. CurPoint = request.Code,
  10814. AddTime = DateTime.Now,
  10815. AddWho = "wms",
  10816. Enabled = true,
  10817. ParentTaskCode = wcstask.ID,
  10818. Desc = wcstask.BusType
  10819. };
  10820. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  10821. _db.CommitTran();
  10822. }
  10823. catch (Exception ex)
  10824. {
  10825. _db.RollbackTran();
  10826. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10827. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  10828. return res;
  10829. }
  10830. return res;
  10831. }
  10832. }
  10833. public SRes CancelTaskVerify(CancelTaskRequest request)
  10834. {
  10835. var res = new SRes();
  10836. if (!request.TaskNo.Any())
  10837. {
  10838. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  10839. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  10840. return res;
  10841. }
  10842. foreach (var item in request.TaskNo)
  10843. {
  10844. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == item && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  10845. if (task == null)
  10846. {
  10847. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  10848. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  10849. return res;
  10850. }
  10851. if (task.Type == TaskType.EnterDepot)
  10852. {
  10853. //验证组盘状态
  10854. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  10855. if (stock == null)
  10856. {
  10857. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  10858. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  10859. return res;
  10860. }
  10861. if (request.State == HandleTaskTypeEnum.完成任务)
  10862. {
  10863. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  10864. {
  10865. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  10866. res.ResMsg = stock.ContGrpBarCode + "不是已组盘状态,不允许完成";
  10867. return res;
  10868. }
  10869. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  10870. {
  10871. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10872. res.ResMsg = stock.ContGrpBarCode + "组盘信息是已入库,请确认是否重复";
  10873. return res;
  10874. }
  10875. }
  10876. else if (request.State == HandleTaskTypeEnum.取消任务)
  10877. {
  10878. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  10879. {
  10880. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10881. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription();
  10882. return res;
  10883. }
  10884. }
  10885. }
  10886. else if (task.Type == TaskType.OutDepot)
  10887. {
  10888. //验证组盘状态
  10889. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  10890. if (stock == null)
  10891. {
  10892. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  10893. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  10894. return res;
  10895. }
  10896. if (request.State == HandleTaskTypeEnum.完成任务)
  10897. {
  10898. if (stock.InvStateCode != InvState.InvEcecState_OutGoing.ToString())
  10899. {
  10900. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10901. res.ResMsg = stock.ContGrpBarCode + "当前的组盘状态不是出库中,不允许完成";
  10902. return res;
  10903. }
  10904. }
  10905. else if (request.State == HandleTaskTypeEnum.取消任务)
  10906. {
  10907. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  10908. if (cell == null)
  10909. {
  10910. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10911. res.ResMsg = stock + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不支持取消";
  10912. return res;
  10913. }
  10914. if (stock.InvStateCode == InvState.InvEcecState_Out.ToString())
  10915. {
  10916. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10917. res.ResMsg = ResponseStatusCodeEnum.StockStateFail.GetDescription();
  10918. return res;
  10919. }
  10920. }
  10921. }
  10922. else if (task.Type == TaskType.TransferDepot)
  10923. {
  10924. //验证组盘状态
  10925. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  10926. if (stock == null)
  10927. {
  10928. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  10929. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  10930. return res;
  10931. }
  10932. if (request.State == HandleTaskTypeEnum.完成任务)
  10933. {
  10934. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  10935. {
  10936. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  10937. res.ResMsg = stock.ContGrpBarCode + "移库任务组盘信息不是已入库,不允许完成";
  10938. return res;
  10939. }
  10940. }
  10941. else if (request.State == HandleTaskTypeEnum.取消任务)
  10942. {
  10943. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10944. res.ResMsg = stock.ContGrpBarCode + "移库任务不允许取消";
  10945. return res;
  10946. }
  10947. }
  10948. }
  10949. return res;
  10950. }
  10951. public SRes CarryTaskInfo(CancelTaskRequest request)
  10952. {
  10953. var res = new SRes();
  10954. if (!request.TaskNo.Any())
  10955. {
  10956. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  10957. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  10958. return res;
  10959. }
  10960. foreach (var item in request.TaskNo)
  10961. {
  10962. if (request.State == HandleTaskTypeEnum.完成任务)
  10963. {
  10964. var con = SrmCompleted(new SxCompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动完成任务", Memo1 = "", Memo2 = "" });
  10965. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10966. {
  10967. return res = con;
  10968. }
  10969. }
  10970. if (request.State == HandleTaskTypeEnum.取消任务)
  10971. {
  10972. var con = CancelTask(new CompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动取消任务", Memo1 = "", Memo2 = "" });
  10973. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10974. {
  10975. return res = con;
  10976. }
  10977. }
  10978. }
  10979. return res;
  10980. }
  10981. public SRes CancelTask(CompleteTaskRequest request)
  10982. {
  10983. var res = new SRes();
  10984. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  10985. if (task == null)
  10986. {
  10987. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  10988. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  10989. return res;
  10990. }
  10991. try
  10992. {
  10993. if (task.Type == TaskType.EnterDepot)
  10994. {
  10995. //验证组盘状态
  10996. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  10997. if (stock == null)
  10998. {
  10999. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11000. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11001. return res;
  11002. }
  11003. var flow = _mapper.Map<BillInvflow>(stock);
  11004. flow.Id = GetId();
  11005. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11006. flow.Memo = "客户端取消入库任务";
  11007. flow.AddTime = DateTime.Now;
  11008. flow.EditTime = DateTime.Now;
  11009. _db.BeginTran();
  11010. _billInvnowrepository.DeleteById(stock.Id);
  11011. _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  11012. _billInvflow.Insert(flow);
  11013. _db.CommitTran();
  11014. }
  11015. else if (task.Type == TaskType.OutDepot)
  11016. {
  11017. //验证组盘状态
  11018. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11019. if (stock == null)
  11020. {
  11021. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11022. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11023. return res;
  11024. }
  11025. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11026. if (cell == null)
  11027. {
  11028. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11029. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不允许取消";
  11030. return res;
  11031. }
  11032. var flow = _mapper.Map<BillInvflow>(stock);
  11033. flow.Id = GetId();
  11034. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  11035. flow.Memo = "客户端取消出库任务";
  11036. flow.AddTime = DateTime.Now;
  11037. flow.EditTime = DateTime.Now;
  11038. _db.BeginTran();
  11039. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  11040. {
  11041. StateNum = LocationState.LocationState_Full,
  11042. EditTime = DateTime.Now
  11043. }, p => p.ContGrpBarCode == task.BarCode);
  11044. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11045. {
  11046. InvStateCode = InvState.InvEcecState_In.ToString(),
  11047. PutRow = cell.Row,
  11048. PutCol = cell.Col,
  11049. PutLayer = cell.Layer,
  11050. EditTime = DateTime.Now,
  11051. PreStock = ""//把预锁的标记去掉
  11052. }, p => p.ContGrpBarCode == task.BarCode);
  11053. //取消任务把响应的码垛信息表业删除
  11054. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  11055. _billInvflow.Insert(flow);
  11056. _db.CommitTran();
  11057. }
  11058. else
  11059. {
  11060. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11061. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消";
  11062. return res;
  11063. }
  11064. }
  11065. catch (Exception ex)
  11066. {
  11067. _db.RollbackTran();
  11068. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11069. res.ResMsg = task.Id + ResponseStatusCodeEnum.Fail.GetDescription();
  11070. _logger.LogInformation("任务取消失败,任务号:" + task.Id + ex.Message);
  11071. return res;
  11072. }
  11073. return res;
  11074. }
  11075. public List<BillPushinfo> GetPushDatelistAuto(PushDate request)
  11076. {
  11077. var list = _billPushinforepository.GetList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == request.Type).OrderBy(p => p.AddTime).Take(request.Count).ToList();
  11078. return list;
  11079. }
  11080. public bool UpdatePushModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  11081. {
  11082. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  11083. }
  11084. public SRes StockChange(SxStockChangeRequest reqDto)
  11085. {
  11086. var res = new StockChangeResponse();
  11087. if (!reqDto.ListInfo.Any())
  11088. {
  11089. res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
  11090. res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
  11091. return res;
  11092. }
  11093. List<BillInvnow> stocklist = new List<BillInvnow>();
  11094. List<BillInvflow> flowlist = new List<BillInvflow>();
  11095. foreach (var item in reqDto.ListInfo)
  11096. {
  11097. var stock = _billInvnowrepository.GetSingle(p => p.InvBarCode == item.MatBarCode && p.ContGrpBarCode == item.SpoolCode);
  11098. if (stock != null)
  11099. {
  11100. var flow = _mapper.Map<BillInvflow>(stock);
  11101. switch (item.State)
  11102. {
  11103. case "Lock":
  11104. stock.ExecStateCode = InvLockState.InvState_Lock.ToString();
  11105. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  11106. break;
  11107. case "Normal":
  11108. stock.ExecStateCode = InvLockState.InvState_Normal.ToString();
  11109. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  11110. break;
  11111. default:
  11112. break;
  11113. }
  11114. if (!string.IsNullOrEmpty(item.Grade))
  11115. {
  11116. stock.Grade = item.Grade;
  11117. flow.Memo = flow.Memo + "|执行改判等级" + item.Grade;
  11118. }
  11119. if (!string.IsNullOrEmpty(item.Reason))
  11120. {
  11121. stock.Memo = item.Reason;
  11122. flow.Memo = flow.Memo + "|执行改判原因" + item.Grade;
  11123. }
  11124. if (!string.IsNullOrEmpty(item.NewTorsValue))
  11125. {
  11126. flow.Memo = flow.Memo + "|执行改判扭转值新值" + item.NewTorsValue + ",原来值" + stock.TorsChkValue;
  11127. stock.TorsChkValue = decimal.Parse(item.NewTorsValue);
  11128. stock.TorsChkQty = 1;
  11129. }
  11130. stock.EditTime = DateTime.Now;
  11131. flow.AddTime = DateTime.Now;
  11132. flow.Id = IdFactory.NewId();
  11133. if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  11134. {
  11135. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  11136. res.ResMsg = stock.InvBarCode + "出库中不允许改判";
  11137. return res;
  11138. }
  11139. else
  11140. {
  11141. stocklist.Add(stock);
  11142. }
  11143. flowlist.Add(flow);
  11144. }
  11145. else
  11146. {
  11147. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  11148. res.ResMsg = item.MatBarCode + "库存不存在";
  11149. return res;
  11150. }
  11151. }
  11152. try
  11153. {
  11154. _db.BeginTran();
  11155. _billInvflow.InsertRange(flowlist);
  11156. _billInvnowrepository.UpdateRange(stocklist);
  11157. _db.CommitTran();
  11158. }
  11159. catch (Exception ex)
  11160. {
  11161. _db.RollbackTran();
  11162. _logger.LogInformation("改判异常" + ex.ToString());
  11163. }
  11164. return res;
  11165. }
  11166. public SRes InitWareCell(int row, int col, int deot, int rowcount, int tun)
  11167. {
  11168. var res = new SRes();
  11169. var ware = _basewarehouserepository.GetFirst(p => p.IsStop == 0);
  11170. for (int i = 0; i < row; i++)
  11171. {
  11172. string shlf = tun.ToString();
  11173. if (row == 2)
  11174. {
  11175. if (i == 0)
  11176. {
  11177. shlf = shlf + "L";
  11178. }
  11179. else
  11180. {
  11181. shlf = shlf + "R";
  11182. }
  11183. }
  11184. else if (row == 4) //双升位
  11185. {
  11186. if (i == 0 || i == 1)
  11187. {
  11188. shlf = shlf + "L";
  11189. }
  11190. else
  11191. {
  11192. shlf = shlf + "R";
  11193. }
  11194. }
  11195. for (int j = 0; j < deot; j++)
  11196. {
  11197. for (int k = 0; k < col; k++)
  11198. {
  11199. var dept = "";
  11200. if (i == 0 || i == 3)
  11201. {
  11202. dept = "2";
  11203. }
  11204. else
  11205. {
  11206. dept = "1";
  11207. }
  11208. var code = new BaseWarecell()
  11209. {
  11210. Code = (rowcount + i).ToString() + "-" + (k + 1).ToString() + "-" + (j + 1).ToString() + "-" + shlf + "-" + dept,
  11211. Tunnel = tun,
  11212. IsStop = 0,
  11213. Name = (rowcount + i).ToString() + "行" + (k + 1).ToString() + "列" + (j + 1).ToString() + "层" + shlf + "货架" + dept + "深度",
  11214. WarehouseId = ware.Id,
  11215. WarehouseCode = ware.Code,
  11216. WareAreaId = 0,
  11217. StateNum = LocationState.LocationState_Empty,
  11218. TypeNum = LocationType.LocationType_StorageLocation,
  11219. Size = 1,
  11220. Row = (rowcount + i),
  11221. Col = (k + 1),
  11222. Layer = (j + 1),
  11223. Depth = int.Parse(dept),
  11224. SCRel = "SRM",
  11225. ContGrpId = 0,
  11226. ContGrpBarCode = "",
  11227. AddWho = "wms",
  11228. EditWho = "wms",
  11229. Shelf = shlf,
  11230. Floor = (j + 1) <= 4 ? 1 : (j + 1) > 4 && (j + 1) <= 8 ? 2 : (j + 1) > 8 && (j + 1) <= 12 ? 3 : 0
  11231. };
  11232. _basewarecellrepository.Insert(code);
  11233. }
  11234. }
  11235. }
  11236. return res;
  11237. }
  11238. public sxSysJob GetJobEntityByid(string id)
  11239. {
  11240. return _jobrepository.GetSingle(p => p.Id == long.Parse(id));
  11241. }
  11242. public sxSysJob GetJobEntityByCode(string Code)
  11243. {
  11244. return _jobrepository.GetSingle(p => p.Code == Code);
  11245. }
  11246. public List<sxSysJobApiRelation> GetJobapilist(long id)
  11247. {
  11248. return _jobApirepository.GetList(p => p.JobId == id);
  11249. }
  11250. public List<sxSysJob> GetJobList()
  11251. {
  11252. return _jobrepository.GetList();
  11253. }
  11254. /// <summary>
  11255. /// 接收扭转结果
  11256. /// </summary>
  11257. /// <param name="request"></param>
  11258. /// <returns></returns>
  11259. public SRes TorsChkValue(TorsChkValueRequest request)
  11260. {
  11261. var res = new SRes();
  11262. try
  11263. {
  11264. var taskold = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == int.Parse(request.TaskNo) && p.Type == TaskType.OutDepot && p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription()).SplitTable(p => p.Take(2)).First();
  11265. if (taskold == null)
  11266. {
  11267. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11268. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11269. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11270. return res;
  11271. }
  11272. if (taskold.Status == TaskStatus.Finish && !_torchbandinforepository.IsAny(p => p.TaskNo == request.TaskNo))
  11273. {
  11274. var codes = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.IsTorsChk == true);
  11275. if (codes == null)
  11276. {
  11277. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11278. res.ResMsg = request.TaskNo + "条码信息不存在";
  11279. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "条码信息不存在", Time = DateTime.Now });
  11280. return res;
  11281. }
  11282. _logger.LogInformation("扭转下位机重复上抛扭转值,任务号" + request.TaskNo);
  11283. return res;
  11284. //var time1 = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  11285. //var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  11286. //var reqids = Guid.NewGuid().ToString();
  11287. //var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162001", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  11288. //var torschks = new TorsChkUploadMes() { SpoolCode = codes.ContGrpBarCode, MatBarCode = codes.CLBarCode, ChkMacCode = request.TorsChkWb, ChkVal = decimal.Parse(request.TorsChkValue), ChkTime = time1, Bow = decimal.Parse(request.TorsChkChord), Straight = decimal.Parse(request.TorsChkFlatness) };
  11289. //if (request.TorsChkValue == "9.990000")
  11290. //{
  11291. // torschks.OvcResult = false;
  11292. // torschks.ChkVal = 0;
  11293. //}
  11294. //if (request.TorsChkChord == "49.999001")
  11295. //{
  11296. // torschks.Bow = 5;
  11297. // torschks.BowResult = false;
  11298. //}
  11299. //if (request.TorsChkFlatness == "299.998993")
  11300. //{
  11301. // torschks.Straight = 10;
  11302. // torschks.StraightResult = false;
  11303. //}
  11304. //var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(torschks), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  11305. //var esbresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  11306. //if (esbresponse.success == false)
  11307. //{
  11308. // _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11309. // {
  11310. // TorsChkQty = codes.TorsChkQty + 1,
  11311. // TorsChkTime = DateTime.ParseExact(time1, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11312. // TorsChkValue = torschks.ChkVal,
  11313. // TorsChkChord = torschks.Bow,
  11314. // TorsChkFlatness = torschks.Straight,
  11315. // TorsChkMachCode = request.TorsChkWb,
  11316. // TorsChkStation = request.TorsChkStation,
  11317. // TorsChkChordIsGood = request.TorsChkChordIsGood,
  11318. // TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11319. // TorsChkValueIsGood = request.TorsChkValueIsGood,
  11320. // Grade = "C"
  11321. // }, p => p.ContGrpBarCode == codes.ContGrpBarCode);
  11322. // //记录描述信息
  11323. // var error = new BaseErrorinfo()
  11324. // {
  11325. // ContBarCode = codes.ContGrpBarCode,
  11326. // Message = esbresponse.message,
  11327. // AddWho = "",
  11328. // EditWho = "",
  11329. // Count = 1
  11330. // };
  11331. // var errors = _errorinforepository.GetSingle(p => p.ContBarCode == codes.ContGrpBarCode && p.Message == error.Message);
  11332. // if (errors != null)
  11333. // {
  11334. // _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11335. // {
  11336. // Count = errors.Count + 1
  11337. // }, p => p.ContBarCode == errors.ContBarCode);
  11338. // }
  11339. // else
  11340. // {
  11341. // _errorinforepository.Insert(error);
  11342. // }
  11343. // return res;
  11344. //}
  11345. //else
  11346. //{
  11347. // _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11348. // {
  11349. // TorsChkQty = codes.TorsChkQty + 1,
  11350. // TorsChkTime = DateTime.ParseExact(time1, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11351. // TorsChkValue = torschks.ChkVal,
  11352. // TorsChkChord = torschks.Bow,
  11353. // TorsChkFlatness = torschks.Straight,
  11354. // TorsChkMachCode = request.TorsChkWb,
  11355. // TorsChkStation = request.TorsChkStation,
  11356. // TorsChkChordIsGood = request.TorsChkChordIsGood,
  11357. // TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11358. // TorsChkValueIsGood = request.TorsChkValueIsGood
  11359. // }, p => p.ContGrpBarCode == codes.ContGrpBarCode);
  11360. // return res;
  11361. //}
  11362. }
  11363. var code = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11364. if (code == null)
  11365. {
  11366. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11367. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11368. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "库存状态不对,不是出库中", Time = DateTime.Now });
  11369. return res;
  11370. }
  11371. var torch = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo);
  11372. if (torch == null)
  11373. {
  11374. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11375. res.ResMsg = request.TaskNo + "该工字轮没有扭转绑定信息";
  11376. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮没有扭转绑定信息", Time = DateTime.Now });
  11377. return res;
  11378. }
  11379. if (torch.Machine != request.TorsChkWb)
  11380. {
  11381. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11382. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符";
  11383. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符", Time = DateTime.Now });
  11384. return res;
  11385. }
  11386. if (torch.WorkStation != request.TorsChkStation)
  11387. {
  11388. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11389. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符";
  11390. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符", Time = DateTime.Now });
  11391. return res;
  11392. }
  11393. if (code.SideNum == 1)
  11394. {
  11395. }
  11396. else
  11397. {
  11398. #region 扭转值结果处理
  11399. //上传mes扭转结果
  11400. var time = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  11401. var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  11402. var reqid = Guid.NewGuid().ToString();
  11403. var req = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162001", requestId = reqid, TrackId = reqid, sourceCode = "163K" } };
  11404. var torschk = new TorsChkUploadMes() { SpoolCode = code.ContGrpBarCode, MatBarCode = code.CLBarCode, ChkMacCode = request.TorsChkWb, ChkVal = decimal.Parse(request.TorsChkValue), ChkTime = time, Bow = decimal.Parse(request.TorsChkChord), Straight = decimal.Parse(request.TorsChkFlatness) };
  11405. if (request.TorsChkValue == "9.990000")
  11406. {
  11407. torschk.OvcResult = false;
  11408. torschk.ChkVal = 0;
  11409. }
  11410. if (request.TorsChkChord == "49.999001")
  11411. {
  11412. torschk.Bow = 5;
  11413. torschk.BowResult = false;
  11414. }
  11415. if (request.TorsChkFlatness == "299.998993")
  11416. {
  11417. torschk.Straight = 10;
  11418. torschk.StraightResult = false;
  11419. }
  11420. //CK0701\CK0702\CK0703\CK0704\CK0705\CK0706\CK0707\CK0708\CK0709\CK0710
  11421. _logger.LogInformation("扭转值接口调用,传参条码:" + code.ContGrpBarCode);
  11422. var strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(torschk), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
  11423. var response = JsonConvert.DeserializeObject<TorschMesResponse>(strEsbRes);
  11424. _logger.LogInformation("MES扭转值返回结果:条码" + code.ContGrpBarCode + ",结果:" + response.success + ",扭转等级:" + response.data.GradeCode);
  11425. if (response.success == false)
  11426. {
  11427. //记录描述信息
  11428. var error = new BaseErrorinfo()
  11429. {
  11430. ContBarCode = code.ContGrpBarCode,
  11431. Message = response.message,
  11432. AddWho = "",
  11433. EditWho = "",
  11434. Count = 1
  11435. };
  11436. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11437. if (errorinfo != null)
  11438. {
  11439. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11440. {
  11441. Count = errorinfo.Count + 1
  11442. }, p => p.ContBarCode == errorinfo.ContBarCode);
  11443. }
  11444. else
  11445. {
  11446. _errorinforepository.Insert(error);
  11447. }
  11448. //异常工字轮暂时先回库
  11449. //if (code.ContUsageQty == 2)
  11450. //{
  11451. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11452. // var flow2 = _mapper.Map<BillInvflow>(code);
  11453. // flow2.Id = GetId();
  11454. // flow2.AddTime = DateTime.Now;
  11455. // flow2.EditTime = DateTime.Now;
  11456. // flow2.Memo = "扭转超时出库完成";
  11457. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  11458. // _billInvflow.Insert(flow2);
  11459. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11460. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11461. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11462. // {
  11463. // Status = TaskStatus.Finish,
  11464. // EditTime = DateTime.Now,
  11465. // ManualRemarks = "扭转超时"
  11466. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11467. // var wcsdt = new WCS_TaskDtl()
  11468. // {
  11469. // ID = Guid.NewGuid(),
  11470. // CurPoint = request.TorsChkWb,
  11471. // AddTime = DateTime.Now,
  11472. // AddWho = "wms",
  11473. // Enabled = true,
  11474. // ParentTaskCode = taskold.Id,
  11475. // Desc = "扭转超时"
  11476. // };
  11477. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  11478. // return res;
  11479. //}
  11480. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11481. {
  11482. TorsChkQty = code.TorsChkQty + 1,
  11483. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11484. TorsChkValue = torschk.ChkVal,
  11485. TorsChkChord = torschk.Bow,
  11486. TorsChkFlatness = torschk.Straight,
  11487. TorsChkMachCode = request.TorsChkWb,
  11488. TorsChkStation = request.TorsChkStation,
  11489. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11490. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11491. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11492. Grade = "C",
  11493. SideNum = 1,
  11494. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11495. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11496. }
  11497. else
  11498. {
  11499. //异常工字轮暂时先回库
  11500. //if (code.ContUsageQty == 2)
  11501. //{
  11502. // //记录描述信息
  11503. // var error = new BaseErrorinfo()
  11504. // {
  11505. // ContBarCode = code.ContGrpBarCode,
  11506. // Message = code.ContGrpBarCode + "扭转超时,直接异常排出",
  11507. // AddWho = "",
  11508. // EditWho = "",
  11509. // Count = 1
  11510. // };
  11511. // var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11512. // if (errorinfo != null)
  11513. // {
  11514. // _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11515. // {
  11516. // Count = errorinfo.Count + 1
  11517. // }, p => p.ContBarCode == errorinfo.ContBarCode);
  11518. // }
  11519. // else
  11520. // {
  11521. // _errorinforepository.Insert(error);
  11522. // }
  11523. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11524. // var flow2 = _mapper.Map<BillInvflow>(code);
  11525. // flow2.Id = GetId();
  11526. // flow2.AddTime = DateTime.Now;
  11527. // flow2.EditTime = DateTime.Now;
  11528. // flow2.Memo = "扭转超时出库完成";
  11529. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  11530. // _billInvflow.Insert(flow2);
  11531. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11532. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11533. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11534. // {
  11535. // Status = TaskStatus.Finish,
  11536. // EditTime = DateTime.Now,
  11537. // ManualRemarks = "扭转超时"
  11538. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11539. // var wcsdt = new WCS_TaskDtl()
  11540. // {
  11541. // ID = Guid.NewGuid(),
  11542. // CurPoint = request.TorsChkWb,
  11543. // AddTime = DateTime.Now,
  11544. // AddWho = "wms",
  11545. // Enabled = true,
  11546. // ParentTaskCode = taskold.Id,
  11547. // Desc = "扭转超时"
  11548. // };
  11549. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  11550. // return res;
  11551. //}
  11552. if (response.success == true && response.data.GradeCode == "A")
  11553. {
  11554. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11555. {
  11556. TorsChkQty = code.TorsChkQty + 1,
  11557. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11558. TorsChkValue = torschk.ChkVal,
  11559. TorsChkChord = torschk.Bow,
  11560. TorsChkFlatness = torschk.Straight,
  11561. TorsChkMachCode = request.TorsChkWb,
  11562. TorsChkStation = request.TorsChkStation,
  11563. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11564. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11565. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11566. Grade = "A",
  11567. SideNum = 1,
  11568. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11569. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11570. }
  11571. else
  11572. {
  11573. var error = new BaseErrorinfo()
  11574. {
  11575. ContBarCode = code.ContGrpBarCode,
  11576. Message = response.message,
  11577. AddWho = "",
  11578. EditWho = "",
  11579. Count = 1
  11580. };
  11581. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11582. if (errorinfo != null)
  11583. {
  11584. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11585. {
  11586. Count = errorinfo.Count + 1
  11587. }, p => p.ContBarCode == errorinfo.ContBarCode);
  11588. }
  11589. else
  11590. {
  11591. _errorinforepository.Insert(error);
  11592. }
  11593. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11594. {
  11595. TorsChkQty = code.TorsChkQty + 1,
  11596. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11597. TorsChkValue = torschk.ChkVal,
  11598. TorsChkChord = torschk.Bow,
  11599. TorsChkFlatness = torschk.Straight,
  11600. TorsChkMachCode = request.TorsChkWb,
  11601. TorsChkStation = request.TorsChkStation,
  11602. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11603. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11604. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11605. SideNum = 1,
  11606. Grade = "C",
  11607. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11608. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11609. }
  11610. }
  11611. #endregion 扭转值结果处理
  11612. }
  11613. _db.BeginTran();
  11614. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  11615. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == code.ContGrpId && p.Code == taskold.AddrFrom && p.ContGrpBarCode == code.ContGrpBarCode);
  11616. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11617. _billInvnowrepository.Delete(p => p.Id == code.Id);
  11618. var flow = _mapper.Map<BillInvflow>(stock);
  11619. flow.Id = GetId();
  11620. flow.AddTime = DateTime.Now;
  11621. flow.EditTime = DateTime.Now;
  11622. flow.Memo = "扭转出库任务完成";
  11623. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11624. _billInvflow.Insert(flow);
  11625. _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11626. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11627. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11628. {
  11629. Status = TaskStatus.Finish,
  11630. EditTime = DateTime.Now,
  11631. ManualRemarks = "扭转完成,操作人" + request.User
  11632. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11633. var wcsdtl = new WCS_TaskDtl()
  11634. {
  11635. ID = Guid.NewGuid(),
  11636. CurPoint = stock.TorsChkMachCode,
  11637. AddTime = DateTime.Now,
  11638. AddWho = "wms",
  11639. Enabled = true,
  11640. ParentTaskCode = taskold.Id,
  11641. Desc = "扭转完成,操作人" + request.User
  11642. };
  11643. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  11644. var inv = stock;
  11645. inv.Id = GetId();
  11646. inv.ContGrpId = GetId();
  11647. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  11648. inv.Memo = "扭转回库";
  11649. _billInvnowrepository.Insert(inv);
  11650. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  11651. var wcs = new WCS_TaskInfo()
  11652. {
  11653. Status = TaskStatus.NewBuild,
  11654. Type = TaskType.EnterDepot,
  11655. Priority = 0,
  11656. Device = "",
  11657. SrmStation = "",
  11658. AddrFrom = inv.TorsChkMachCode,
  11659. BarCode = stock.ContGrpBarCode,
  11660. AddWho = "wms",
  11661. EditWho = "wms",
  11662. WarehouseCode = "sxhouse",
  11663. AddrTo = "",
  11664. Tunnel = "",
  11665. MaterialCode = inv.MatCode,
  11666. MatCode = inv.MatCode,
  11667. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  11668. Grade = inv.Grade
  11669. };
  11670. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  11671. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  11672. var wcsdtls = new WCS_TaskDtl()
  11673. {
  11674. ID = Guid.NewGuid(),
  11675. CurPoint = wcstask.AddrFrom,
  11676. AddTime = DateTime.Now,
  11677. AddWho = "wms",
  11678. Enabled = true,
  11679. ParentTaskCode = wcstask.ID,
  11680. Desc = wcstask.BusType
  11681. };
  11682. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  11683. _torschwbcount.UpdateSetColumnsTrue(p => new TorschWbCount()
  11684. {
  11685. WbCount = p.WbCount - 1
  11686. }, p => p.Code == request.TorsChkWb);
  11687. _db.CommitTran();
  11688. }
  11689. catch (Exception ex)
  11690. {
  11691. _db.RollbackTran();
  11692. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11693. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  11694. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ex.Message, Time = DateTime.Now });
  11695. return res;
  11696. }
  11697. return res;
  11698. }
  11699. public SRes TorsChkStationbinde(TorsChkStationbindeRequest request)
  11700. {
  11701. var res = new SRes();
  11702. try
  11703. {
  11704. if (request.Memo1.Trim() == "2")
  11705. {
  11706. var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == int.Parse(request.TaskNo) && p.Type == TaskType.OutDepot && p.Status < TaskStatus.Finish && p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription()).SplitTable(p => p.Take(2)).First();
  11707. if (taskold == null)
  11708. {
  11709. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11710. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11711. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11712. return res;
  11713. }
  11714. var torchbandinfo = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo && p.WorkStation == request.WorkStation && p.Machine == request.Machine);
  11715. if (torchbandinfo != null)
  11716. {
  11717. return res;
  11718. }
  11719. var count = _torchbandinforepository.GetList(p => p.TaskNo == request.TaskNo).Count;
  11720. if (count > 0)
  11721. {
  11722. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11723. res.ResMsg = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位";
  11724. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位", Time = DateTime.Now });
  11725. return res;
  11726. }
  11727. var tors = new BaseTorchbandinfo()
  11728. {
  11729. TaskNo = request.TaskNo,
  11730. ContBarCode = taskold.BarCode,
  11731. WorkStation = request.WorkStation,
  11732. Machine = request.Machine,
  11733. IsStop = 0,
  11734. AddWho = "",
  11735. EditWho = ""
  11736. };
  11737. _torchbandinforepository.Insert(tors);
  11738. }
  11739. else
  11740. {
  11741. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot && p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription()).SplitTable(p => p.Take(2)).First();
  11742. if (task == null)
  11743. {
  11744. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11745. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  11746. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "不存在扭转出库的任务", Time = DateTime.Now });
  11747. return res;
  11748. }
  11749. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11750. if (stock == null)
  11751. {
  11752. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11753. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  11754. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "没有找到扭转出库的库存信息", Time = DateTime.Now });
  11755. return res;
  11756. }
  11757. _db.BeginTran();
  11758. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  11759. var flow = _mapper.Map<BillInvflow>(stock);
  11760. flow.Id = GetId();
  11761. flow.AddTime = DateTime.Now;
  11762. flow.EditTime = DateTime.Now;
  11763. flow.Memo = "不需扭转";
  11764. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11765. _billInvflow.Insert(flow);
  11766. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11767. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11768. {
  11769. Status = TaskStatus.Finish,
  11770. EditTime = DateTime.Now,
  11771. ManualRemarks = "未扭转"
  11772. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11773. var wcsdtl = new WCS_TaskDtl()
  11774. {
  11775. ID = Guid.NewGuid(),
  11776. CurPoint = request.Machine,
  11777. AddTime = DateTime.Now,
  11778. AddWho = "wms",
  11779. Enabled = true,
  11780. ParentTaskCode = task.Id,
  11781. Desc = "未扭转"
  11782. };
  11783. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  11784. var inv = stock;
  11785. inv.Id = GetId();
  11786. inv.ContGrpId = GetId();
  11787. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  11788. inv.Memo = "未扭转";
  11789. _billInvnowrepository.Insert(inv);
  11790. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  11791. var wcs = new WCS_TaskInfo()
  11792. {
  11793. Status = TaskStatus.NewBuild,
  11794. Type = TaskType.EnterDepot,
  11795. Priority = 0,
  11796. Device = "",
  11797. SrmStation = "",
  11798. AddrFrom = request.Machine,
  11799. BarCode = stock.ContGrpBarCode,
  11800. AddWho = "wms",
  11801. EditWho = "wms",
  11802. WarehouseCode = "sxhouse",
  11803. AddrTo = "",
  11804. Tunnel = "",
  11805. MaterialCode = inv.MatCode,
  11806. MatCode = inv.MatCode,
  11807. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  11808. Grade = inv.Grade
  11809. };
  11810. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  11811. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  11812. var wcsdtls = new WCS_TaskDtl()
  11813. {
  11814. ID = Guid.NewGuid(),
  11815. CurPoint = wcstask.AddrFrom,
  11816. AddTime = DateTime.Now,
  11817. AddWho = "wms",
  11818. Enabled = true,
  11819. ParentTaskCode = wcstask.ID,
  11820. Desc = wcstask.BusType
  11821. };
  11822. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  11823. _db.CommitTran();
  11824. }
  11825. }
  11826. catch (Exception ex)
  11827. {
  11828. _db.RollbackTran();
  11829. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  11830. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  11831. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = ex.Message, Time = DateTime.Now });
  11832. return res;
  11833. }
  11834. return res;
  11835. }
  11836. public SRes TorsChkErrorinfo(TorsChkErrorinfoRequest request)
  11837. {
  11838. var res = new SRes();
  11839. RedisHelper.Set("Sx:WMSErrorInfo:TorsChk" + request.Machine + request.WorkStation, new RedisErrorInfo() { Equip = "TorsChk" + request.Machine + request.WorkStation, Con = "扭转设备号" + request.Machine + "_" + request.WorkStation + request.ExcMessage, Time = DateTime.Now });
  11840. return res;
  11841. }
  11842. public SRes CellInfo(string code)
  11843. {
  11844. var res = new SRes();
  11845. MoveTask(code);
  11846. return res;
  11847. }
  11848. public TorsChkResponse GetTorsChkinfo(GetTorsChkinfoRequest request)
  11849. {
  11850. var res = new TorsChkResponse();
  11851. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNo && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot && p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription()).SplitTable(p => p.Take(2)).First();
  11852. if (task == null)
  11853. {
  11854. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11855. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11856. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11857. return res;
  11858. }
  11859. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11860. if (stock == null)
  11861. {
  11862. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11863. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11864. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription(), Time = DateTime.Now });
  11865. return res;
  11866. }
  11867. var marter = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == stock.MatCode).First();
  11868. if (marter == null)
  11869. {
  11870. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  11871. res.ResMsg = request.TaskNo.ToString() + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  11872. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(), Time = DateTime.Now });
  11873. return res;
  11874. }
  11875. if (task.BarCode.EndsWith("R"))
  11876. {
  11877. res.Face = "R";
  11878. }
  11879. else
  11880. {
  11881. res.Face = "L";
  11882. }
  11883. res.GoodsType = task.GoodsType;
  11884. res.Isdetection = 2;
  11885. res.Diameter = marter.Diameter;
  11886. return res;
  11887. }
  11888. public SRes Manaler(DetailCodeStrdtoRequest request)
  11889. {
  11890. var res = new SRes();
  11891. //var list = _basewarecellrepository.GetList(p => p.StateNum == LocationState.LocationState_Full && p.IsStop == 0 && p.Floor == 3).OrderBy(p => p.Depth).Take(50);
  11892. foreach (var item in request.Location)
  11893. {
  11894. var cellcode = _basewarecellrepository.GetSingle(p => p.Code == item && p.StateNum == LocationState.LocationState_Full && p.IsStop == 0);
  11895. if (cellcode == null)
  11896. {
  11897. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11898. res.ResMsg = item + "不满足出库条件,请检查当前货位的状态";
  11899. return res;
  11900. }
  11901. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == cellcode.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11902. if (stock == null)
  11903. {
  11904. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11905. res.ResMsg = item + "没有库存";
  11906. return res;
  11907. }
  11908. if (!string.IsNullOrEmpty(stock.PreStock))
  11909. {
  11910. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11911. res.ResMsg = stock.ContGrpBarCode + "该库存已被锁定,不允许手动出库";
  11912. return res;
  11913. }
  11914. if (cellcode.Depth == 2)
  11915. {
  11916. var respon = MoveTask(cellcode.Code);
  11917. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  11918. {
  11919. return respon;
  11920. }
  11921. }
  11922. try
  11923. {
  11924. var bus = "";
  11925. if (request.EndPoint == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetHashCode())
  11926. {
  11927. bus = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription();
  11928. }
  11929. //else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_StackStockOut.GetHashCode())
  11930. //{
  11931. // bus = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription();
  11932. //}
  11933. else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetHashCode())
  11934. {
  11935. bus = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription();
  11936. }
  11937. else
  11938. {
  11939. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11940. res.ResMsg = stock.ContGrpBarCode + "业务类型参数错误";
  11941. return res;
  11942. }
  11943. var wcs = new WCS_TaskInfo()
  11944. {
  11945. Status = TaskStatus.NewBuild,
  11946. Type = TaskType.OutDepot,
  11947. Priority = 0,
  11948. Device = cellcode.SCRel,
  11949. SrmStation = "1",
  11950. AddrFrom = cellcode.Code,
  11951. BarCode = stock.ContGrpBarCode,
  11952. AddWho = "wms",
  11953. EditWho = "wms",
  11954. WarehouseCode = cellcode.WarehouseCode,
  11955. AddrTo = "",
  11956. Tunnel = cellcode.Tunnel.ToString(),
  11957. MaterialCode = stock.MatCode,
  11958. MatCode = stock.MatCode,
  11959. BusType = bus,
  11960. Floor = cellcode.Floor,
  11961. Grade = stock.Grade,
  11962. Length = stock.LengthQty,
  11963. ManualRemarks = request.User + "下发手动出库任务"
  11964. };
  11965. _db.BeginTran();
  11966. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11967. {
  11968. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  11969. EditTime = DateTime.Now
  11970. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  11971. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  11972. {
  11973. StateNum = LocationState.LocationState_StockOut,
  11974. EditTime = DateTime.Now
  11975. }, p => p.Code == cellcode.Code);
  11976. var flow = _mapper.Map<BillInvflow>(stock);
  11977. flow.Id = GetId();
  11978. flow.AddTime = DateTime.Now;
  11979. flow.EditTime = DateTime.Now;
  11980. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  11981. flow.Memo = "Test";
  11982. _billInvflow.Insert(flow);
  11983. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  11984. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  11985. var wcsdtl = new WCS_TaskDtl()
  11986. {
  11987. ID = Guid.NewGuid(),
  11988. CurPoint = wcstask.AddrFrom,
  11989. AddTime = DateTime.Now,
  11990. AddWho = "wms",
  11991. Enabled = true,
  11992. ParentTaskCode = wcstask.ID,
  11993. Desc = wcstask.BusType
  11994. };
  11995. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  11996. _db.CommitTran();
  11997. InsertErrorinfo(stock.ContGrpBarCode, "环线异常排出口:5186|,人工异常排出" + "操作人员:" + request.User + "|" + DateTime.Now);
  11998. }
  11999. catch (Exception ex)
  12000. {
  12001. _db.RollbackTran();
  12002. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12003. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  12004. return res;
  12005. }
  12006. }
  12007. return res;
  12008. }
  12009. private SRes MoveTask(string Cell)
  12010. {
  12011. lock (lockerPalletizingPackTask)
  12012. {
  12013. var res = new SRes() { Memo1 = "1" };
  12014. var cellform = _basewarecellrepository.GetFirst(p => p.Code == Cell && p.Depth == 2);
  12015. if (cellform == null)
  12016. {
  12017. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12018. res.ResMsg = "该任务所在货位不是二深货位";
  12019. res.Memo1 = "1";
  12020. return res;
  12021. }
  12022. var cellTo = _basewarecellrepository.GetFirst(p => p.Col == cellform.Col && p.Layer == cellform.Layer && p.Shelf == cellform.Shelf && p.Depth == 1 && p.IsStop == 0 && p.Floor == cellform.Floor && p.Tunnel == cellform.Tunnel);
  12023. if (cellTo == null)
  12024. {
  12025. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12026. res.ResMsg = Cell + "对应一深位货位被禁用或者不存在";
  12027. res.Memo1 = "1"; //1:不允许生成出库任务;2:允许
  12028. return res;
  12029. }
  12030. lock (lockerApplyLoc)
  12031. {
  12032. try
  12033. {
  12034. if (cellTo.StateNum == LocationState.LocationState_Empty)
  12035. {
  12036. res.Memo1 = "2";
  12037. return res;
  12038. }
  12039. else if (cellTo.StateNum == LocationState.LocationState_Full)
  12040. {
  12041. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == cellTo.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  12042. if (stock == null)
  12043. {
  12044. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12045. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  12046. res.Memo1 = "1";
  12047. return res;
  12048. }
  12049. //库位
  12050. var cell = ApplyLoc(new ApplyLocRequest()
  12051. {
  12052. IsMove = true,
  12053. MaterialId = stock.MatId,
  12054. MaterialCode = stock.MatCode,
  12055. TunnelNum = cellTo.Tunnel,
  12056. WarehuoseId = cellTo.WarehouseId,
  12057. Floor = cellTo.Floor,
  12058. Fork = 2,
  12059. Wbgroup = stock.WbGroupCode,
  12060. Wind = stock.Wind,
  12061. IsControlpanel = stock.IsControlpanel,
  12062. IsTorsChk = stock.IsTorsChk,
  12063. TorsChkQty = stock.TorsChkQty,
  12064. ProductTime = stock.ProductTime
  12065. });
  12066. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  12067. {
  12068. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12069. res.ResMsg = cell.ResMsg;
  12070. res.Memo1 = "1";
  12071. return res;
  12072. }
  12073. if (!_basewarecellrepository.IsAny(p => p.Code == cell.ResData.CellNo && p.Row == cell.ResData.Row && p.Col == cell.ResData.Colomn && p.Layer == cell.ResData.Layer && p.StateNum == LocationState.LocationState_Empty && p.IsStop == 0))
  12074. {
  12075. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12076. res.ResMsg = cell.ResData.CellNo + "已被使用";
  12077. res.Memo1 = "1";
  12078. return res;
  12079. }
  12080. if (_wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.Finish && (p.Type == TaskType.EnterDepot || p.Type == TaskType.TransferDepot) && p.AddrTo == cell.ResData.CellNo).SplitTable(p => p.Take(2)).Any())
  12081. {
  12082. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12083. res.ResMsg = cell.ResData.CellNo + "存在未结束的入库任务或移库任务,不允许使用";
  12084. res.Memo1 = "1";
  12085. return res;
  12086. }
  12087. var wcs = new WCS_TaskInfo()
  12088. {
  12089. Type = TaskType.TransferDepot,
  12090. Status = TaskStatus.NewBuild,
  12091. Priority = 0,
  12092. Device = cellTo.SCRel,
  12093. SrmStation = "",
  12094. AddrFrom = cellTo.Code,
  12095. AddrTo = cell.ResData.CellNo,
  12096. LastInteractionPoint = "",
  12097. BarCode = stock.ContGrpBarCode,
  12098. Length = stock.LengthQty,
  12099. AddTime = DateTime.Now,
  12100. StartTime = DateTime.Now,
  12101. DocID = 0,
  12102. PalletType = 1,
  12103. ProdLine = 0,
  12104. AddWho = "wms",
  12105. WarehouseCode = cellTo.WarehouseCode,
  12106. Enabled = true,
  12107. WorkBench = "",
  12108. Tunnel = cellTo.Tunnel.ToString(),
  12109. Floor = cellTo.Floor,
  12110. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  12111. };
  12112. _db.BeginTran();
  12113. var celltemp = _basewarecellrepository.GetSingle(p => p.Code == cell.ResData.CellNo);
  12114. if (celltemp.StateNum != LocationState.LocationState_Empty || celltemp.ContGrpId > 0 || !string.IsNullOrEmpty(celltemp.ContGrpBarCode))
  12115. {
  12116. _db.RollbackTran();
  12117. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12118. res.ResMsg = cell.ResData.CellNo + "已被使用";
  12119. res.Memo1 = "1";
  12120. _logger.LogInformation("货位状态1:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  12121. return res;
  12122. }
  12123. _logger.LogInformation("货位状态2:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  12124. var task = _taskrepository.InsertReturnEntity(wcs);
  12125. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  12126. var taskdlt = new WCS_TaskDtl()
  12127. {
  12128. ID = Guid.NewGuid(),
  12129. CurPoint = task.AddrFrom,
  12130. AddTime = DateTime.Now,
  12131. AddWho = "wms",
  12132. Enabled = true,
  12133. ParentTaskCode = task.ID,
  12134. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  12135. };
  12136. _taskdetailrepository.InsertableSplitTable(taskdlt);
  12137. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  12138. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  12139. _db.CommitTran();
  12140. res.Memo1 = "2";
  12141. }
  12142. else if (cellTo.StateNum == LocationState.LocationState_StockIn)
  12143. {
  12144. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12145. res.ResMsg = "一升位有入库任务,二升位不允许出库";
  12146. res.Memo1 = "1";
  12147. return res;
  12148. }
  12149. else if (cellTo.StateNum == LocationState.LocationState_StockOut)
  12150. {
  12151. res.Memo1 = "2";
  12152. return res;
  12153. }
  12154. else if (cellTo.StateNum == LocationState.LocationState_StockMove)
  12155. {
  12156. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12157. res.ResMsg = "一升位有移库任务,二升位不允许出库";
  12158. res.Memo1 = "1";
  12159. return res;
  12160. }
  12161. }
  12162. catch (Exception ex)
  12163. {
  12164. _db.RollbackTran();
  12165. _logger.LogInformation("移库任务创建失败" + ex.ToString());
  12166. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12167. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  12168. res.Memo1 = "1";
  12169. }
  12170. }
  12171. return res;
  12172. }
  12173. }
  12174. /// <summary>
  12175. /// 移库任务
  12176. /// </summary>
  12177. /// <param name="request"></param>
  12178. /// <returns></returns>
  12179. public SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request)
  12180. {
  12181. var res = new SRes<WcsMoveTaskResponse>()
  12182. {
  12183. ResData = new WcsMoveTaskResponse()
  12184. {
  12185. ResType = WcsContractWcsMoveTaskEnum.失败.GetHashCode(),
  12186. CellNo = ""
  12187. }
  12188. };
  12189. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).First();
  12190. if (wcstask == null)
  12191. {
  12192. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12193. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  12194. return res;
  12195. }
  12196. var dept2Loc = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom && p.Depth == 2);
  12197. if (dept2Loc == null)
  12198. {
  12199. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12200. res.ResMsg = "该任务所在货位不是二深货位";
  12201. return res;
  12202. }
  12203. var dept1Loc = _basewarecellrepository.GetFirst(p => p.Col == dept2Loc.Col && p.Layer == dept2Loc.Layer && p.Shelf == dept2Loc.Shelf && p.Depth == 1 && p.IsStop == 0 && p.Floor == dept2Loc.Floor);
  12204. if (dept1Loc == null)
  12205. {
  12206. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12207. res.ResMsg = dept2Loc.Code + "对应一深位货位被禁用或者不存在";
  12208. return res;
  12209. }
  12210. if (wcstask.Type != TaskType.OutDepot)
  12211. {
  12212. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12213. res.ResMsg = "只有出库任务才能调用此接口";
  12214. return res;
  12215. }
  12216. res.ResData.CellNo = dept1Loc.Code;
  12217. lock (lockerApplyLoc)
  12218. {
  12219. try
  12220. {
  12221. if (dept1Loc.StateNum == LocationState.LocationState_Empty)
  12222. {
  12223. res.ResData.ResType = WcsContractWcsMoveTaskEnum.允许2升位执行.GetHashCode();
  12224. res.ResData.CellNo = "";
  12225. return res;
  12226. }
  12227. else if (dept1Loc.StateNum == LocationState.LocationState_Full)
  12228. {
  12229. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  12230. res.ResData.CellNo = dept1Loc.Code;
  12231. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == dept1Loc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  12232. if (stock == null)
  12233. {
  12234. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12235. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  12236. return res;
  12237. }
  12238. var wareshouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  12239. //库位
  12240. var cell = ApplyLoc(new ApplyLocRequest()
  12241. {
  12242. IsMove = true,
  12243. MaterialId = stock.MatId,
  12244. MaterialCode = stock.MatCode,
  12245. TunnelNum = dept1Loc.Tunnel,
  12246. WarehuoseId = wareshouse.Id,
  12247. Floor = dept1Loc.Floor,
  12248. Fork = 2,
  12249. Wbgroup = stock.WbGroupCode,
  12250. Wind = stock.Wind,
  12251. IsControlpanel = stock.IsControlpanel,
  12252. IsTorsChk = stock.IsTorsChk,
  12253. TorsChkQty = stock.TorsChkQty,
  12254. ProductTime = stock.ProductTime
  12255. });
  12256. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  12257. {
  12258. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12259. res.ResMsg = cell.ResMsg;
  12260. return res;
  12261. }
  12262. var wcs = new WCS_TaskInfo()
  12263. {
  12264. Type = TaskType.TransferDepot,
  12265. Status = TaskStatus.NewBuild,
  12266. Priority = 0,
  12267. Device = dept1Loc.SCRel,
  12268. SrmStation = "",
  12269. AddrFrom = dept1Loc.Code,
  12270. AddrTo = cell.ResData.CellNo,
  12271. LastInteractionPoint = "",
  12272. BarCode = stock.ContGrpBarCode,
  12273. Length = stock.LengthQty,
  12274. AddTime = DateTime.Now,
  12275. StartTime = DateTime.Now,
  12276. DocID = 0,
  12277. PalletType = 1,
  12278. ProdLine = 0,
  12279. AddWho = "wms",
  12280. WarehouseCode = wareshouse.Code,
  12281. Enabled = true,
  12282. WorkBench = "",
  12283. Tunnel = dept1Loc.Tunnel.ToString(),
  12284. Floor = dept1Loc.Floor,
  12285. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  12286. };
  12287. _db.BeginTran();
  12288. var task = _taskrepository.InsertReturnEntity(wcs);
  12289. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  12290. var taskdlt = new WCS_TaskDtl()
  12291. {
  12292. ID = Guid.NewGuid(),
  12293. CurPoint = task.AddrFrom,
  12294. AddTime = DateTime.Now,
  12295. AddWho = "wms",
  12296. Enabled = true,
  12297. ParentTaskCode = task.ID,
  12298. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  12299. };
  12300. _taskdetailrepository.InsertableSplitTable(taskdlt);
  12301. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  12302. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  12303. _db.CommitTran();
  12304. return res;
  12305. }
  12306. else if (dept1Loc.StateNum == LocationState.LocationState_StockOut)
  12307. {
  12308. res.ResData.ResType = WcsContractWcsMoveTaskEnum.一深位有出库任务.GetHashCode();
  12309. res.ResData.CellNo = dept1Loc.Code;
  12310. return res;
  12311. }
  12312. //判断移库任务是否已经存在
  12313. else if (dept1Loc.StateNum == LocationState.LocationState_StockMove)
  12314. {
  12315. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  12316. res.ResData.CellNo = dept1Loc.Code;
  12317. return res;
  12318. }
  12319. else
  12320. {
  12321. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12322. res.ResMsg = "一深位有入库任务,优先执行入库任务";
  12323. return res;
  12324. }
  12325. }
  12326. catch (Exception ex)
  12327. {
  12328. _db.RollbackTran();
  12329. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12330. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  12331. _logger.LogInformation(ex.ToString());
  12332. return res;
  12333. }
  12334. }
  12335. return res;
  12336. }
  12337. private SRes SpoolMaterialInfoTrans1(SxSpoolMaterialInfoTrans1Request reqDto)
  12338. {
  12339. var res = new SRes();
  12340. try
  12341. {
  12342. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  12343. //物料
  12344. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  12345. if (mater == null)
  12346. {
  12347. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  12348. res.ResMsg = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  12349. return res;
  12350. }
  12351. //检查条码
  12352. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  12353. if (barstock == null)
  12354. {
  12355. //创建条码
  12356. var barinfo = new BillInvinit()
  12357. {
  12358. InvBarCode = reqDto.MatBarCode,
  12359. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  12360. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  12361. ExecDocsNo = reqDto.WorkOrder,
  12362. ExecDocsRowNo = reqDto.MatBarCode,
  12363. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  12364. InvInOut = InvInOutType.In,
  12365. ExecWho = "MES",
  12366. EditTime = DateTime.Now,
  12367. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  12368. InDocsNo = reqDto.WorkOrder,
  12369. InDocsRowNo = reqDto.MatBarCode,
  12370. SuppCode = "",
  12371. BomDocsNo = "",
  12372. BomSetId = 0,
  12373. SetGrpCode = "",
  12374. BomMatCode = "",
  12375. BomMatId = 0,
  12376. BomMatName = "",
  12377. MatId = mater.Id,
  12378. MatCode = mater.Code,
  12379. MatName = mater.Name,
  12380. LengthQty = reqDto.Length,
  12381. TareWQty = reqDto.Weight,
  12382. ProductTime = reqDto.ProductDate,
  12383. RFIDBarCode = "",
  12384. ProductMachCode = reqDto.WbCode,
  12385. Grade = reqDto.Grade,
  12386. HWBarCode = reqDto.SpoolCode,
  12387. HWTypeCode = reqDto.SpoolType,
  12388. ContGrpBarCode = reqDto.SpoolCode,
  12389. ContGrpId = IdFactory.NewId(),
  12390. IsFast = false,
  12391. IsRework = reqDto.IsRework,
  12392. CLBarCode = reqDto.MatBarCode,
  12393. Size = 1,
  12394. BackReason = "",
  12395. IsBack = reqDto.IsBlack,
  12396. IsCore = reqDto.IsCore,
  12397. SolderCount = reqDto.SolderCount,
  12398. IsTorsChk = reqDto.IsTorsChk,
  12399. WbGroupCode = reqDto.WbGroupCode
  12400. };
  12401. _billInvinitrepository.Insert(barinfo);
  12402. }
  12403. else
  12404. {
  12405. }
  12406. //库存
  12407. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  12408. if (stock == null)
  12409. {
  12410. var inv = new BillInvnow()
  12411. {
  12412. InvBarCode = reqDto.MatBarCode,
  12413. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  12414. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  12415. ExecDocsNo = reqDto.WorkOrder,
  12416. ExecDocsRowNo = reqDto.MatBarCode,
  12417. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  12418. InvInOut = InvInOutType.In,
  12419. ExecWho = "MES",
  12420. EditTime = DateTime.Now,
  12421. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  12422. InDocsNo = reqDto.WorkOrder,
  12423. InDocsRowNo = reqDto.MatBarCode,
  12424. SuppCode = "",
  12425. BomDocsNo = "",
  12426. BomSetId = 0,
  12427. SetGrpCode = "",
  12428. BomMatCode = "",
  12429. BomMatId = 0,
  12430. BomMatName = "",
  12431. MatId = mater.Id,
  12432. MatCode = mater.Code,
  12433. MatName = mater.Name,
  12434. LengthQty = reqDto.Length,
  12435. TareWQty = reqDto.Weight,
  12436. ProductTime = reqDto.ProductDate,
  12437. RFIDBarCode = "",
  12438. ProductMachCode = reqDto.WbCode,
  12439. Grade = reqDto.Grade,
  12440. HWBarCode = reqDto.SpoolCode,
  12441. HWTypeCode = "BS1",
  12442. ContGrpBarCode = reqDto.SpoolCode,
  12443. ContGrpId = IdFactory.NewId(),
  12444. IsFast = false,
  12445. IsRework = reqDto.IsRework,
  12446. CLBarCode = reqDto.MatBarCode,
  12447. Size = 1,
  12448. BackReason = "",
  12449. IsBack = reqDto.IsBlack,
  12450. IsCore = reqDto.IsCore,
  12451. WbGroupCode = reqDto.WbGroupCode,
  12452. IsTorsChk = reqDto.IsTorsChk,
  12453. IsControlpanel = false,
  12454. SkuCode = ""
  12455. };
  12456. _billInvnowrepository.Insert(inv);
  12457. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  12458. }
  12459. else
  12460. {
  12461. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  12462. {
  12463. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12464. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  12465. return res;
  12466. }
  12467. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  12468. {
  12469. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12470. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  12471. return res;
  12472. }
  12473. }
  12474. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  12475. if (task != null && task.Type == TaskType.OutDepot)
  12476. {
  12477. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12478. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  12479. return res;
  12480. }
  12481. if (task != null && task.Type == TaskType.EnterDepot)
  12482. {
  12483. //res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  12484. //res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  12485. return res;
  12486. }
  12487. var wcs = new WCS_TaskInfo()
  12488. {
  12489. Status = TaskStatus.NewBuild,
  12490. Type = TaskType.EnterDepot,
  12491. Priority = 0,
  12492. Device = "",
  12493. SrmStation = "",
  12494. AddrFrom = "root",
  12495. BarCode = reqDto.SpoolCode,
  12496. AddWho = "wms",
  12497. EditWho = "wms",
  12498. WarehouseCode = wareHosue.Code,
  12499. AddrTo = "",
  12500. Tunnel = "",
  12501. MaterialCode = mater.Code,
  12502. MatCode = mater.Code,
  12503. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  12504. Grade = reqDto.Grade,
  12505. Length = reqDto.Length,
  12506. WorkBench = reqDto.WbCode,
  12507. WorkOrder = reqDto.WorkOrder,
  12508. GoodsType = 0
  12509. };
  12510. _db.BeginTran();
  12511. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  12512. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  12513. var wcsdtl = new WCS_TaskDtl()
  12514. {
  12515. ID = Guid.NewGuid(),
  12516. CurPoint = reqDto.SpoolCode,
  12517. AddTime = DateTime.Now,
  12518. AddWho = "wms",
  12519. Enabled = true,
  12520. ParentTaskCode = wcstask.ID,
  12521. Desc = wcstask.BusType
  12522. };
  12523. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  12524. _db.CommitTran();
  12525. }
  12526. catch (Exception ex)
  12527. {
  12528. _db.RollbackTran();
  12529. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12530. res.ResMsg = ex.ToString();
  12531. }
  12532. return res;
  12533. }
  12534. /// <summary>
  12535. /// 扭转入库分配楼层
  12536. /// </summary>
  12537. /// <param name="reqDto"></param>
  12538. /// <returns></returns>
  12539. public SRes<int> TorsChkFloor(TorsChkFloorRequest reqDto)
  12540. {
  12541. var res = new SRes<int>();
  12542. if (reqDto.Count <= 0)
  12543. {
  12544. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  12545. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription() + "任务数量不能为0";
  12546. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip6", new RedisErrorInfo() { Equip = "TorsChkEquip6", Con = "参数错误,请求任务数量不能为0", Time = DateTime.Now });
  12547. return res;
  12548. }
  12549. var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent);
  12550. var bar = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.BusType == "扭转回库").OrderByDescending(p => p.AddTime).First();
  12551. var stock = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == bar.BarCode && p.InvStateCode == "InvEcecState_BuildUp").First();
  12552. var currentTime = stock.ProductTime;
  12553. var startTime = currentTime.Hour >= 13 ? currentTime.Date.AddHours(13) : currentTime.Date.AddDays(-1).AddHours(13);
  12554. var endTime = currentTime.Hour >= 13 ? currentTime.Date.AddDays(1).AddHours(8) : currentTime.Date.AddHours(8);
  12555. //今天这一批次的扭转入库的分配楼层数量
  12556. var existstock = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.IsTorsChk == true && p.TorsChkQty == 1 && p.ProductTime >= startTime && p.ProductTime <= endTime).ToList();
  12557. int row = 8;
  12558. var cellfloor1stockcount = existstock.Where(p => p.PutLayer >= 1 && p.PutLayer <= 4 && p.PutRow > row).Count(); //1楼层同规格数量
  12559. var cellfloor2stockcount = existstock.Where(p => p.PutLayer >= 5 && p.PutLayer <= 8 && p.PutRow > row).Count(); //2楼层同规格数量
  12560. var cellfloor3stockcount = existstock.Where(p => p.PutLayer >= 9 && p.PutLayer <= 12 && p.PutRow > row).Count(); //3楼层同规格数量
  12561. //bool isTobeTors = false;
  12562. int tun = 2;
  12563. //int row = 8;
  12564. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty).ToList();
  12565. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  12566. if (disabletunnels != null && disabletunnels.Any())
  12567. {
  12568. foreach (var item in disabletunnels)
  12569. {
  12570. var distun = int.Parse(item.Default1);
  12571. var disfloor = int.Parse(item.Default2);
  12572. var disids = cell.Where(p => p.Floor == disfloor && p.Tunnel == distun).Select(p => p.Id);
  12573. cell = cell.Where(p => !disids.Contains(p.Id)).ToList();
  12574. }
  12575. }
  12576. var cellfloor1count = cell.Where(p => p.Floor == 1 && p.Tunnel > tun).Count(); //1楼层可用的货位数
  12577. var cellfloor2count = cell.Where(p => p.Floor == 2 && p.Tunnel > tun).Count(); //2楼层可用的货位数
  12578. var cellfloor3count = cell.Where(p => p.Floor == 3 && p.Tunnel > tun).Count(); //3楼层可用的货位数
  12579. var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  12580. if (!string.IsNullOrEmpty(forbidlayer))
  12581. {
  12582. if (forbidlayer.Contains("1")) cellfloor1count = 0;
  12583. if (forbidlayer.Contains("2")) cellfloor2count = 0;
  12584. if (forbidlayer.Contains("3")) cellfloor3count = 0;
  12585. }
  12586. var tempcells = new List<Tuple<int, int, double>>() {
  12587. new Tuple<int, int,double>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count * 1.0)),
  12588. new Tuple<int, int,double>(2,cellfloor2count,cellfloor2stockcount / (cellfloor2count * 1.0)),
  12589. new Tuple<int, int,double>(3,cellfloor3count,cellfloor3stockcount / (cellfloor3count * 1.0)),
  12590. };
  12591. //tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();
  12592. tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  12593. //每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  12594. var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  12595. if (tempcells[0].Item2 > (reqDto.Count + 10))
  12596. {
  12597. if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > floorTaskCount || tempcells[0].Item2 == 0)
  12598. {
  12599. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  12600. {
  12601. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  12602. {
  12603. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12604. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12605. res.ResData = 0;
  12606. return res;
  12607. }
  12608. else
  12609. {
  12610. res.ResData = tempcells[2].Item1;
  12611. }
  12612. }
  12613. else
  12614. {
  12615. res.ResData = tempcells[1].Item1;
  12616. }
  12617. }
  12618. else
  12619. {
  12620. res.ResData = tempcells[0].Item1;
  12621. }
  12622. }
  12623. else
  12624. {
  12625. if (tempcells[1].Item2 > (reqDto.Count + 10))
  12626. {
  12627. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  12628. {
  12629. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  12630. {
  12631. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12632. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12633. res.ResData = 0;
  12634. return res;
  12635. }
  12636. else
  12637. {
  12638. res.ResData = tempcells[2].Item1;
  12639. }
  12640. }
  12641. else
  12642. {
  12643. res.ResData = tempcells[1].Item1;
  12644. }
  12645. }
  12646. else
  12647. {
  12648. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  12649. {
  12650. res.ResData = tempcells[2].Item1;
  12651. }
  12652. else
  12653. {
  12654. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12655. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12656. res.ResData = 0;
  12657. return res;
  12658. }
  12659. }
  12660. }
  12661. return res;
  12662. }
  12663. public SRes PalletizingPatchWheel(PalletizingPatchWheelRequest request)
  12664. {
  12665. var res = new SRes();
  12666. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First();
  12667. if (task == null)
  12668. {
  12669. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12670. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  12671. return res;
  12672. }
  12673. var taskold = _wcstaskoldrepository.AsQueryable().Where(p => p.WmsTask == request.TaskNum && p.Id != request.TaskNum).SplitTable(p => p.Take(2)).First();
  12674. if (taskold != null)
  12675. {
  12676. return res;
  12677. }
  12678. var pallet = _palletizrepository.GetSingle(p => p.Id == task.PalletizingId && p.PalletizState == 0);
  12679. if (pallet == null)
  12680. {
  12681. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12682. res.ResMsg = request.TaskNum + "没有找到码垛基础信息";
  12683. return res;
  12684. }
  12685. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  12686. if (stocks == null)
  12687. {
  12688. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  12689. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  12690. return res;
  12691. }
  12692. var rulebox = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  12693. try
  12694. {
  12695. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  12696. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == stocks.Grade && p.HWTypeCode == stocks.HWTypeCode
  12697. && p.IsRework == stocks.IsRework && p.IsBlack == stocks.IsBlack && p.MatCode == task.MatCode && p.WbGroupCode == stocks.WbGroupCode && p.SolderCount == stocks.SolderCount
  12698. && p.IsControlpanel == stocks.IsControlpanel && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  12699. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  12700. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 1 && p.Id == pallet.BoxRuleId)
  12701. on stock.InDocsNo equals rule1.DocsNo
  12702. select new
  12703. {
  12704. stock.MatCode,
  12705. stock.InvBarCode,
  12706. stock.Grade,
  12707. stock.InvStateCode,
  12708. stock.ProductTime,
  12709. stock.WbGroupCode,
  12710. stock.IsTorsChk,
  12711. stock.TorsChkQty,
  12712. stock.TorsChkValue,
  12713. stock.TorsChkChord,
  12714. stock.TorsChkFlatness,
  12715. stock.HoldTime,
  12716. stock.ProductMachCode,
  12717. stock.IsControlpanel,
  12718. stock.HWTypeCode,
  12719. stock.IsBlack,
  12720. stock.IsRework,
  12721. stock.SolderCount,
  12722. stock.TorsChkChordIsGood,
  12723. stock.TorsChkFlatnessIsGood,
  12724. stock.TorsChkValueIsGood,
  12725. loc.Col,
  12726. loc.Layer,
  12727. loc.Shelf,
  12728. loc.Depth,
  12729. loc.Code,
  12730. loc.Tunnel,
  12731. loc.SCRel,
  12732. loc.Floor,
  12733. loc.WarehouseCode,
  12734. loc.ContGrpBarCode,
  12735. loc.ContGrpId,
  12736. loc.Id,
  12737. loc.StateNum,
  12738. rule1.SkuCode
  12739. };
  12740. invlist = invlist.Distinct();
  12741. if (!string.IsNullOrEmpty(rulebox.SkuCode))
  12742. {
  12743. invlist = invlist.Where(p => p.SkuCode == rulebox.SkuCode);
  12744. }
  12745. if (pallet.BoxRule == "层配")
  12746. {
  12747. //计算扭转值、弓高、平直度
  12748. invlist = invlist.Where(p => p.TorsChkValueIsGood == "OK" && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.IsTorsChk == true && p.TorsChkQty > 0 &&
  12749. Math.Abs((decimal)(stocks.TorsChkValue - p.TorsChkValue)) > 0.1.ObjToDecimal() && Math.Abs((decimal)(stocks.TorsChkFlatness - p.TorsChkFlatness)) > 0.1.ObjToDecimal() && Math.Abs((decimal)(stocks.TorsChkChord - p.TorsChkChord)) > 0.1.ObjToDecimal());
  12750. }
  12751. else
  12752. {
  12753. if (stocks.IsControlpanel == true)
  12754. {
  12755. invlist = invlist.Where(p => p.IsTorsChk == true && p.IsControlpanel == true && p.TorsChkQty > 0);
  12756. }
  12757. else
  12758. {
  12759. invlist = invlist.Where(p => p.IsControlpanel == false);
  12760. }
  12761. }
  12762. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  12763. if (tunlist.Any())
  12764. {
  12765. if (tunlist.Where(p => p.Default2 == "1").Any())
  12766. {
  12767. invlist = invlist.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  12768. //invlist3 = invlist3.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  12769. }
  12770. if (tunlist.Where(p => p.Default2 == "2").Any())
  12771. {
  12772. invlist = invlist.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  12773. //invlist3 = invlist3.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  12774. }
  12775. if (tunlist.Where(p => p.Default2 == "3").Any())
  12776. {
  12777. invlist = invlist.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  12778. //invlist3 = invlist3.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  12779. }
  12780. }
  12781. if (!invlist.Any())
  12782. {
  12783. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  12784. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有待补的工字轮";
  12785. return res;
  12786. }
  12787. invlist = invlist.OrderBy(p => p.ProductTime);
  12788. foreach (var item in invlist)
  12789. {
  12790. if (item.Depth == 2)
  12791. {
  12792. var respon = MoveTask(item.Code);
  12793. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  12794. {
  12795. continue;
  12796. }
  12797. }
  12798. var wcs = new WCS_TaskInfo()
  12799. {
  12800. Status = TaskStatus.NewBuild,
  12801. Type = TaskType.OutDepot,
  12802. Priority = 0,
  12803. Device = item.SCRel,
  12804. SrmStation = item.SCRel,
  12805. AddrFrom = item.Code,
  12806. BarCode = item.ContGrpBarCode,
  12807. AddWho = "wms",
  12808. EditWho = "wms",
  12809. WarehouseCode = "sxhouse",
  12810. AddrTo = task.AddrTo,
  12811. FullQty = 1,
  12812. AgvTaskID = task.AgvTaskID, //层配层数
  12813. Tunnel = item.Tunnel.ToString(),
  12814. MaterialCode = item.MatCode,
  12815. MatCode = item.MatCode,
  12816. OutType = OutTypeEnum.自动出库任务,
  12817. BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
  12818. Floor = item.Floor,
  12819. Grade = item.Grade,
  12820. WorkBench = item.ProductMachCode,
  12821. WmsTask = request.TaskNum, //需要补轮子的任务号
  12822. PalletizingId = task.PalletizingId,
  12823. Robot = task.Robot,
  12824. ProdLine = task.ProdLine,
  12825. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2,
  12826. ManualRemarks = "排走的工字轮" + task.BarCode + "扫码设备" + request.Equip
  12827. };
  12828. _db.BeginTran();
  12829. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  12830. {
  12831. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  12832. EditTime = DateTime.Now,
  12833. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip
  12834. }, p => p.ContGrpBarCode == item.ContGrpBarCode);
  12835. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  12836. {
  12837. StateNum = LocationState.LocationState_StockOut,
  12838. EditTime = DateTime.Now
  12839. }, p => p.Code == item.Code);
  12840. var stock1 = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode);
  12841. var flow1 = _mapper.Map<BillInvflow>(stock1);
  12842. flow1.Id = GetId();
  12843. flow1.AddTime = DateTime.Now;
  12844. flow1.EditTime = DateTime.Now;
  12845. flow1.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  12846. flow1.Memo = "装箱码垛出库";
  12847. _billInvflow.Insert(flow1);
  12848. var flow = _mapper.Map<BillInvflow>(stocks);
  12849. flow.Id = GetId();
  12850. flow.AddTime = DateTime.Now;
  12851. flow.EditTime = DateTime.Now;
  12852. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  12853. flow.Memo = "异常补轮" + request.TaskNum;
  12854. _billInvnowrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  12855. _billInvflow.Insert(flow);
  12856. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  12857. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  12858. var wcsdtl = new WCS_TaskDtl()
  12859. {
  12860. ID = Guid.NewGuid(),
  12861. CurPoint = wcstask.AddrFrom,
  12862. AddTime = DateTime.Now,
  12863. AddWho = "wms",
  12864. Enabled = true,
  12865. ParentTaskCode = wcstask.ID,
  12866. Desc = wcstask.BusType
  12867. };
  12868. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  12869. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  12870. var layer = new PalletLayerMath()
  12871. {
  12872. ContGrpId = (long)stock1.ContGrpId,
  12873. ContBarCode = stock1.ContGrpBarCode,
  12874. Layer = task.AgvTaskID,
  12875. SkuCode = rulebox.SkuCode,
  12876. Finish = 0,
  12877. PboxruleId = rulebox.Id,
  12878. Istask = 1,
  12879. Palletequip = task.AddrTo,
  12880. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip,
  12881. AddWho = "WCS",
  12882. EditWho = "WCS"
  12883. };
  12884. _palletlayerMathrepository.Insert(layer);
  12885. _db.CommitTran();
  12886. return res;
  12887. }
  12888. }
  12889. catch (Exception ex)
  12890. {
  12891. _db.RollbackTran();
  12892. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12893. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  12894. return res;
  12895. }
  12896. return res;
  12897. }
  12898. /// <summary>
  12899. /// 码垛强制结盘
  12900. /// </summary>
  12901. /// <param name="request"></param>
  12902. /// <returns></returns>
  12903. public SRes PalletizingForceknot(PalletizingForceknotRequest request)
  12904. {
  12905. var res = new SRes();
  12906. try
  12907. {
  12908. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  12909. if (pallet == null)
  12910. {
  12911. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12912. res.ResMsg = request.Equip + "没有当前码垛工位信息";
  12913. return res;
  12914. }
  12915. _palletizrepository.AsUpdateable().SetColumns(p => new Palletizing()
  12916. {
  12917. Finish = 1 + pallet.Finish,
  12918. Memo = "强制结盘时间:" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")
  12919. }).Where(p => p.Id == pallet.Id).ExecuteCommand();
  12920. }
  12921. catch (Exception ex)
  12922. {
  12923. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  12924. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  12925. return res;
  12926. }
  12927. return res;
  12928. }
  12929. public SRes Palletizinginfobinde(PalletizinginfobindeRequest request)
  12930. {
  12931. var res = new SRes();
  12932. try
  12933. {
  12934. if (!request.TaskNum.Any())
  12935. {
  12936. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  12937. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  12938. return res;
  12939. }
  12940. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  12941. if (pallet == null)
  12942. {
  12943. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12944. res.ResMsg = request.Equip + "没有当前码垛工位的单据信息";
  12945. return res;
  12946. }
  12947. var rule = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  12948. if (rule == null)
  12949. {
  12950. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12951. res.ResMsg = request.Equip + "码垛工位没有找到对应的装箱信息";
  12952. return res;
  12953. }
  12954. DateTime date = DateTime.Now;
  12955. var taskgroup = string.Join("|", request.TaskNum.OrderBy(p => p).ToList());
  12956. foreach (var item in request.TaskNum)
  12957. {
  12958. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == item && p.AddrTo == request.Equip && p.Status < dto.TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First();
  12959. if (task == null)
  12960. {
  12961. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12962. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  12963. return res;
  12964. }
  12965. if (task.PalletizingId != pallet.Id)
  12966. {
  12967. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12968. res.ResMsg = pallet.Equip + "当前工位抓取任务和码垛主表信息不匹配,不能完成抓取,请确认是否混箱";
  12969. return res;
  12970. }
  12971. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  12972. if (stock == null)
  12973. {
  12974. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  12975. res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  12976. return res;
  12977. }
  12978. var palletdetails = _palletizdetailrepository.GetSingle(p => p.TaskNum == item);
  12979. if (palletdetails != null)
  12980. {
  12981. if (palletdetails.Memo == taskgroup)
  12982. {
  12983. continue;
  12984. }
  12985. else
  12986. {
  12987. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12988. res.ResMsg = pallet.Equip + "当前任务请确认是否重复上传,不能完成抓取";
  12989. return res;
  12990. }
  12991. }
  12992. //根据任务实际计算层
  12993. var fincount = _palletlayerMathrepository.Count(p => p.Palletequip == task.AddrTo && p.Istask == 1 && p.Finish == 1);
  12994. int layer = (fincount / 12) + 1;
  12995. //var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//近3张分表
  12996. //foreach (var tbname in tables)
  12997. //{
  12998. // //更新1点到6点时间内数据
  12999. // _wcstaskoldrepository.Context.Updateable<WCS_TaskOld>().AS(tbname.TableName)//使用分表名
  13000. // .SetColumns(it => new WCS_TaskOld()
  13001. // {
  13002. // EndTime = DateTime.Now,
  13003. // ManualRemarks = layer.ToString()
  13004. // })
  13005. // .Where(p => p.Id == item)
  13006. // .ExecuteCommand();
  13007. //}
  13008. _db.BeginTran();
  13009. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13010. {
  13011. Finish = 1
  13012. }, p => p.ContBarCode == task.BarCode && p.ContGrpId == stock.ContGrpId && p.Palletequip == task.AddrTo && p.Istask == 1);
  13013. var palletdetail = new Palletizingdetail()
  13014. {
  13015. PalletizingId = pallet.Id,
  13016. TaskNum = item,
  13017. PackRule = pallet.BoxRule.ToString(),
  13018. Sku = rule.SkuCode,
  13019. BarCode = task.BarCode,
  13020. Layer = layer,
  13021. WbGroupCode = stock.WbGroupCode,
  13022. GradeCode = stock.Grade,
  13023. AddWho = "",
  13024. EditWho = "",
  13025. MaterialCode = stock.MatCode,
  13026. MaterialDesc = stock.MatName,
  13027. InDocsNo = stock.InDocsNo,
  13028. Batch = rule.BatchNo,
  13029. IsBlack = stock.IsBlack,
  13030. IsControlpanel = pallet.IsControlpanel,
  13031. Winding = stock.Wind,
  13032. SolderCount = stock.SolderCount,
  13033. PalletizingDate = date,
  13034. OvcFlag = pallet.IsControlpanel == true ? 2 : 0,
  13035. OvcValue = string.IsNullOrEmpty(stock.TorsChkValue.ToString()) ? 0.ToString() : stock.TorsChkValue.ToString(),
  13036. EquNo = pallet.Equip,
  13037. TolWQty = stock.TolWQty,
  13038. TareWQty = stock.TareWQty,
  13039. NetWQty = stock.NetWQty,
  13040. CLBarCode = stock.CLBarCode,
  13041. BoxCode = rule.PBoxCode,
  13042. Memo = taskgroup
  13043. //Memo = layer.ToString()
  13044. };
  13045. _palletizdetailrepository.Insert(palletdetail);
  13046. //更新历史任务
  13047. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  13048. //{
  13049. // EndTime = DateTime.Now,
  13050. // ManualRemarks = layer.ToString()
  13051. //}).Where(p => p.Id == task.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  13052. _logger.LogInformation("实际层末尾");
  13053. _db.CommitTran();
  13054. }
  13055. }
  13056. catch (Exception ex)
  13057. {
  13058. _db.RollbackTran();
  13059. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  13060. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13061. return res;
  13062. }
  13063. return res;
  13064. }
  13065. public SRes GetMesErrorInfo(SxErrorinfoRequest request)
  13066. {
  13067. var res = new SRes();
  13068. var wcsCode = _errorinfowcs.AsQueryable().With(SqlWith.NoLock).Where(v => v.ContBarCode == request.Code).OrderByDescending(p => p.AddTime).ToList();
  13069. if (!wcsCode.Any())
  13070. {
  13071. res.ResMsg = request.Code + ",扫码失败";
  13072. res.Memo1 = request.Code + ",扫码失败";
  13073. return res;
  13074. }
  13075. else
  13076. {
  13077. res.Memo1 = request.Code + "," + wcsCode.First().Message;
  13078. return res;
  13079. }
  13080. return res;
  13081. }
  13082. private SRes SpcErrorTaskinfo(PalletizingPackTaskRequest request)
  13083. {
  13084. var res = new SRes();
  13085. try
  13086. {
  13087. var wcs = new WCS_TaskInfo()
  13088. {
  13089. Status = TaskStatus.NewBuild,
  13090. Type = TaskType.OutDepot,
  13091. Priority = 0,
  13092. Device = request.Srm,
  13093. SrmStation = request.Srm,
  13094. AddrFrom = request.CellCode,
  13095. BarCode = request.Code,
  13096. AddWho = "wms",
  13097. EditWho = "wms",
  13098. WarehouseCode = "sxhouse",
  13099. AddrTo = "5186",
  13100. Tunnel = request.Tunnel,
  13101. MaterialCode = request.Mater,
  13102. MatCode = request.Mater,
  13103. OutType = OutTypeEnum.自动出库任务,
  13104. BusType = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription(),
  13105. Floor = request.Floor,
  13106. Grade = request.Grade,
  13107. ManualRemarks = request.Memo
  13108. };
  13109. _db.BeginTran();
  13110. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  13111. {
  13112. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  13113. EditTime = DateTime.Now
  13114. }, p => p.ContGrpBarCode == request.Code);
  13115. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  13116. {
  13117. StateNum = LocationState.LocationState_StockOut,
  13118. EditTime = DateTime.Now
  13119. }, p => p.Code == request.CellCode);
  13120. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  13121. var flow = _mapper.Map<BillInvflow>(stock);
  13122. flow.Id = GetId();
  13123. flow.AddTime = DateTime.Now;
  13124. flow.EditTime = DateTime.Now;
  13125. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  13126. flow.Memo = "异常出库";
  13127. _billInvflow.Insert(flow);
  13128. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  13129. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  13130. var wcsdtl = new WCS_TaskDtl()
  13131. {
  13132. ID = Guid.NewGuid(),
  13133. CurPoint = request.Code,
  13134. AddTime = DateTime.Now,
  13135. AddWho = "wms",
  13136. Enabled = true,
  13137. ParentTaskCode = wcstask.ID,
  13138. Desc = wcstask.BusType
  13139. };
  13140. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  13141. _db.CommitTran();
  13142. }
  13143. catch (Exception ex)
  13144. {
  13145. _db.RollbackTran();
  13146. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13147. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13148. return res;
  13149. }
  13150. return res;
  13151. }
  13152. /// <summary>
  13153. /// B质量码垛出库
  13154. /// </summary>
  13155. /// <param name="request"></param>
  13156. /// <returns></returns>
  13157. public SRes PalletizingPackBStockOut(PalletizingPackStockOutRequest request)
  13158. {
  13159. var res = new SRes();
  13160. var isforbid = _sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").Default1;
  13161. if (isforbid == "1")
  13162. {
  13163. res.ResMsg = "B质量码垛已禁用";
  13164. return res;
  13165. }
  13166. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "BGrade");
  13167. if (palletlist.Any())
  13168. {
  13169. foreach (var item in palletlist)
  13170. {
  13171. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  13172. if (equips == null)
  13173. {
  13174. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut2", new RedisErrorInfo() { Equip = "BGradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  13175. continue;
  13176. }
  13177. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  13178. if (!palletMach.Any())
  13179. {
  13180. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut3", new RedisErrorInfo() { Equip = "BGradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  13181. continue;
  13182. }
  13183. //var curlayer = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 1).Any() ? _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer) : 1;
  13184. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13185. var curdocid = maxdocid + 1;
  13186. if (palletMach.Any())
  13187. {
  13188. var pid = palletMach.First().PalletizingId;
  13189. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  13190. {
  13191. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13192. }
  13193. }
  13194. foreach (var pallets in palletMach)
  13195. {
  13196. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  13197. if (cell == null)
  13198. {
  13199. continue;
  13200. }
  13201. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13202. if (invs == null)
  13203. {
  13204. continue;
  13205. }
  13206. var root = DetermineRoot(pallets.Palletequip);
  13207. //先判断二升位是否能出库
  13208. if (cell.Depth == 2)
  13209. {
  13210. var respon = MoveTask(cell.Code);
  13211. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13212. {
  13213. continue;
  13214. }
  13215. }
  13216. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  13217. {
  13218. Code = pallets.ContBarCode,
  13219. CellCode = cell.Code,
  13220. Srm = cell.SCRel,
  13221. Tunnel = cell.Tunnel.ToString(),
  13222. Floor = cell.Floor,
  13223. Grade = invs.Grade,
  13224. Mater = invs.MatCode,
  13225. SkuCode = pallets.SkuCode,
  13226. PalletLayer = 0,
  13227. ProductMachCode = invs.ProductMachCode,
  13228. Equip = item.Equip,
  13229. PalletizingId = item.Id,
  13230. Robot = root,
  13231. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  13232. DocId = curdocid
  13233. });
  13234. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13235. {
  13236. continue;
  13237. }
  13238. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13239. {
  13240. Istask = 1,
  13241. Layer = 0
  13242. }, p => p.ContBarCode == invs.ContGrpBarCode);
  13243. }
  13244. }
  13245. }
  13246. //取视图码垛设备号
  13247. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  13248. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Memo) && p.AddWho != "禁用").Any())
  13249. {
  13250. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  13251. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13252. res.ResMsg = "没有空闲的码垛工位";
  13253. return res;
  13254. }
  13255. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  13256. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  13257. if (!devices.Where(p => p.pH_STATUS == true).Any())
  13258. {
  13259. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  13260. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13261. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  13262. return res;
  13263. }
  13264. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  13265. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent);
  13266. //
  13267. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  13268. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "B" && string.IsNullOrEmpty(p.PreStock) //&& p.ContUsageQty <= 0
  13269. && ((p.ProductMachCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours <= timeOutHoldHours) || (!p.ProductMachCode.Contains("R") && ((DateTime.Now - p.OneInTime).TotalHours <= timeOutHoldHours))))
  13270. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  13271. select new StockTemp
  13272. {
  13273. MatCode = stock.MatCode,
  13274. InvBarCode = stock.InvBarCode,
  13275. Grade = stock.Grade,
  13276. InvStateCode = stock.InvStateCode,
  13277. ProductTime = stock.ProductTime,
  13278. WbGroupCode = stock.WbGroupCode,
  13279. IsTorsChk = stock.IsTorsChk,
  13280. TorsChkQty = stock.TorsChkQty,
  13281. TorsChkValue = stock.TorsChkValue,
  13282. HoldTime = stock.HoldTime,
  13283. ProductMachCode = stock.ProductMachCode,
  13284. IsControlpanel = stock.IsControlpanel,
  13285. HWTypeCode = stock.HWTypeCode,
  13286. SolderCount = stock.SolderCount,
  13287. IsRework = stock.IsRework,
  13288. IsBlack = stock.IsBlack,
  13289. Col = loc.Col,
  13290. Layer = loc.Layer,
  13291. Shelf = loc.Shelf,
  13292. Depth = loc.Depth,
  13293. Code = loc.Code,
  13294. Tunnel = loc.Tunnel,
  13295. SCRel = loc.SCRel,
  13296. Floor = loc.Floor,
  13297. WarehouseCode = loc.WarehouseCode,
  13298. ContGrpBarCode = loc.ContGrpBarCode,
  13299. ContGrpId = loc.ContGrpId,
  13300. Id = loc.Id,
  13301. StateNum = loc.StateNum,
  13302. Wind = stock.Wind,
  13303. InDocsNo = stock.InDocsNo
  13304. };
  13305. if (!invlist1.Any())
  13306. {
  13307. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  13308. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13309. res.ResMsg = "库存不足";
  13310. return res;
  13311. }
  13312. invlist1 = invlist1.Distinct();
  13313. var temps = invlist1.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  13314. var rules = new BillPboxrule();
  13315. foreach (var item in temps)
  13316. {
  13317. var invlist2 = invlist1.Where(p => p.HWTypeCode == item.Key);
  13318. if (!invlist2.Any())
  13319. {
  13320. continue;
  13321. }
  13322. var mater = invlist2.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  13323. foreach (var stockTemps in mater)
  13324. {
  13325. var invlist = invlist2.Where(p => p.MatCode == stockTemps.Key);
  13326. if (!invlist.Any())
  13327. {
  13328. continue;
  13329. }
  13330. //else if (invlist.Count() < 36)
  13331. //{
  13332. // res.ResMsg = "B质量数量不满足";
  13333. // continue;
  13334. //}
  13335. var ti = DateTime.Now;
  13336. var yaar = ti.Year.ToString().Substring(2, 2);
  13337. var month = ti.Month.ToString().PadLeft(2, '0');
  13338. var day = ti.Day.ToString().PadLeft(2, '0');
  13339. //获取当天最大箱号
  13340. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "B" && p.Year == yaar && p.Month == month && p.Day == day);
  13341. string boxserial = "HAZDB";
  13342. if (maxnumre.Any())
  13343. {
  13344. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  13345. _boxserialrepository.Insert(new BillBoxSerial()
  13346. {
  13347. Year = yaar,
  13348. Month = month,
  13349. Day = day,
  13350. Num = maxnumre.Max(q => q.Num) + 1,
  13351. BoxNum = boxserial,
  13352. Grade = "B",
  13353. AddTime = DateTime.Now,
  13354. AddWho = "wms",
  13355. EditTime = DateTime.Now,
  13356. EditWho = "wms"
  13357. });
  13358. }
  13359. else
  13360. {
  13361. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  13362. _boxserialrepository.Insert(new BillBoxSerial()
  13363. {
  13364. Year = yaar,
  13365. Month = month,
  13366. Day = day,
  13367. Num = 1,
  13368. BoxNum = boxserial,
  13369. Grade = "B",
  13370. AddTime = DateTime.Now,
  13371. AddWho = "wms",
  13372. EditTime = DateTime.Now,
  13373. EditWho = "wms"
  13374. });
  13375. }
  13376. //B质量不区分绕向
  13377. //invlist = invlist.Where(p => p.Wind == "R");
  13378. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  13379. rule.Id = GetId();
  13380. rule.PBoxCode = boxserial;
  13381. rule.Wind = "";
  13382. rule.ZXStateCode = 1;
  13383. rule.SpoolType = item.Key;
  13384. rule.PackRule = "BGrade";
  13385. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  13386. rule.SkuCode = "TestBGrade";
  13387. rule.BatchNo = "1";
  13388. rules = _boxrulerepository.InsertReturnEntity(rule);
  13389. if (item.Key == "BS60" || item.Key == "BS40")
  13390. {
  13391. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  13392. }
  13393. else
  13394. {
  13395. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  13396. }
  13397. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.SContent) && p.AddWho != "禁用").OrderBy(p => p.EditTime).First();
  13398. //码垛信息校验
  13399. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  13400. {
  13401. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  13402. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  13403. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  13404. return res;
  13405. }
  13406. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  13407. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  13408. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  13409. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13410. {
  13411. res.ResCode = trayres.ResCode;
  13412. res.ResMsg = trayres.ResMsg;
  13413. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  13414. return res;
  13415. }
  13416. var root = DetermineRoot(palletequip.Code);
  13417. var pallet = new Palletizing()
  13418. {
  13419. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  13420. PalletizState = 0,
  13421. Equip = palletequip.Code,
  13422. Finish = 0,
  13423. AddWho = "",
  13424. EditWho = "",
  13425. BoxRule = rules.PackRule,
  13426. BoxRuleId = rules.Id,
  13427. IsControlpanel = false,
  13428. TaskNum = int.Parse(trayres.Memo1),
  13429. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  13430. Robot = root
  13431. };
  13432. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  13433. List<PalletLayerMath> math = new List<PalletLayerMath>();
  13434. foreach (var invs in invlist)
  13435. {
  13436. var palletlayer = new PalletLayerMath()
  13437. {
  13438. ContGrpId = (long)invs.ContGrpId,
  13439. ContBarCode = invs.ContGrpBarCode,
  13440. Layer = 0,
  13441. SkuCode = rules.SkuCode,
  13442. Finish = 0,
  13443. PboxruleId = rules.Id,
  13444. Istask = 0,
  13445. Palletequip = palletequip.Code,
  13446. Depth = invs.Depth,
  13447. IsBlack = invs.IsBlack,
  13448. SolderCount = invs.SolderCount,
  13449. BoxCode = rules.PBoxCode,
  13450. PalletizingId = pallects.Id
  13451. };
  13452. math.Add(palletlayer);
  13453. }
  13454. _palletlayerMathrepository.InsertRange(math);
  13455. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  13456. {
  13457. PreStock = "1"
  13458. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  13459. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  13460. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  13461. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13462. var curdocid = maxdocid + 1;
  13463. if (palletMach.Any())
  13464. {
  13465. var pid = palletMach.First().PalletizingId;
  13466. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  13467. {
  13468. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13469. }
  13470. }
  13471. foreach (var code in invlist)
  13472. {
  13473. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  13474. if (cell == null)
  13475. {
  13476. continue;
  13477. }
  13478. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13479. if (invs == null)
  13480. {
  13481. continue;
  13482. }
  13483. //先判断二升位是否能出库
  13484. if (code.Depth == 2)
  13485. {
  13486. var respon = MoveTask(code.Code);
  13487. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13488. {
  13489. continue;
  13490. }
  13491. }
  13492. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  13493. {
  13494. Code = code.ContGrpBarCode,
  13495. Equip = pallects.Equip,
  13496. Mater = code.MatCode,
  13497. Srm = code.SCRel,
  13498. PalletLayer = 1,
  13499. Grade = code.Grade,
  13500. Tunnel = code.Tunnel.ToString(),
  13501. CellCode = code.Code,
  13502. SkuCode = rules.SkuCode,
  13503. ProductMachCode = code.ProductMachCode,
  13504. Floor = code.Floor,
  13505. PalletizingId = pallects.Id,
  13506. Robot = root,
  13507. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  13508. DocId = curdocid
  13509. });
  13510. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13511. {
  13512. continue;
  13513. }
  13514. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13515. {
  13516. Istask = 1,
  13517. Layer = 1
  13518. }, p => p.ContBarCode == code.ContGrpBarCode);
  13519. }
  13520. return res;
  13521. }
  13522. }
  13523. return res;
  13524. }
  13525. public CurStockListResponse GetCurStockList(CurStockListRequest request)
  13526. {
  13527. var res = new CurStockListResponse() { ResData = new List<resItmes>() };
  13528. var stock = _billInvnowrepository.Context.Queryable<BillInvnow, BaseMatinfo>((inv, mater) => new object[]
  13529. {
  13530. JoinType.Left, inv.MatCode == mater.Code
  13531. })
  13532. .Where((inv, mater) => inv.InvStateCode == InvState.InvEcecState_In.ToString())
  13533. .WhereIF(!string.IsNullOrEmpty(request.MatCode), (inv, mater) => inv.MatCode.Contains(request.MatCode))
  13534. .WhereIF(!string.IsNullOrEmpty(request.MatName), (inv, mater) => inv.MatName.Contains(request.MatName))
  13535. .Select((inv, mater) => new resItmes()
  13536. {
  13537. MatCode = mater.Code,
  13538. MatBarCode = inv.CLBarCode,
  13539. SpoolCode = inv.ContGrpBarCode,
  13540. WbCode = inv.ProductMachCode,
  13541. WorkOrder = inv.InDocsNo,
  13542. SpoolType = inv.HWTypeCode,
  13543. Length = (decimal)mater.Length,
  13544. Weight = (decimal)mater.Weight,
  13545. ProductDate = inv.ProductTime,
  13546. IsHold = mater.IsHold,
  13547. IsBlack = inv.IsBlack,
  13548. IsCore = inv.IsCore,
  13549. IsRework = inv.IsRework,
  13550. Grade = inv.Grade,
  13551. SolderCount = inv.SolderCount,
  13552. HoldDuration = mater.HoldDuration,
  13553. LocRow = inv.PutRow.ToString(),
  13554. LocCell = inv.PutCol.ToString(),
  13555. LocLayer = inv.PutLayer.ToString(),
  13556. WareCode = "sxhouse"
  13557. })
  13558. .ToList();
  13559. res.ResData = stock;
  13560. return res;
  13561. }
  13562. public SRes UpdateBoxNo(UpdateBoxNoRequest request)
  13563. {
  13564. var res = new SRes();
  13565. var list = _boxrulerepository.GetList(p => request.List.Contains(p.DocsNo)).OrderBy(p => p.Id);
  13566. var index = request.StartIndex;
  13567. foreach (var item in list)
  13568. {
  13569. _boxrulerepository.UpdateModelColumns(p => new BillPboxrule() { PBoxCode = "888888" + index.ToString(), EditTime = DateTime.Now },
  13570. p => p.Id == item.Id);
  13571. index++;
  13572. }
  13573. return res;
  13574. }
  13575. public SRes UpdateBlackCount(UpdateBlackCountReq request)
  13576. {
  13577. var res = new SRes();
  13578. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  13579. if (blackcount == null)
  13580. {
  13581. res.ResCode = 0;
  13582. res.ResMsg = "更新失败,没有配置";
  13583. return res;
  13584. }
  13585. if (request.SpoolType == "1")
  13586. {
  13587. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default1 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  13588. p => p.Id == blackcount.Id);
  13589. }
  13590. else if (request.SpoolType == "2")
  13591. {
  13592. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default2 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  13593. p => p.Id == blackcount.Id);
  13594. }
  13595. else
  13596. {
  13597. res.ResCode = 0;
  13598. res.ResMsg = "更新失败,SpoolType传值无效";
  13599. return res;
  13600. }
  13601. return res;
  13602. }
  13603. /// <summary>
  13604. /// 重绕超时码垛
  13605. /// </summary>
  13606. /// <param name="request"></param>
  13607. /// <returns></returns>
  13608. public SRes ChongraoPackStockOut(PalletizingPackStockOutRequest request)
  13609. {
  13610. var res = new SRes();
  13611. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SpecialCHA");
  13612. if (palletlist.Any())
  13613. {
  13614. foreach (var item in palletlist)
  13615. {
  13616. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  13617. //if (tasklist.Any())
  13618. //{
  13619. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  13620. // continue;
  13621. //}
  13622. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  13623. if (equips == null)
  13624. {
  13625. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  13626. continue;
  13627. }
  13628. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  13629. if (!palletMach.Any())
  13630. {
  13631. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  13632. continue;
  13633. }
  13634. //var curlayer = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 1).Any() ? _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer) : 1;
  13635. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13636. var curdocid = maxdocid + 1;
  13637. if (palletMach.Any())
  13638. {
  13639. var pid = palletMach.First().PalletizingId;
  13640. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  13641. {
  13642. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13643. }
  13644. }
  13645. foreach (var pallets in palletMach)
  13646. {
  13647. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  13648. if (cell == null)
  13649. {
  13650. continue;
  13651. }
  13652. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13653. if (invs == null)
  13654. {
  13655. continue;
  13656. }
  13657. var root = DetermineRoot(pallets.Palletequip);
  13658. //先判断二升位是否能出库
  13659. if (cell.Depth == 2)
  13660. {
  13661. var respon = MoveTask(cell.Code);
  13662. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13663. {
  13664. continue;
  13665. }
  13666. }
  13667. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  13668. {
  13669. Code = pallets.ContBarCode,
  13670. CellCode = cell.Code,
  13671. Srm = cell.SCRel,
  13672. Tunnel = cell.Tunnel.ToString(),
  13673. Floor = cell.Floor,
  13674. Grade = invs.Grade,
  13675. Mater = invs.MatCode,
  13676. SkuCode = pallets.SkuCode,
  13677. PalletLayer = 0,
  13678. ProductMachCode = invs.ProductMachCode,
  13679. Equip = item.Equip,
  13680. PalletizingId = item.Id,
  13681. Robot = root,
  13682. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  13683. DocId = curdocid
  13684. });
  13685. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13686. {
  13687. continue;
  13688. }
  13689. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13690. {
  13691. Istask = 1,
  13692. Layer = 0
  13693. }, p => p.ContBarCode == invs.ContGrpBarCode);
  13694. }
  13695. }
  13696. }
  13697. //取视图码垛设备号
  13698. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  13699. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  13700. {
  13701. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  13702. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13703. res.ResMsg = "没有空闲的码垛工位";
  13704. return res;
  13705. }
  13706. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  13707. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  13708. if (!devices.Where(p => p.pH_STATUS == true).Any())
  13709. {
  13710. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  13711. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13712. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  13713. return res;
  13714. }
  13715. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  13716. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  13717. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  13718. //
  13719. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  13720. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) //&& p.ContUsageQty <= 0
  13721. && p.InDocsNo.StartsWith("R") && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  13722. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  13723. select new StockTemp
  13724. {
  13725. MatCode = stock.MatCode,
  13726. InvBarCode = stock.InvBarCode,
  13727. Grade = stock.Grade,
  13728. InvStateCode = stock.InvStateCode,
  13729. ProductTime = stock.ProductTime,
  13730. OneInTime = stock.OneInTime,
  13731. WbGroupCode = stock.WbGroupCode,
  13732. IsTorsChk = stock.IsTorsChk,
  13733. TorsChkQty = stock.TorsChkQty,
  13734. TorsChkValue = stock.TorsChkValue,
  13735. HoldTime = stock.HoldTime,
  13736. ProductMachCode = stock.ProductMachCode,
  13737. IsControlpanel = stock.IsControlpanel,
  13738. HWTypeCode = stock.HWTypeCode,
  13739. SolderCount = stock.SolderCount,
  13740. IsRework = stock.IsRework,
  13741. IsBlack = stock.IsBlack,
  13742. Col = loc.Col,
  13743. Layer = loc.Layer,
  13744. Shelf = loc.Shelf,
  13745. Depth = loc.Depth,
  13746. Code = loc.Code,
  13747. Tunnel = loc.Tunnel,
  13748. SCRel = loc.SCRel,
  13749. Floor = loc.Floor,
  13750. WarehouseCode = loc.WarehouseCode,
  13751. ContGrpBarCode = loc.ContGrpBarCode,
  13752. ContGrpId = loc.ContGrpId,
  13753. Id = loc.Id,
  13754. StateNum = loc.StateNum,
  13755. Wind = stock.Wind,
  13756. InDocsNo = stock.InDocsNo
  13757. };
  13758. //禁用巷道过滤
  13759. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  13760. if (tunlist.Any())
  13761. {
  13762. if (tunlist.Where(p => p.Default2 == "1").Any())
  13763. {
  13764. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13765. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13766. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  13767. }
  13768. if (tunlist.Where(p => p.Default2 == "2").Any())
  13769. {
  13770. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13771. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13772. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  13773. }
  13774. if (tunlist.Where(p => p.Default2 == "3").Any())
  13775. {
  13776. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13777. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13778. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  13779. }
  13780. }
  13781. if (!invlist.Any())
  13782. {
  13783. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  13784. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13785. res.ResMsg = "库存不足";
  13786. return res;
  13787. }
  13788. invlist = invlist.Distinct();
  13789. var temps = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.HWTypeCode);
  13790. var rules = new BillPboxrule();
  13791. foreach (var item in temps)
  13792. {
  13793. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  13794. if (!invlist.Any())
  13795. {
  13796. continue;
  13797. }
  13798. var mater = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.MatCode).ToList();
  13799. foreach (var stockTemps in mater)
  13800. {
  13801. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  13802. if (!invlist.Any())
  13803. {
  13804. continue;
  13805. }
  13806. var ti = DateTime.Now;
  13807. var yaar = ti.Year.ToString().Substring(2, 2);
  13808. var month = ti.Month.ToString().PadLeft(2, '0');
  13809. var day = ti.Day.ToString().PadLeft(2, '0');
  13810. //获取当天最大箱号
  13811. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  13812. string boxserial = "HAZDA";
  13813. if (maxnumre.Any())
  13814. {
  13815. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  13816. _boxserialrepository.Insert(new BillBoxSerial()
  13817. {
  13818. Year = yaar,
  13819. Month = month,
  13820. Day = day,
  13821. Num = maxnumre.Max(q => q.Num) + 1,
  13822. BoxNum = boxserial,
  13823. Grade = "A",
  13824. AddTime = DateTime.Now,
  13825. AddWho = "wms",
  13826. EditTime = DateTime.Now,
  13827. EditWho = "wms"
  13828. });
  13829. }
  13830. else
  13831. {
  13832. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  13833. _boxserialrepository.Insert(new BillBoxSerial()
  13834. {
  13835. Year = yaar,
  13836. Month = month,
  13837. Day = day,
  13838. Num = 1,
  13839. BoxNum = boxserial,
  13840. Grade = "A",
  13841. AddTime = DateTime.Now,
  13842. AddWho = "wms",
  13843. EditTime = DateTime.Now,
  13844. EditWho = "wms"
  13845. });
  13846. }
  13847. if (invlist.Any(p => p.Wind == "L"))
  13848. {
  13849. invlist = invlist.Where(p => p.Wind == "L");
  13850. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  13851. rule.Id = GetId();
  13852. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  13853. rule.PBoxCode = boxserial;
  13854. rule.Wind = "L";
  13855. rule.ZXStateCode = 1;
  13856. rule.SpoolType = item.Key;
  13857. rule.PackRule = "SpecialCHA";
  13858. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  13859. rule.SkuCode = "Test123";
  13860. rule.BatchNo = "1";
  13861. rules = _boxrulerepository.InsertReturnEntity(rule);
  13862. }
  13863. else
  13864. {
  13865. invlist = invlist.Where(p => p.Wind == "R");
  13866. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  13867. rule.Id = GetId();
  13868. rule.PBoxCode = boxserial;
  13869. rule.Wind = "R";
  13870. rule.ZXStateCode = 1;
  13871. rule.SpoolType = item.Key;
  13872. rule.PackRule = "SpecialCHA";
  13873. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  13874. rule.SkuCode = "Test123";
  13875. rule.BatchNo = "1";
  13876. rules = _boxrulerepository.InsertReturnEntity(rule);
  13877. }
  13878. if (item.Key == "BS60" || item.Key == "BS40")
  13879. {
  13880. invlist = invlist.OrderBy(p => p.OneInTime).Take(72);
  13881. }
  13882. else
  13883. {
  13884. invlist = invlist.OrderBy(p => p.OneInTime).Take(36);
  13885. }
  13886. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.SContent)).OrderBy(p => p.EditTime).First();
  13887. //码垛信息校验
  13888. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  13889. {
  13890. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  13891. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  13892. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  13893. return res;
  13894. }
  13895. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  13896. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  13897. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  13898. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13899. {
  13900. res.ResCode = trayres.ResCode;
  13901. res.ResMsg = trayres.ResMsg;
  13902. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  13903. return res;
  13904. }
  13905. var root = DetermineRoot(palletequip.Code);
  13906. var pallet = new Palletizing()
  13907. {
  13908. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  13909. PalletizState = 0,
  13910. Equip = palletequip.Code,
  13911. Finish = 0,
  13912. AddWho = "",
  13913. EditWho = "",
  13914. BoxRule = rules.PackRule,
  13915. BoxRuleId = rules.Id,
  13916. IsControlpanel = false,
  13917. TaskNum = int.Parse(trayres.Memo1),
  13918. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  13919. Robot = root
  13920. };
  13921. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  13922. List<PalletLayerMath> math = new List<PalletLayerMath>();
  13923. foreach (var invs in invlist)
  13924. {
  13925. var palletlayer = new PalletLayerMath()
  13926. {
  13927. ContGrpId = (long)invs.ContGrpId,
  13928. ContBarCode = invs.ContGrpBarCode,
  13929. Layer = 0,
  13930. SkuCode = rules.SkuCode,
  13931. Finish = 0,
  13932. PboxruleId = rules.Id,
  13933. Istask = 0,
  13934. Palletequip = palletequip.Code,
  13935. Depth = invs.Depth,
  13936. IsBlack = invs.IsBlack,
  13937. SolderCount = invs.SolderCount,
  13938. BoxCode = rules.PBoxCode,
  13939. PalletizingId = pallects.Id
  13940. };
  13941. math.Add(palletlayer);
  13942. }
  13943. _palletlayerMathrepository.InsertRange(math);
  13944. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  13945. {
  13946. PreStock = "1"
  13947. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  13948. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  13949. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  13950. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13951. var curdocid = maxdocid + 1;
  13952. if (palletMach.Any())
  13953. {
  13954. var pid = palletMach.First().PalletizingId;
  13955. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  13956. {
  13957. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13958. }
  13959. }
  13960. foreach (var code in invlist)
  13961. {
  13962. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  13963. if (cell == null)
  13964. {
  13965. continue;
  13966. }
  13967. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13968. if (invs == null)
  13969. {
  13970. continue;
  13971. }
  13972. //先判断二升位是否能出库
  13973. if (code.Depth == 2)
  13974. {
  13975. var respon = MoveTask(code.Code);
  13976. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13977. {
  13978. continue;
  13979. }
  13980. }
  13981. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  13982. {
  13983. Code = code.ContGrpBarCode,
  13984. Equip = pallects.Equip,
  13985. Mater = code.MatCode,
  13986. Srm = code.SCRel,
  13987. PalletLayer = 1,
  13988. Grade = code.Grade,
  13989. Tunnel = code.Tunnel.ToString(),
  13990. CellCode = code.Code,
  13991. SkuCode = rules.SkuCode,
  13992. ProductMachCode = code.ProductMachCode,
  13993. Floor = code.Floor,
  13994. PalletizingId = pallects.Id,
  13995. Robot = root,
  13996. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  13997. DocId = curdocid
  13998. });
  13999. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  14000. {
  14001. continue;
  14002. }
  14003. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  14004. {
  14005. Istask = 1,
  14006. Layer = 1
  14007. }, p => p.ContBarCode == code.ContGrpBarCode);
  14008. }
  14009. return res;
  14010. }
  14011. }
  14012. return res;
  14013. }
  14014. public SRes SolderErrorStockOut(PalletizingPackStockOutRequest request)
  14015. {
  14016. var res = new SRes();
  14017. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  14018. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(p.PreStock) && p.SolderCount > 0)
  14019. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  14020. select new
  14021. {
  14022. stock.MatCode,
  14023. stock.InvBarCode,
  14024. stock.Grade,
  14025. stock.InvStateCode,
  14026. stock.ProductTime,
  14027. stock.WbGroupCode,
  14028. stock.IsTorsChk,
  14029. stock.TorsChkQty,
  14030. stock.TorsChkValue,
  14031. stock.HoldTime,
  14032. stock.ProductMachCode,
  14033. stock.IsControlpanel,
  14034. stock.HWTypeCode,
  14035. stock.SolderCount,
  14036. stock.IsRework,
  14037. stock.IsBlack,
  14038. stock.InDocsNo,
  14039. loc.Col,
  14040. loc.Layer,
  14041. loc.Shelf,
  14042. loc.Depth,
  14043. loc.Code,
  14044. loc.Tunnel,
  14045. loc.SCRel,
  14046. loc.Floor,
  14047. loc.WarehouseCode,
  14048. loc.ContGrpBarCode,
  14049. loc.ContGrpId,
  14050. loc.Id,
  14051. loc.StateNum
  14052. };
  14053. if (!invlist.Any())
  14054. {
  14055. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14056. res.ResMsg = "库存不足";
  14057. return res;
  14058. }
  14059. invlist = invlist.OrderBy(p => p.ProductTime);
  14060. foreach (var item in invlist)
  14061. {
  14062. if (!_boxrulerepository.AsQueryable().Where(p => p.DocsNo == item.InDocsNo && p.ZXStateCode == 0 && p.PerSolderMaxCount > item.SolderCount).Any() && int.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > 24)
  14063. {
  14064. SpcErrorTaskinfo(new PalletizingPackTaskRequest()
  14065. {
  14066. Srm = item.SCRel,
  14067. CellCode = item.Code,
  14068. Code = item.ContGrpBarCode,
  14069. Tunnel = item.Tunnel.ToString(),
  14070. Floor = item.Floor,
  14071. Grade = item.Grade,
  14072. Mater = item.MatCode,
  14073. Memo = "焊点不符,自动排出"
  14074. });
  14075. }
  14076. }
  14077. return res;
  14078. }
  14079. public SRes ForceCancelTask(ErrorTaskRequest request)
  14080. {
  14081. var res = new SRes();
  14082. if (string.IsNullOrEmpty(request.TaskNo))
  14083. {
  14084. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14085. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14086. return res;
  14087. }
  14088. if (request.WareHouse != Const.SxWareHouse)
  14089. {
  14090. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14091. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14092. return res;
  14093. }
  14094. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  14095. if (task == null)
  14096. {
  14097. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  14098. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  14099. return res;
  14100. }
  14101. if (_taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo)))
  14102. {
  14103. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Cancel, ManualRemarks = "强制取消任务", EditTime = DateTime.Now }).Where(p => p.Id == task.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  14104. //删除码垛信息
  14105. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  14106. _palletizdetailrepository.Delete(p => p.BarCode == task.BarCode);
  14107. _logger.LogInformation("强制取消任务" + request.TaskNo);
  14108. }
  14109. return res;
  14110. }
  14111. public SRes DeleteStockInfo(DetailCodeStrRequest request)
  14112. {
  14113. var res = new SRes();
  14114. if (request.WareHouse != Const.SxWareHouse)
  14115. {
  14116. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14117. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14118. return res;
  14119. }
  14120. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14121. if (stock == null)
  14122. {
  14123. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14124. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14125. return res;
  14126. }
  14127. else
  14128. {
  14129. //_billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14130. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  14131. {
  14132. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14133. res.ResMsg = $"工字轮{stock.ContGrpBarCode} | 已在库中,不允许删除";
  14134. return res;
  14135. }
  14136. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  14137. {
  14138. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14139. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14140. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  14141. flow.Id = GetId();
  14142. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  14143. flow.AddTime = DateTime.Now;
  14144. flow.EditTime = DateTime.Now;
  14145. flow.Memo = "异常处理库存";
  14146. _billInvflow.Insert(flow);
  14147. }
  14148. else if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  14149. {
  14150. if (stock.PutRow == 0 && stock.PutCol == 0 && stock.PutLayer == 0)
  14151. {
  14152. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14153. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14154. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  14155. flow.Id = GetId();
  14156. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  14157. flow.AddTime = DateTime.Now;
  14158. flow.EditTime = DateTime.Now;
  14159. flow.Memo = "异常处理库存";
  14160. _billInvflow.Insert(flow);
  14161. }
  14162. }
  14163. }
  14164. return res;
  14165. }
  14166. public SRes DeleteTorsBind(DetailCodeStrRequest request)
  14167. {
  14168. var res = new SRes();
  14169. if (request.WareHouse != Const.SxWareHouse)
  14170. {
  14171. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14172. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14173. return res;
  14174. }
  14175. var stock = _torchbandinforepository.GetSingle(p => p.ContBarCode == request.Code);
  14176. if (stock == null)
  14177. {
  14178. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14179. res.ResMsg = request.Code + "不存在扭转绑定信息";
  14180. return res;
  14181. }
  14182. else
  14183. {
  14184. _torchbandinforepository.Delete(p => p.ContBarCode == request.Code);
  14185. }
  14186. return res;
  14187. }
  14188. public SRes DeleteHwPre(DetailCodeStrRequest request)
  14189. {
  14190. var res = new SRes();
  14191. if (request.WareHouse != Const.SxWareHouse)
  14192. {
  14193. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14194. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14195. return res;
  14196. }
  14197. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14198. if (stock == null)
  14199. {
  14200. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14201. res.ResMsg = request.Code + "不存在库存信息";
  14202. return res;
  14203. }
  14204. else
  14205. {
  14206. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14207. {
  14208. PreStock = ""
  14209. }, p => p.ContGrpBarCode == request.Code);
  14210. }
  14211. return res;
  14212. }
  14213. public SRes UpdateStockState(DetailCodeStr1Requestdto request)
  14214. {
  14215. var res = new SRes();
  14216. if (request.WareHouse != Const.SxWareHouse)
  14217. {
  14218. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14219. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14220. return res;
  14221. }
  14222. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14223. if (stock == null)
  14224. {
  14225. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14226. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14227. return res;
  14228. }
  14229. var status = "";
  14230. switch (request.State)
  14231. {
  14232. case 1:
  14233. status = InvState.InvEcecState_BuildUp.ToString();
  14234. break;
  14235. case 3:
  14236. status = InvState.InvEcecState_In.ToString();
  14237. break;
  14238. case 4:
  14239. status = InvState.InvEcecState_OutGoing.ToString();
  14240. break;
  14241. case 5:
  14242. status = InvState.InvEcecState_Out.ToString();
  14243. break;
  14244. default:
  14245. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  14246. res.ResMsg = "状态" + ResponseStatusCodeEnum.ErrParam.GetDescription();
  14247. return res;
  14248. }
  14249. try
  14250. {
  14251. var p = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14252. {
  14253. InvStateCode = status,
  14254. EditTime = DateTime.Now
  14255. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14256. if (!p)
  14257. {
  14258. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14259. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.Fail.GetDescription();
  14260. return res;
  14261. }
  14262. var flow = _mapper.Map<BillInvflow>(stock);
  14263. flow.Id = GetId();
  14264. flow.AddTime = DateTime.Now;
  14265. flow.EditTime = DateTime.Now;
  14266. flow.InvStateCode = status;
  14267. _billInvflow.Insert(flow);
  14268. }
  14269. catch (Exception ex)
  14270. {
  14271. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14272. res.ResMsg = request.Code + ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14273. return res;
  14274. }
  14275. return res;
  14276. }
  14277. public SRes UpdateCellState(DetailCodeStr1Requestdto request)
  14278. {
  14279. var res = new SRes();
  14280. if (request.WareHouse != Const.SxWareHouse)
  14281. {
  14282. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14283. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14284. return res;
  14285. }
  14286. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Code);
  14287. if (cell == null)
  14288. {
  14289. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14290. res.ResMsg = request.Code + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14291. return res;
  14292. }
  14293. var st = (LocationState)request.State;
  14294. if (request.State == 1)
  14295. {
  14296. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14297. {
  14298. StateNum = st,
  14299. ContGrpBarCode = "",
  14300. ContGrpId = 0,
  14301. EditTime = DateTime.Now
  14302. }, p => p.Code == request.Code);
  14303. }
  14304. else
  14305. {
  14306. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14307. {
  14308. StateNum = st,
  14309. EditTime = DateTime.Now
  14310. }, p => p.Code == request.Code);
  14311. }
  14312. return res;
  14313. }
  14314. public SRes DataSwapCell(DataSwapCellStrRequest request)
  14315. {
  14316. var res = new SRes();
  14317. if (request.WareHouse != Const.SxWareHouse)
  14318. {
  14319. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14320. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14321. return res;
  14322. }
  14323. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  14324. if (fromCell == null)
  14325. {
  14326. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14327. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14328. return res;
  14329. }
  14330. if (fromCell.StateNum != LocationState.LocationState_Full)
  14331. {
  14332. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14333. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许互换";
  14334. return res;
  14335. }
  14336. var fromstock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14337. if (fromstock == null)
  14338. {
  14339. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14340. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14341. return res;
  14342. }
  14343. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  14344. if (toCell == null)
  14345. {
  14346. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14347. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14348. return res;
  14349. }
  14350. if (toCell.StateNum != LocationState.LocationState_Full)
  14351. {
  14352. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14353. res.ResMsg = request.EndEquip + "货位不是有货状态,不允许互换";
  14354. return res;
  14355. }
  14356. var tostock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == toCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14357. if (tostock == null)
  14358. {
  14359. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14360. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14361. return res;
  14362. }
  14363. try
  14364. {
  14365. _db.BeginTran();
  14366. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14367. {
  14368. ContGrpBarCode = fromCell.ContGrpBarCode,
  14369. ContGrpId = fromCell.ContGrpId
  14370. }, p => p.Code == toCell.Code);
  14371. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14372. {
  14373. ContGrpBarCode = toCell.ContGrpBarCode,
  14374. ContGrpId = toCell.ContGrpId
  14375. }, p => p.Code == fromCell.Code);
  14376. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14377. {
  14378. PutRow = toCell.Row,
  14379. PutCol = toCell.Col,
  14380. PutLayer = toCell.Layer
  14381. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  14382. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14383. {
  14384. PutRow = fromCell.Row,
  14385. PutCol = fromCell.Col,
  14386. PutLayer = fromCell.Layer
  14387. }, p => p.ContGrpBarCode == toCell.ContGrpBarCode);
  14388. _db.CommitTran();
  14389. }
  14390. catch (Exception ex)
  14391. {
  14392. _db.RollbackTran();
  14393. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14394. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14395. return res;
  14396. }
  14397. return res;
  14398. }
  14399. public SRes DataBasePatch(DataBasePatchRequest request)
  14400. {
  14401. var res = new SRes();
  14402. if (request.WareHouse != Const.SxWareHouse)
  14403. {
  14404. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14405. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14406. return res;
  14407. }
  14408. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14409. if (stock != null)
  14410. {
  14411. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14412. res.ResMsg = request.Code + "存在组盘信息,不允许补数据";
  14413. return res;
  14414. }
  14415. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Cell);
  14416. if (cell == null)
  14417. {
  14418. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14419. res.ResMsg = request.Cell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14420. return res;
  14421. }
  14422. if (cell.StateNum != LocationState.LocationState_Empty)
  14423. {
  14424. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14425. res.ResMsg = request.Cell + "货位状态不是空货位,不允许补数据";
  14426. return res;
  14427. }
  14428. try
  14429. {
  14430. if (request.ContGrpType == 1)
  14431. {
  14432. var boxCode = _billInvnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode);
  14433. if (boxCode != null)
  14434. {
  14435. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  14436. res.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  14437. return res;
  14438. }
  14439. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.BoxBarCode == request.BoxCode && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  14440. if (flow == null)
  14441. {
  14442. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14443. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  14444. return res;
  14445. }
  14446. }
  14447. else if (request.ContGrpType == 2 || request.ContGrpType == 3)
  14448. {
  14449. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  14450. if (flow == null)
  14451. {
  14452. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14453. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  14454. return res;
  14455. }
  14456. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  14457. flow.Id = GetId();
  14458. flow.AddTime = DateTime.Now;
  14459. flow.EditTime = DateTime.Now;
  14460. flow.PutRow = cell.Row;
  14461. flow.PutCol = cell.Col;
  14462. flow.PutLayer = cell.Layer;
  14463. flow.AddWho = "wms";
  14464. flow.EditWho = "wms";
  14465. flow.Memo = "手动补数据";
  14466. _db.BeginTran();
  14467. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  14468. _billInvflow.Insert(flow);
  14469. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14470. {
  14471. ContGrpBarCode = flow.ContGrpBarCode,
  14472. ContGrpId = flow.ContGrpId,
  14473. StateNum = LocationState.LocationState_Full,
  14474. IsStop = 0,
  14475. EditTime = DateTime.Now
  14476. }, p => p.Code == cell.Code);
  14477. _db.CommitTran();
  14478. }
  14479. }
  14480. catch (Exception ex)
  14481. {
  14482. _db.RollbackTran();
  14483. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14484. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14485. return res;
  14486. }
  14487. return res;
  14488. }
  14489. public SRes DataBasePatch2(DataBasePatchRequest request)
  14490. {
  14491. var res = new SRes();
  14492. try
  14493. {
  14494. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "扭转回库").OrderByDescending(p => p.EditTime).First();
  14495. if (flow == null)
  14496. {
  14497. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14498. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  14499. return res;
  14500. }
  14501. if (flow.IsControlpanel == true && flow.IsTorsChk)
  14502. {
  14503. flow.Id = GetId();
  14504. flow.AddTime = DateTime.Now;
  14505. flow.EditTime = DateTime.Now;
  14506. flow.AddWho = "wms";
  14507. flow.EditWho = "wms";
  14508. flow.Memo = "手动补数据,更新扭转数据";
  14509. _db.BeginTran();
  14510. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14511. {
  14512. TorsChkQty = flow.TorsChkQty,
  14513. TorsChkTime = flow.TorsChkTime,
  14514. SideNum = 1,
  14515. TorsChkValue = flow.TorsChkValue,
  14516. TorsChkMachCode = flow.TorsChkMachCode,
  14517. Memo = flow.Memo,
  14518. TorsChkChord = flow.TorsChkChord,
  14519. TorsChkFlatness = flow.TorsChkFlatness,
  14520. TorsChkStation = flow.TorsChkStation,
  14521. TorsChkChordIsGood = flow.TorsChkChordIsGood,
  14522. TorsChkFlatnessIsGood = flow.TorsChkFlatnessIsGood,
  14523. TorsChkValueIsGood = flow.TorsChkValueIsGood,
  14524. //FailReason = "测试"+ flow.Memo
  14525. }, p => p.ContGrpBarCode == flow.ContGrpBarCode);
  14526. _billInvflow.Insert(flow);
  14527. _db.CommitTran();
  14528. }
  14529. }
  14530. catch (Exception ex)
  14531. {
  14532. _db.RollbackTran();
  14533. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14534. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14535. return res;
  14536. }
  14537. return res;
  14538. }
  14539. public SRes DataBasePatch3(DataBasePatchRequest request)
  14540. {
  14541. var res = new SRes();
  14542. try
  14543. {
  14544. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "装箱码垛出库").OrderByDescending(p => p.EditTime).First();
  14545. if (flow == null)
  14546. {
  14547. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14548. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  14549. return res;
  14550. }
  14551. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  14552. _billInvinitrepository.Insert(_mapper.Map<BillInvinit>(flow));
  14553. }
  14554. catch (Exception ex)
  14555. {
  14556. _db.RollbackTran();
  14557. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14558. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14559. return res;
  14560. }
  14561. return res;
  14562. }
  14563. public SRes UpdatePurchState(UpdatePurchStateRequestdto request)
  14564. {
  14565. var res = new SRes();
  14566. if (!request.Id.Any())
  14567. {
  14568. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  14569. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14570. return res;
  14571. }
  14572. foreach (var item in request.Id)
  14573. {
  14574. var pursh = _billPushinforepository.GetSingle(p => p.Id == item);
  14575. if (pursh != null)
  14576. {
  14577. _billPushinforepository.UpdateSetColumnsTrue(p => new BillPushinfo()
  14578. {
  14579. PostQty = 5,
  14580. PostResult = 0,
  14581. Memo = "手动推送"
  14582. }, p => p.Id == pursh.Id);
  14583. }
  14584. }
  14585. return res;
  14586. }
  14587. public SRes DataMoveCell(DataSwapCellStrRequest request)
  14588. {
  14589. var res = new SRes();
  14590. if (request.WareHouse != Const.SxWareHouse)
  14591. {
  14592. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14593. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14594. return res;
  14595. }
  14596. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  14597. if (fromCell == null)
  14598. {
  14599. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14600. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14601. return res;
  14602. }
  14603. if (fromCell.StateNum != LocationState.LocationState_Full)
  14604. {
  14605. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14606. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许转移";
  14607. return res;
  14608. }
  14609. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  14610. if (toCell == null)
  14611. {
  14612. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14613. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14614. return res;
  14615. }
  14616. if (toCell.StateNum != LocationState.LocationState_Empty)
  14617. {
  14618. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14619. res.ResMsg = request.EndEquip + "货位不是无货状态,不允许转移";
  14620. return res;
  14621. }
  14622. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14623. if (stock == null)
  14624. {
  14625. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14626. res.ResMsg = fromCell.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14627. return res;
  14628. }
  14629. try
  14630. {
  14631. _db.BeginTran();
  14632. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14633. {
  14634. StateNum = LocationState.LocationState_Empty,
  14635. ContGrpBarCode = "",
  14636. ContGrpId = 0,
  14637. EditTime = DateTime.Now
  14638. }, p => p.Code == fromCell.Code);
  14639. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14640. {
  14641. StateNum = LocationState.LocationState_Full,
  14642. ContGrpBarCode = fromCell.ContGrpBarCode,
  14643. ContGrpId = fromCell.ContGrpId,
  14644. EditTime = DateTime.Now
  14645. }, p => p.Code == toCell.Code);
  14646. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14647. {
  14648. PutRow = toCell.Row,
  14649. PutCol = toCell.Col,
  14650. PutLayer = toCell.Layer
  14651. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  14652. _db.CommitTran();
  14653. }
  14654. catch (Exception ex)
  14655. {
  14656. _db.RollbackTran();
  14657. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14658. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14659. return res;
  14660. }
  14661. return res;
  14662. }
  14663. public SRes TaskRepeatSend(TaskRepeatRequest request)
  14664. {
  14665. var res = new SRes();
  14666. if (!request.TaskNo.Any())
  14667. {
  14668. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  14669. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14670. return res;
  14671. }
  14672. var wcsTask = _taskrepository.GetList(p => request.TaskNo.Contains(p.ID) && p.Status == TaskStatus.码垛抓取中);
  14673. if (wcsTask.Count == request.TaskNo.Count)
  14674. {
  14675. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  14676. {
  14677. Status = TaskStatus.码垛抓取扫码,
  14678. EditTime = DateTime.Now,
  14679. ManualRemarks = "机器人重复下发任务"
  14680. }, p => request.TaskNo.Contains(p.ID));
  14681. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  14682. {
  14683. Status = TaskStatus.码垛抓取扫码,
  14684. EditTime = DateTime.Now,
  14685. ManualRemarks = "机器人重复下发任务"
  14686. }).Where(p => request.TaskNo.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  14687. }
  14688. else
  14689. {
  14690. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14691. res.ResMsg = "申请的任务数不等于查询结果的任务数";
  14692. return res;
  14693. }
  14694. return res;
  14695. }
  14696. public SRes UpdateTaskState(UpdateTaskStateRequest request)
  14697. {
  14698. var res = new SRes();
  14699. var task = _taskrepository.GetSingle(p => p.ID == request.TaskNo);
  14700. if (task == null)
  14701. {
  14702. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  14703. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  14704. return res;
  14705. }
  14706. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  14707. {
  14708. Status = request.Status,
  14709. EditTime = DateTime.Now,
  14710. ManualRemarks = "手动修改任务状态"
  14711. }, p => p.ID == request.TaskNo);
  14712. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  14713. {
  14714. Status = request.Status,
  14715. EditTime = DateTime.Now,
  14716. ManualRemarks = "手动修改任务状态"
  14717. }).Where(p => p.Id == request.TaskNo).SplitTable(p => p.Take(2)).ExecuteCommand();
  14718. return res;
  14719. }
  14720. public SRes SpecialStockOut(PalletizingPackStockOutRequest request)
  14721. {
  14722. var res = new SRes();
  14723. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "Special");
  14724. if (palletlist.Any())
  14725. {
  14726. foreach (var item in palletlist)
  14727. {
  14728. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  14729. //if (tasklist.Any())
  14730. //{
  14731. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  14732. // continue;
  14733. //}
  14734. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  14735. if (equips == null)
  14736. {
  14737. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  14738. continue;
  14739. }
  14740. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  14741. if (!palletMach.Any())
  14742. {
  14743. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  14744. continue;
  14745. }
  14746. //var curlayer = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 1).Any() ? _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer) : 1;
  14747. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  14748. var curdocid = maxdocid + 1;
  14749. if (palletMach.Any())
  14750. {
  14751. var pid = palletMach.First().PalletizingId;
  14752. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  14753. {
  14754. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  14755. }
  14756. }
  14757. foreach (var pallets in palletMach)
  14758. {
  14759. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  14760. if (cell == null)
  14761. {
  14762. continue;
  14763. }
  14764. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14765. if (invs == null)
  14766. {
  14767. continue;
  14768. }
  14769. var root = DetermineRoot(pallets.Palletequip);
  14770. //先判断二升位是否能出库
  14771. if (cell.Depth == 2)
  14772. {
  14773. var respon = MoveTask(cell.Code);
  14774. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  14775. {
  14776. continue;
  14777. }
  14778. }
  14779. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  14780. {
  14781. Code = pallets.ContBarCode,
  14782. CellCode = cell.Code,
  14783. Srm = cell.SCRel,
  14784. Tunnel = cell.Tunnel.ToString(),
  14785. Floor = cell.Floor,
  14786. Grade = invs.Grade,
  14787. Mater = invs.MatCode,
  14788. SkuCode = pallets.SkuCode,
  14789. PalletLayer = 0,
  14790. ProductMachCode = invs.ProductMachCode,
  14791. Equip = item.Equip,
  14792. PalletizingId = item.Id,
  14793. Robot = root,
  14794. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  14795. DocId = curdocid
  14796. });
  14797. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  14798. {
  14799. continue;
  14800. }
  14801. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  14802. {
  14803. Istask = 1,
  14804. Layer = 0
  14805. }, p => p.ContBarCode == invs.ContGrpBarCode);
  14806. }
  14807. }
  14808. }
  14809. //取视图码垛设备号
  14810. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  14811. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  14812. {
  14813. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  14814. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14815. res.ResMsg = "没有空闲的码垛工位";
  14816. return res;
  14817. }
  14818. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  14819. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  14820. if (!devices.Where(p => p.pH_STATUS == true).Any())
  14821. {
  14822. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  14823. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14824. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  14825. return res;
  14826. }
  14827. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  14828. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  14829. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  14830. //
  14831. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  14832. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) && !p.ProductMachCode.Contains("R") //&& p.ContUsageQty <= 0
  14833. && !p.InDocsNo.StartsWith("CHA") && p.IsMulti == false && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  14834. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  14835. select new StockTemp
  14836. {
  14837. MatCode = stock.MatCode,
  14838. InvBarCode = stock.InvBarCode,
  14839. Grade = stock.Grade,
  14840. InvStateCode = stock.InvStateCode,
  14841. ProductTime = stock.ProductTime,
  14842. WbGroupCode = stock.WbGroupCode,
  14843. IsTorsChk = stock.IsTorsChk,
  14844. TorsChkQty = stock.TorsChkQty,
  14845. TorsChkValue = stock.TorsChkValue,
  14846. HoldTime = stock.HoldTime,
  14847. ProductMachCode = stock.ProductMachCode,
  14848. IsControlpanel = stock.IsControlpanel,
  14849. HWTypeCode = stock.HWTypeCode,
  14850. SolderCount = stock.SolderCount,
  14851. IsRework = stock.IsRework,
  14852. IsBlack = stock.IsBlack,
  14853. Col = loc.Col,
  14854. Layer = loc.Layer,
  14855. Shelf = loc.Shelf,
  14856. Depth = loc.Depth,
  14857. Code = loc.Code,
  14858. Tunnel = loc.Tunnel,
  14859. SCRel = loc.SCRel,
  14860. Floor = loc.Floor,
  14861. WarehouseCode = loc.WarehouseCode,
  14862. ContGrpBarCode = loc.ContGrpBarCode,
  14863. ContGrpId = loc.ContGrpId,
  14864. Id = loc.Id,
  14865. StateNum = loc.StateNum,
  14866. Wind = stock.Wind,
  14867. InDocsNo = stock.InDocsNo
  14868. };
  14869. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  14870. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) && p.ProductMachCode.Contains("R") //&& p.ContUsageQty <= 0
  14871. && !p.InDocsNo.StartsWith("CHA") && p.IsMulti == false && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  14872. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  14873. select new StockTemp
  14874. {
  14875. MatCode = stock.MatCode,
  14876. InvBarCode = stock.InvBarCode,
  14877. Grade = stock.Grade,
  14878. InvStateCode = stock.InvStateCode,
  14879. ProductTime = stock.ProductTime,
  14880. WbGroupCode = stock.WbGroupCode,
  14881. IsTorsChk = stock.IsTorsChk,
  14882. TorsChkQty = stock.TorsChkQty,
  14883. TorsChkValue = stock.TorsChkValue,
  14884. HoldTime = stock.HoldTime,
  14885. ProductMachCode = stock.ProductMachCode,
  14886. IsControlpanel = stock.IsControlpanel,
  14887. HWTypeCode = stock.HWTypeCode,
  14888. SolderCount = stock.SolderCount,
  14889. IsRework = stock.IsRework,
  14890. IsBlack = stock.IsBlack,
  14891. Col = loc.Col,
  14892. Layer = loc.Layer,
  14893. Shelf = loc.Shelf,
  14894. Depth = loc.Depth,
  14895. Code = loc.Code,
  14896. Tunnel = loc.Tunnel,
  14897. SCRel = loc.SCRel,
  14898. Floor = loc.Floor,
  14899. WarehouseCode = loc.WarehouseCode,
  14900. ContGrpBarCode = loc.ContGrpBarCode,
  14901. ContGrpId = loc.ContGrpId,
  14902. Id = loc.Id,
  14903. StateNum = loc.StateNum,
  14904. Wind = stock.Wind,
  14905. InDocsNo = stock.InDocsNo
  14906. };
  14907. invlist = invlist.Union(invlist1);
  14908. //禁用巷道过滤
  14909. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  14910. if (tunlist.Any())
  14911. {
  14912. if (tunlist.Where(p => p.Default2 == "1").Any())
  14913. {
  14914. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  14915. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  14916. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  14917. }
  14918. if (tunlist.Where(p => p.Default2 == "2").Any())
  14919. {
  14920. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  14921. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  14922. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  14923. }
  14924. if (tunlist.Where(p => p.Default2 == "3").Any())
  14925. {
  14926. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  14927. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  14928. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  14929. }
  14930. }
  14931. if (!invlist.Any())
  14932. {
  14933. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  14934. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14935. res.ResMsg = "库存不足";
  14936. return res;
  14937. }
  14938. invlist = invlist.Distinct();
  14939. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  14940. var rules = new BillPboxrule();
  14941. foreach (var item in temps)
  14942. {
  14943. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  14944. if (!invlist.Any())
  14945. {
  14946. continue;
  14947. }
  14948. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  14949. foreach (var stockTemps in mater)
  14950. {
  14951. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  14952. if (!invlist.Any())
  14953. {
  14954. continue;
  14955. }
  14956. var ti = DateTime.Now;
  14957. var yaar = ti.Year.ToString().Substring(2, 2);
  14958. var month = ti.Month.ToString().PadLeft(2, '0');
  14959. var day = ti.Day.ToString().PadLeft(2, '0');
  14960. //获取当天最大箱号
  14961. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  14962. string boxserial = "HAZDA";
  14963. if (maxnumre.Any())
  14964. {
  14965. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  14966. _boxserialrepository.Insert(new BillBoxSerial()
  14967. {
  14968. Year = yaar,
  14969. Month = month,
  14970. Day = day,
  14971. Num = maxnumre.Max(q => q.Num) + 1,
  14972. BoxNum = boxserial,
  14973. Grade = "A",
  14974. AddTime = DateTime.Now,
  14975. AddWho = "wms",
  14976. EditTime = DateTime.Now,
  14977. EditWho = "wms"
  14978. });
  14979. }
  14980. else
  14981. {
  14982. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  14983. _boxserialrepository.Insert(new BillBoxSerial()
  14984. {
  14985. Year = yaar,
  14986. Month = month,
  14987. Day = day,
  14988. Num = 1,
  14989. BoxNum = boxserial,
  14990. Grade = "A",
  14991. AddTime = DateTime.Now,
  14992. AddWho = "wms",
  14993. EditTime = DateTime.Now,
  14994. EditWho = "wms"
  14995. });
  14996. }
  14997. if (invlist.Any(p => p.Wind == "L"))
  14998. {
  14999. invlist = invlist.Where(p => p.Wind == "L");
  15000. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15001. rule.Id = GetId();
  15002. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15003. rule.PBoxCode = boxserial;
  15004. rule.Wind = "L";
  15005. rule.ZXStateCode = 1;
  15006. rule.SpoolType = item.Key;
  15007. rule.PackRule = "Special";
  15008. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15009. rule.SkuCode = "Test123";
  15010. rule.BatchNo = "1";
  15011. rules = _boxrulerepository.InsertReturnEntity(rule);
  15012. }
  15013. else
  15014. {
  15015. invlist = invlist.Where(p => p.Wind == "R");
  15016. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15017. rule.Id = GetId();
  15018. rule.PBoxCode = boxserial;
  15019. rule.Wind = "R";
  15020. rule.ZXStateCode = 1;
  15021. rule.SpoolType = item.Key;
  15022. rule.PackRule = "Special";
  15023. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15024. rule.SkuCode = "Test123";
  15025. rule.BatchNo = "1";
  15026. rules = _boxrulerepository.InsertReturnEntity(rule);
  15027. }
  15028. if (item.Key == "BS60" || item.Key == "BS40")
  15029. {
  15030. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  15031. }
  15032. else
  15033. {
  15034. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  15035. }
  15036. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.SContent)).OrderBy(p => p.EditTime).First();
  15037. //码垛信息校验
  15038. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  15039. {
  15040. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  15041. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  15042. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  15043. return res;
  15044. }
  15045. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  15046. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  15047. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  15048. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15049. {
  15050. res.ResCode = trayres.ResCode;
  15051. res.ResMsg = trayres.ResMsg;
  15052. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  15053. return res;
  15054. }
  15055. var root = DetermineRoot(palletequip.Code);
  15056. var pallet = new Palletizing()
  15057. {
  15058. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  15059. PalletizState = 0,
  15060. Equip = palletequip.Code,
  15061. Finish = 0,
  15062. AddWho = "",
  15063. EditWho = "",
  15064. BoxRule = rules.PackRule,
  15065. BoxRuleId = rules.Id,
  15066. IsControlpanel = false,
  15067. TaskNum = int.Parse(trayres.Memo1),
  15068. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  15069. Robot = root
  15070. };
  15071. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  15072. List<PalletLayerMath> math = new List<PalletLayerMath>();
  15073. foreach (var invs in invlist)
  15074. {
  15075. var palletlayer = new PalletLayerMath()
  15076. {
  15077. ContGrpId = (long)invs.ContGrpId,
  15078. ContBarCode = invs.ContGrpBarCode,
  15079. Layer = 0,
  15080. SkuCode = rules.SkuCode,
  15081. Finish = 0,
  15082. PboxruleId = rules.Id,
  15083. Istask = 0,
  15084. Palletequip = palletequip.Code,
  15085. Depth = invs.Depth,
  15086. IsBlack = invs.IsBlack,
  15087. SolderCount = invs.SolderCount,
  15088. BoxCode = rules.PBoxCode,
  15089. PalletizingId = pallects.Id
  15090. };
  15091. math.Add(palletlayer);
  15092. }
  15093. _palletlayerMathrepository.InsertRange(math);
  15094. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  15095. {
  15096. PreStock = "1"
  15097. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  15098. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  15099. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  15100. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15101. var curdocid = maxdocid + 1;
  15102. if (palletMach.Any())
  15103. {
  15104. var pid = palletMach.First().PalletizingId;
  15105. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  15106. {
  15107. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15108. }
  15109. }
  15110. foreach (var code in invlist)
  15111. {
  15112. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  15113. if (cell == null)
  15114. {
  15115. continue;
  15116. }
  15117. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15118. if (invs == null)
  15119. {
  15120. continue;
  15121. }
  15122. //先判断二升位是否能出库
  15123. if (code.Depth == 2)
  15124. {
  15125. var respon = MoveTask(code.Code);
  15126. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15127. {
  15128. continue;
  15129. }
  15130. }
  15131. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  15132. {
  15133. Code = code.ContGrpBarCode,
  15134. Equip = pallects.Equip,
  15135. Mater = code.MatCode,
  15136. Srm = code.SCRel,
  15137. PalletLayer = 1,
  15138. Grade = code.Grade,
  15139. Tunnel = code.Tunnel.ToString(),
  15140. CellCode = code.Code,
  15141. SkuCode = rules.SkuCode,
  15142. ProductMachCode = code.ProductMachCode,
  15143. Floor = code.Floor,
  15144. PalletizingId = pallects.Id,
  15145. Robot = root,
  15146. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  15147. DocId = curdocid
  15148. });
  15149. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15150. {
  15151. continue;
  15152. }
  15153. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15154. {
  15155. Istask = 1,
  15156. Layer = 1
  15157. }, p => p.ContBarCode == code.ContGrpBarCode);
  15158. }
  15159. return res;
  15160. }
  15161. }
  15162. return res;
  15163. }
  15164. /// <summary>
  15165. /// 手动筛选码垛出库
  15166. /// </summary>
  15167. /// <param name="request"></param>
  15168. /// <returns></returns>
  15169. public SRes ManualPalletizingStockOut(ManualPalletizingStockOutRequest request)
  15170. {
  15171. var res = new SRes();
  15172. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "ManualSpecial");
  15173. if (palletlist.Any())
  15174. {
  15175. foreach (var item in palletlist)
  15176. {
  15177. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  15178. //if (tasklist.Any())
  15179. //{
  15180. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  15181. // continue;
  15182. //}
  15183. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  15184. if (equips == null)
  15185. {
  15186. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  15187. continue;
  15188. }
  15189. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  15190. if (!palletMach.Any())
  15191. {
  15192. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  15193. continue;
  15194. }
  15195. //var curlayer = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 1).Any() ? _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer) : 1;
  15196. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15197. var curdocid = maxdocid + 1;
  15198. if (palletMach.Any())
  15199. {
  15200. var pid = palletMach.First().PalletizingId;
  15201. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  15202. {
  15203. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15204. }
  15205. }
  15206. foreach (var pallets in palletMach)
  15207. {
  15208. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15209. if (cell == null)
  15210. {
  15211. continue;
  15212. }
  15213. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15214. if (invs == null)
  15215. {
  15216. continue;
  15217. }
  15218. var root = DetermineRoot(pallets.Palletequip);
  15219. //先判断二升位是否能出库
  15220. if (cell.Depth == 2)
  15221. {
  15222. var respon = MoveTask(cell.Code);
  15223. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15224. {
  15225. continue;
  15226. }
  15227. }
  15228. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15229. {
  15230. Code = pallets.ContBarCode,
  15231. CellCode = cell.Code,
  15232. Srm = cell.SCRel,
  15233. Tunnel = cell.Tunnel.ToString(),
  15234. Floor = cell.Floor,
  15235. Grade = invs.Grade,
  15236. Mater = invs.MatCode,
  15237. SkuCode = pallets.SkuCode,
  15238. PalletLayer = 0,
  15239. ProductMachCode = invs.ProductMachCode,
  15240. Equip = item.Equip,
  15241. PalletizingId = item.Id,
  15242. Robot = root,
  15243. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  15244. DocId = curdocid
  15245. });
  15246. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15247. {
  15248. continue;
  15249. }
  15250. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15251. {
  15252. Istask = 1,
  15253. Layer = 0
  15254. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15255. }
  15256. }
  15257. }
  15258. //取视图码垛设备号
  15259. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  15260. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  15261. {
  15262. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  15263. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15264. res.ResMsg = "没有空闲的码垛工位";
  15265. return res;
  15266. }
  15267. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  15268. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  15269. if (!devices.Where(p => p.pH_STATUS == true).Any())
  15270. {
  15271. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  15272. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15273. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  15274. return res;
  15275. }
  15276. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  15277. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  15278. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  15279. //
  15280. //获取库存列表
  15281. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15282. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && (p.IsControlpanel == false && p.IsTorsChk == false) && string.IsNullOrEmpty(p.PreStock) //&& !p.ProductMachCode.Contains("R")
  15283. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  15284. )
  15285. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15286. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  15287. on stock.InDocsNo equals rule1.DocsNo
  15288. select new StockTemp
  15289. {
  15290. MatCode = stock.MatCode,
  15291. InvBarCode = stock.InvBarCode,
  15292. Grade = stock.Grade,
  15293. InvStateCode = stock.InvStateCode,
  15294. ProductTime = stock.ProductTime,
  15295. OneInTime = stock.OneInTime,
  15296. WbGroupCode = stock.WbGroupCode,
  15297. IsTorsChk = stock.IsTorsChk,
  15298. TorsChkQty = stock.TorsChkQty,
  15299. TorsChkValue = stock.TorsChkValue,
  15300. HoldTime = stock.HoldTime,
  15301. ProductMachCode = stock.ProductMachCode,
  15302. IsControlpanel = stock.IsControlpanel,
  15303. HWTypeCode = stock.HWTypeCode,
  15304. SolderCount = stock.SolderCount,
  15305. IsRework = stock.IsRework,
  15306. IsBlack = stock.IsBlack,
  15307. Col = loc.Col,
  15308. Layer = loc.Layer,
  15309. Shelf = loc.Shelf,
  15310. Depth = loc.Depth,
  15311. Code = loc.Code,
  15312. Tunnel = loc.Tunnel,
  15313. SCRel = loc.SCRel,
  15314. Floor = loc.Floor,
  15315. WarehouseCode = loc.WarehouseCode,
  15316. ContGrpBarCode = loc.ContGrpBarCode,
  15317. ContGrpId = loc.ContGrpId,
  15318. Id = loc.Id,
  15319. StateNum = loc.StateNum,
  15320. SkuCode = rule1.SkuCode,
  15321. Wind = stock.Wind,
  15322. InDocsNo = stock.InDocsNo,
  15323. BatchNo = stock.BatchNo
  15324. };
  15325. //查找满足时效但是没有全部检测完成的盘所在的机器组
  15326. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15327. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.ExecStateCode == InvLockState.InvState_Normal.ToString() && p.Grade == "A" && p.IsControlpanel == true && p.IsTorsChk == true && p.TorsChkQty > 0 && string.IsNullOrEmpty(p.PreStock) //&& !p.ProductMachCode.Contains("R")
  15328. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  15329. )
  15330. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15331. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  15332. on stock.InDocsNo equals rule1.DocsNo
  15333. select new StockTemp
  15334. {
  15335. MatCode = stock.MatCode,
  15336. InvBarCode = stock.InvBarCode,
  15337. Grade = stock.Grade,
  15338. InvStateCode = stock.InvStateCode,
  15339. ProductTime = stock.ProductTime,
  15340. OneInTime = stock.OneInTime,
  15341. WbGroupCode = stock.WbGroupCode,
  15342. IsTorsChk = stock.IsTorsChk,
  15343. TorsChkQty = stock.TorsChkQty,
  15344. TorsChkValue = stock.TorsChkValue,
  15345. HoldTime = stock.HoldTime,
  15346. ProductMachCode = stock.ProductMachCode,
  15347. IsControlpanel = stock.IsControlpanel,
  15348. HWTypeCode = stock.HWTypeCode,
  15349. SolderCount = stock.SolderCount,
  15350. IsRework = stock.IsRework,
  15351. IsBlack = stock.IsBlack,
  15352. Col = loc.Col,
  15353. Layer = loc.Layer,
  15354. Shelf = loc.Shelf,
  15355. Depth = loc.Depth,
  15356. Code = loc.Code,
  15357. Tunnel = loc.Tunnel,
  15358. SCRel = loc.SCRel,
  15359. Floor = loc.Floor,
  15360. WarehouseCode = loc.WarehouseCode,
  15361. ContGrpBarCode = loc.ContGrpBarCode,
  15362. ContGrpId = loc.ContGrpId,
  15363. Id = loc.Id,
  15364. StateNum = loc.StateNum,
  15365. SkuCode = rule1.SkuCode,
  15366. Wind = stock.Wind,
  15367. InDocsNo = stock.InDocsNo,
  15368. BatchNo = stock.BatchNo
  15369. };
  15370. invlist = invlist.Union(invlistTors);
  15371. if (!invlist.Any())
  15372. {
  15373. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  15374. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15375. res.ResMsg = "库存不足";
  15376. return res;
  15377. }
  15378. if (!string.IsNullOrEmpty(request.Sku))
  15379. {
  15380. invlist = invlist.Where(p => p.SkuCode == request.Sku);
  15381. }
  15382. if (!string.IsNullOrEmpty(request.Wind))
  15383. {
  15384. invlist = invlist.Where(p => p.Wind == request.Wind);
  15385. }
  15386. //if (!string.IsNullOrEmpty(request.WbGroupCode))
  15387. //{
  15388. // invlist = invlist.Where(p => p.WbGroupCode == request.WbGroupCode);
  15389. //}
  15390. if (!string.IsNullOrEmpty(request.HwType))
  15391. {
  15392. invlist = invlist.Where(p => p.HWTypeCode.Contains(request.HwType));
  15393. }
  15394. if (!string.IsNullOrEmpty(request.IsTimeOut))
  15395. {
  15396. if (request.IsTimeOut == "0")
  15397. {
  15398. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours));
  15399. }
  15400. else if (request.IsTimeOut == "1")
  15401. {
  15402. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours >= timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours >= timeOutHoldHours));
  15403. }
  15404. }
  15405. //禁用巷道过滤
  15406. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  15407. if (tunlist.Any())
  15408. {
  15409. if (tunlist.Where(p => p.Default2 == "1").Any())
  15410. {
  15411. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15412. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15413. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  15414. }
  15415. if (tunlist.Where(p => p.Default2 == "2").Any())
  15416. {
  15417. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15418. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15419. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  15420. }
  15421. if (tunlist.Where(p => p.Default2 == "3").Any())
  15422. {
  15423. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15424. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15425. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  15426. }
  15427. }
  15428. if (!invlist.Any())
  15429. {
  15430. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  15431. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15432. res.ResMsg = "库存不足";
  15433. return res;
  15434. }
  15435. invlist = invlist.Distinct();
  15436. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  15437. var rules = new BillPboxrule();
  15438. foreach (var item in temps)
  15439. {
  15440. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  15441. if (!invlist.Any())
  15442. {
  15443. continue;
  15444. }
  15445. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => new { p.SkuCode, p.Wind, p.WbGroupCode }).ToList();
  15446. foreach (var stockTemps in mater)
  15447. {
  15448. invlist = invlist.Where(p => p.SkuCode == stockTemps.Key.SkuCode && p.Wind == stockTemps.Key.Wind && p.WbGroupCode == stockTemps.Key.WbGroupCode);
  15449. if (!invlist.Any())
  15450. {
  15451. continue;
  15452. }
  15453. var ti = DateTime.Now;
  15454. var yaar = ti.Year.ToString().Substring(2, 2);
  15455. var month = ti.Month.ToString().PadLeft(2, '0');
  15456. var day = ti.Day.ToString().PadLeft(2, '0');
  15457. //获取当天最大箱号
  15458. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  15459. string boxserial = "HAZDA";
  15460. if (maxnumre.Any())
  15461. {
  15462. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  15463. _boxserialrepository.Insert(new BillBoxSerial()
  15464. {
  15465. Year = yaar,
  15466. Month = month,
  15467. Day = day,
  15468. Num = maxnumre.Max(q => q.Num) + 1,
  15469. BoxNum = boxserial,
  15470. Grade = "A",
  15471. AddTime = DateTime.Now,
  15472. AddWho = "wms",
  15473. EditTime = DateTime.Now,
  15474. EditWho = "wms"
  15475. });
  15476. }
  15477. else
  15478. {
  15479. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  15480. _boxserialrepository.Insert(new BillBoxSerial()
  15481. {
  15482. Year = yaar,
  15483. Month = month,
  15484. Day = day,
  15485. Num = 1,
  15486. BoxNum = boxserial,
  15487. Grade = "A",
  15488. AddTime = DateTime.Now,
  15489. AddWho = "wms",
  15490. EditTime = DateTime.Now,
  15491. EditWho = "wms"
  15492. });
  15493. }
  15494. if (invlist.Any(p => p.Wind == "L"))
  15495. {
  15496. invlist = invlist.Where(p => p.Wind == "L");
  15497. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15498. rule.Id = GetId();
  15499. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15500. rule.PBoxCode = boxserial;
  15501. rule.Wind = "L";
  15502. rule.ZXStateCode = 1;
  15503. rule.SpoolType = item.Key;
  15504. rule.PackRule = "ManualSpecial";
  15505. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15506. rule.SkuCode = "Test123";
  15507. rule.BatchNo = "1";
  15508. rules = _boxrulerepository.InsertReturnEntity(rule);
  15509. }
  15510. else
  15511. {
  15512. invlist = invlist.Where(p => p.Wind == "R");
  15513. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15514. rule.Id = GetId();
  15515. rule.PBoxCode = boxserial;
  15516. rule.Wind = "R";
  15517. rule.ZXStateCode = 1;
  15518. rule.SpoolType = item.Key;
  15519. rule.PackRule = "ManualSpecial";
  15520. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15521. rule.SkuCode = "Test123";
  15522. rule.BatchNo = "1";
  15523. rules = _boxrulerepository.InsertReturnEntity(rule);
  15524. }
  15525. if (item.Key == "BS60" || item.Key == "BS40")
  15526. {
  15527. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  15528. }
  15529. else
  15530. {
  15531. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  15532. }
  15533. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.SContent)).OrderBy(p => p.EditTime).First();
  15534. //码垛信息校验
  15535. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  15536. {
  15537. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  15538. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  15539. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  15540. return res;
  15541. }
  15542. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  15543. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  15544. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  15545. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15546. {
  15547. res.ResCode = trayres.ResCode;
  15548. res.ResMsg = trayres.ResMsg;
  15549. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  15550. return res;
  15551. }
  15552. var root = DetermineRoot(palletequip.Code);
  15553. var pallet = new Palletizing()
  15554. {
  15555. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  15556. PalletizState = 0,
  15557. Equip = palletequip.Code,
  15558. Finish = 0,
  15559. AddWho = "",
  15560. EditWho = "",
  15561. BoxRule = rules.PackRule,
  15562. BoxRuleId = rules.Id,
  15563. IsControlpanel = false,
  15564. TaskNum = int.Parse(trayres.Memo1),
  15565. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  15566. Robot = root
  15567. };
  15568. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  15569. List<PalletLayerMath> math = new List<PalletLayerMath>();
  15570. foreach (var invs in invlist)
  15571. {
  15572. var palletlayer = new PalletLayerMath()
  15573. {
  15574. ContGrpId = (long)invs.ContGrpId,
  15575. ContBarCode = invs.ContGrpBarCode,
  15576. Layer = 0,
  15577. SkuCode = rules.SkuCode,
  15578. Finish = 0,
  15579. PboxruleId = rules.Id,
  15580. Istask = 0,
  15581. Palletequip = palletequip.Code,
  15582. Depth = invs.Depth,
  15583. IsBlack = invs.IsBlack,
  15584. SolderCount = invs.SolderCount,
  15585. BoxCode = rules.PBoxCode,
  15586. PalletizingId = pallects.Id
  15587. };
  15588. math.Add(palletlayer);
  15589. }
  15590. _palletlayerMathrepository.InsertRange(math);
  15591. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  15592. {
  15593. PreStock = "1"
  15594. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  15595. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  15596. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  15597. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15598. var curdocid = maxdocid + 1;
  15599. if (palletMach.Any())
  15600. {
  15601. var pid = palletMach.First().PalletizingId;
  15602. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Any() && _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID) > 0)
  15603. {
  15604. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15605. }
  15606. }
  15607. foreach (var code in invlist)
  15608. {
  15609. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  15610. if (cell == null)
  15611. {
  15612. continue;
  15613. }
  15614. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15615. if (invs == null)
  15616. {
  15617. continue;
  15618. }
  15619. //先判断二升位是否能出库
  15620. if (code.Depth == 2)
  15621. {
  15622. var respon = MoveTask(code.Code);
  15623. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15624. {
  15625. continue;
  15626. }
  15627. }
  15628. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  15629. {
  15630. Code = code.ContGrpBarCode,
  15631. Equip = pallects.Equip,
  15632. Mater = code.MatCode,
  15633. Srm = code.SCRel,
  15634. PalletLayer = 1,
  15635. Grade = code.Grade,
  15636. Tunnel = code.Tunnel.ToString(),
  15637. CellCode = code.Code,
  15638. SkuCode = rules.SkuCode,
  15639. ProductMachCode = code.ProductMachCode,
  15640. Floor = code.Floor,
  15641. PalletizingId = pallects.Id,
  15642. Robot = root,
  15643. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  15644. DocId = curdocid
  15645. });
  15646. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15647. {
  15648. continue;
  15649. }
  15650. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15651. {
  15652. Istask = 1,
  15653. Layer = 1
  15654. }, p => p.ContBarCode == code.ContGrpBarCode);
  15655. }
  15656. return res;
  15657. }
  15658. }
  15659. return res;
  15660. }
  15661. public SRes CGrageStockOut(PalletizingPackStockOutRequest request)
  15662. {
  15663. var res = new SRes();
  15664. return res;//改造后方法没有修改,暂时注释
  15665. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "CGreade");
  15666. if (palletlist.Any())
  15667. {
  15668. foreach (var item in palletlist)
  15669. {
  15670. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  15671. //if (tasklist.Any())
  15672. //{
  15673. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  15674. // continue;
  15675. //}
  15676. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  15677. if (equips == null)
  15678. {
  15679. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut2", new RedisErrorInfo() { Equip = "CgradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  15680. continue;
  15681. }
  15682. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  15683. if (!palletMach.Any())
  15684. {
  15685. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut3", new RedisErrorInfo() { Equip = "CgradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  15686. continue;
  15687. }
  15688. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  15689. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  15690. if (tasklayer != 12 && tasklayer < 12)
  15691. {
  15692. palletMach = palletMach.Take(12 - tasklayer);
  15693. foreach (var pallets in palletMach)
  15694. {
  15695. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15696. if (cell == null)
  15697. {
  15698. continue;
  15699. }
  15700. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15701. if (invs == null)
  15702. {
  15703. continue;
  15704. }
  15705. var root = DetermineRoot(pallets.Palletequip);
  15706. //先判断二升位是否能出库
  15707. if (cell.Depth == 2)
  15708. {
  15709. var respon = MoveTask(cell.Code);
  15710. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15711. {
  15712. continue;
  15713. }
  15714. }
  15715. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15716. {
  15717. Code = pallets.ContBarCode,
  15718. CellCode = cell.Code,
  15719. Srm = cell.SCRel,
  15720. Tunnel = cell.Tunnel.ToString(),
  15721. Floor = cell.Floor,
  15722. Grade = invs.Grade,
  15723. Mater = invs.MatCode,
  15724. SkuCode = pallets.SkuCode,
  15725. PalletLayer = curlayer,
  15726. ProductMachCode = invs.ProductMachCode,
  15727. Equip = item.Equip,
  15728. PalletizingId = item.Id,
  15729. Robot = root,
  15730. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  15731. });
  15732. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15733. {
  15734. continue;
  15735. }
  15736. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15737. {
  15738. Istask = 1,
  15739. Layer = curlayer
  15740. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15741. }
  15742. return res;
  15743. }
  15744. else
  15745. {
  15746. foreach (var pallets in palletMach)
  15747. {
  15748. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15749. if (cell == null)
  15750. {
  15751. continue;
  15752. }
  15753. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15754. if (invs == null)
  15755. {
  15756. continue;
  15757. }
  15758. var root = DetermineRoot(pallets.Palletequip);
  15759. //先判断二升位是否能出库
  15760. if (cell.Depth == 2)
  15761. {
  15762. var respon = MoveTask(cell.Code);
  15763. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15764. {
  15765. continue;
  15766. }
  15767. }
  15768. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15769. {
  15770. Code = pallets.ContBarCode,
  15771. CellCode = cell.Code,
  15772. Srm = cell.SCRel,
  15773. Tunnel = cell.Tunnel.ToString(),
  15774. Floor = cell.Floor,
  15775. Grade = invs.Grade,
  15776. Mater = invs.MatCode,
  15777. SkuCode = pallets.SkuCode,
  15778. PalletLayer = curlayer + 1,
  15779. ProductMachCode = invs.ProductMachCode,
  15780. Equip = item.Equip,
  15781. PalletizingId = item.Id,
  15782. Robot = root,
  15783. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  15784. });
  15785. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15786. {
  15787. continue;
  15788. }
  15789. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15790. {
  15791. Istask = 1,
  15792. Layer = curlayer + 1
  15793. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15794. }
  15795. return res;
  15796. }
  15797. }
  15798. }
  15799. //取视图码垛设备号
  15800. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  15801. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  15802. {
  15803. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut4", new RedisErrorInfo() { Equip = "CgradeOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  15804. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15805. res.ResMsg = "没有空闲的码垛工位";
  15806. return res;
  15807. }
  15808. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  15809. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  15810. if (!devices.Where(p => p.pH_STATUS == true).Any())
  15811. {
  15812. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut5", new RedisErrorInfo() { Equip = "CgradeOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  15813. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15814. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  15815. return res;
  15816. }
  15817. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  15818. //var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  15819. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15820. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "C" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  15821. && !p.InDocsNo.StartsWith("CHA"))
  15822. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15823. select new StockTemp
  15824. {
  15825. MatCode = stock.MatCode,
  15826. InvBarCode = stock.InvBarCode,
  15827. Grade = stock.Grade,
  15828. InvStateCode = stock.InvStateCode,
  15829. ProductTime = stock.ProductTime,
  15830. WbGroupCode = stock.WbGroupCode,
  15831. IsTorsChk = stock.IsTorsChk,
  15832. TorsChkQty = stock.TorsChkQty,
  15833. TorsChkValue = stock.TorsChkValue,
  15834. HoldTime = stock.HoldTime,
  15835. ProductMachCode = stock.ProductMachCode,
  15836. IsControlpanel = stock.IsControlpanel,
  15837. HWTypeCode = stock.HWTypeCode,
  15838. SolderCount = stock.SolderCount,
  15839. IsRework = stock.IsRework,
  15840. IsBlack = stock.IsBlack,
  15841. Col = loc.Col,
  15842. Layer = loc.Layer,
  15843. Shelf = loc.Shelf,
  15844. Depth = loc.Depth,
  15845. Code = loc.Code,
  15846. Tunnel = loc.Tunnel,
  15847. SCRel = loc.SCRel,
  15848. Floor = loc.Floor,
  15849. WarehouseCode = loc.WarehouseCode,
  15850. ContGrpBarCode = loc.ContGrpBarCode,
  15851. ContGrpId = loc.ContGrpId,
  15852. Id = loc.Id,
  15853. StateNum = loc.StateNum,
  15854. Wind = stock.Wind,
  15855. InDocsNo = stock.InDocsNo
  15856. };
  15857. if (!invlist.Any())
  15858. {
  15859. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut6", new RedisErrorInfo() { Equip = "CgradeOut6", Con = "库存不足", Time = DateTime.Now });
  15860. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15861. res.ResMsg = "库存不足";
  15862. return res;
  15863. }
  15864. invlist = invlist.Distinct();
  15865. var temps = invlist.GroupBy(p => p.HWTypeCode);
  15866. var rules = new BillPboxrule();
  15867. foreach (var item in temps)
  15868. {
  15869. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  15870. if (!invlist.Any())
  15871. {
  15872. continue;
  15873. }
  15874. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  15875. foreach (var stockTemps in mater)
  15876. {
  15877. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  15878. if (!invlist.Any())
  15879. {
  15880. continue;
  15881. }
  15882. if (invlist.Any(p => p.Wind == "L"))
  15883. {
  15884. invlist = invlist.Where(p => p.Wind == "L");
  15885. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15886. rule.Id = GetId();
  15887. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15888. rule.Wind = "L";
  15889. rule.ZXStateCode = 1;
  15890. rule.SpoolType = item.Key;
  15891. rule.PackRule = "CGreade";
  15892. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15893. rule.SkuCode = "TestC12";
  15894. rule.BatchNo = "22";
  15895. rules = _boxrulerepository.InsertReturnEntity(rule);
  15896. }
  15897. else
  15898. {
  15899. invlist = invlist.Where(p => p.Wind == "R");
  15900. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15901. rule.Id = GetId();
  15902. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15903. rule.Wind = "R";
  15904. rule.ZXStateCode = 1;
  15905. rule.SpoolType = item.Key;
  15906. rule.PackRule = "CGreade";
  15907. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15908. rule.SkuCode = "TestC12";
  15909. rule.BatchNo = "22";
  15910. rules = _boxrulerepository.InsertReturnEntity(rule);
  15911. }
  15912. if (item.Key == "BS60" || item.Key == "BS40")
  15913. {
  15914. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  15915. }
  15916. else
  15917. {
  15918. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  15919. }
  15920. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  15921. //码垛信息校验
  15922. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  15923. {
  15924. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  15925. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  15926. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  15927. return res;
  15928. }
  15929. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  15930. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  15931. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  15932. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15933. {
  15934. res.ResCode = trayres.ResCode;
  15935. res.ResMsg = trayres.ResMsg;
  15936. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut7", new RedisErrorInfo() { Equip = "CgradeOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  15937. return res;
  15938. }
  15939. var pallet = new Palletizing()
  15940. {
  15941. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  15942. PalletizState = 0,
  15943. Equip = palletequip.Code,
  15944. Finish = 0,
  15945. AddWho = "",
  15946. EditWho = "",
  15947. BoxRule = rules.PackRule,
  15948. BoxRuleId = rules.Id,
  15949. IsControlpanel = false,
  15950. TaskNum = int.Parse(trayres.Memo1),
  15951. GoodsType = item.Key == "BS80/33" ? 1 : 2
  15952. };
  15953. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  15954. List<PalletLayerMath> math = new List<PalletLayerMath>();
  15955. foreach (var invs in invlist)
  15956. {
  15957. var palletlayer = new PalletLayerMath()
  15958. {
  15959. ContGrpId = (long)invs.ContGrpId,
  15960. ContBarCode = invs.ContGrpBarCode,
  15961. Layer = 0,
  15962. SkuCode = rules.SkuCode,
  15963. Finish = 0,
  15964. PboxruleId = rules.Id,
  15965. Istask = 0,
  15966. Palletequip = palletequip.Code,
  15967. Depth = invs.Depth,
  15968. IsBlack = invs.IsBlack,
  15969. SolderCount = invs.SolderCount,
  15970. BoxCode = rules.PBoxCode
  15971. };
  15972. math.Add(palletlayer);
  15973. }
  15974. _palletlayerMathrepository.InsertRange(math);
  15975. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  15976. {
  15977. PreStock = "1"
  15978. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  15979. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  15980. foreach (var code in invlist)
  15981. {
  15982. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  15983. if (cell == null)
  15984. {
  15985. continue;
  15986. }
  15987. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15988. if (invs == null)
  15989. {
  15990. continue;
  15991. }
  15992. var root = DetermineRoot(palletequip.Code);
  15993. //先判断二升位是否能出库
  15994. if (code.Depth == 2)
  15995. {
  15996. var respon = MoveTask(code.Code);
  15997. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15998. {
  15999. continue;
  16000. }
  16001. }
  16002. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  16003. {
  16004. Code = code.ContGrpBarCode,
  16005. Equip = pallects.Equip,
  16006. Mater = code.MatCode,
  16007. Srm = code.SCRel,
  16008. PalletLayer = 1,
  16009. Grade = code.Grade,
  16010. Tunnel = code.Tunnel.ToString(),
  16011. CellCode = code.Code,
  16012. SkuCode = rules.SkuCode,
  16013. ProductMachCode = code.ProductMachCode,
  16014. Floor = code.Floor,
  16015. PalletizingId = pallects.Id,
  16016. Robot = root,
  16017. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  16018. });
  16019. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16020. {
  16021. continue;
  16022. }
  16023. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16024. {
  16025. Istask = 1,
  16026. Layer = 1
  16027. }, p => p.ContBarCode == code.ContGrpBarCode);
  16028. }
  16029. return res;
  16030. }
  16031. }
  16032. return res;
  16033. }
  16034. public SRes OnePackStock(PalletizingPackStockOutRequest request)
  16035. {
  16036. var res = new SRes();
  16037. return res;//改造后方法没有修改,暂时注释
  16038. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "OnePack");
  16039. if (palletlist.Any())
  16040. {
  16041. foreach (var item in palletlist)
  16042. {
  16043. var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.Status < TaskStatus.码垛合流 && p.Type == TaskType.OutDepot && p.PalletizingId == item.Id && p.AddrTo == item.Equip).SplitTable(p => p.Take(2));
  16044. if (tasklist.Any())
  16045. {
  16046. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut1", new RedisErrorInfo() { Equip = "OnePackOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  16047. continue;
  16048. }
  16049. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  16050. if (equips == null)
  16051. {
  16052. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut2", new RedisErrorInfo() { Equip = "OnePackOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  16053. continue;
  16054. }
  16055. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  16056. if (!palletMach.Any())
  16057. {
  16058. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut3", new RedisErrorInfo() { Equip = "OnePackOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  16059. continue;
  16060. }
  16061. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  16062. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  16063. if (tasklayer != 12 && tasklayer < 12)
  16064. {
  16065. palletMach = palletMach.Take(12 - tasklayer);
  16066. foreach (var pallets in palletMach)
  16067. {
  16068. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  16069. if (cell == null)
  16070. {
  16071. continue;
  16072. }
  16073. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16074. if (invs == null)
  16075. {
  16076. continue;
  16077. }
  16078. var root = DetermineRoot(pallets.Palletequip);
  16079. //先判断二升位是否能出库
  16080. if (cell.Depth == 2)
  16081. {
  16082. var respon = MoveTask(cell.Code);
  16083. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16084. {
  16085. continue;
  16086. }
  16087. }
  16088. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  16089. {
  16090. Code = pallets.ContBarCode,
  16091. CellCode = cell.Code,
  16092. Srm = cell.SCRel,
  16093. Tunnel = cell.Tunnel.ToString(),
  16094. Floor = cell.Floor,
  16095. Grade = invs.Grade,
  16096. Mater = invs.MatCode,
  16097. SkuCode = pallets.SkuCode,
  16098. PalletLayer = curlayer,
  16099. ProductMachCode = invs.ProductMachCode,
  16100. Equip = item.Equip,
  16101. PalletizingId = item.Id,
  16102. Robot = root,
  16103. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  16104. });
  16105. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16106. {
  16107. continue;
  16108. }
  16109. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16110. {
  16111. Istask = 1,
  16112. Layer = curlayer
  16113. }, p => p.ContBarCode == invs.ContGrpBarCode);
  16114. }
  16115. return res;
  16116. }
  16117. else
  16118. {
  16119. foreach (var pallets in palletMach)
  16120. {
  16121. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  16122. if (cell == null)
  16123. {
  16124. continue;
  16125. }
  16126. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16127. if (invs == null)
  16128. {
  16129. continue;
  16130. }
  16131. var root = DetermineRoot(pallets.Palletequip);
  16132. //先判断二升位是否能出库
  16133. if (cell.Depth == 2)
  16134. {
  16135. var respon = MoveTask(cell.Code);
  16136. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16137. {
  16138. continue;
  16139. }
  16140. }
  16141. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  16142. {
  16143. Code = pallets.ContBarCode,
  16144. CellCode = cell.Code,
  16145. Srm = cell.SCRel,
  16146. Tunnel = cell.Tunnel.ToString(),
  16147. Floor = cell.Floor,
  16148. Grade = invs.Grade,
  16149. Mater = invs.MatCode,
  16150. SkuCode = pallets.SkuCode,
  16151. PalletLayer = curlayer + 1,
  16152. ProductMachCode = invs.ProductMachCode,
  16153. Equip = item.Equip,
  16154. PalletizingId = item.Id,
  16155. Robot = root,
  16156. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  16157. });
  16158. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16159. {
  16160. continue;
  16161. }
  16162. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16163. {
  16164. Istask = 1,
  16165. Layer = curlayer + 1
  16166. }, p => p.ContBarCode == invs.ContGrpBarCode);
  16167. }
  16168. return res;
  16169. }
  16170. }
  16171. }
  16172. //取视图码垛设备号
  16173. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  16174. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  16175. {
  16176. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut4", new RedisErrorInfo() { Equip = "OnePackOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  16177. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16178. res.ResMsg = "没有空闲的码垛工位";
  16179. return res;
  16180. }
  16181. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  16182. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  16183. if (!devices.Where(p => p.pH_STATUS == true).Any())
  16184. {
  16185. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut5", new RedisErrorInfo() { Equip = "OnePackOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  16186. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16187. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  16188. return res;
  16189. }
  16190. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  16191. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16192. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  16193. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16194. select new StockTemp
  16195. {
  16196. MatCode = stock.MatCode,
  16197. InvBarCode = stock.InvBarCode,
  16198. Grade = stock.Grade,
  16199. InvStateCode = stock.InvStateCode,
  16200. ProductTime = stock.ProductTime,
  16201. WbGroupCode = stock.WbGroupCode,
  16202. IsTorsChk = stock.IsTorsChk,
  16203. TorsChkQty = stock.TorsChkQty,
  16204. TorsChkValue = stock.TorsChkValue,
  16205. HoldTime = stock.HoldTime,
  16206. ProductMachCode = stock.ProductMachCode,
  16207. IsControlpanel = stock.IsControlpanel,
  16208. HWTypeCode = stock.HWTypeCode,
  16209. SolderCount = stock.SolderCount,
  16210. IsRework = stock.IsRework,
  16211. IsBlack = stock.IsBlack,
  16212. Col = loc.Col,
  16213. Layer = loc.Layer,
  16214. Shelf = loc.Shelf,
  16215. Depth = loc.Depth,
  16216. Code = loc.Code,
  16217. Tunnel = loc.Tunnel,
  16218. SCRel = loc.SCRel,
  16219. Floor = loc.Floor,
  16220. WarehouseCode = loc.WarehouseCode,
  16221. ContGrpBarCode = loc.ContGrpBarCode,
  16222. ContGrpId = loc.ContGrpId,
  16223. Id = loc.Id,
  16224. StateNum = loc.StateNum,
  16225. Wind = stock.Wind,
  16226. InDocsNo = stock.InDocsNo
  16227. };
  16228. if (!invlist.Any())
  16229. {
  16230. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut6", new RedisErrorInfo() { Equip = "OnePackOut6", Con = "库存不足", Time = DateTime.Now });
  16231. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16232. res.ResMsg = "库存不足";
  16233. return res;
  16234. }
  16235. invlist = invlist.Distinct();
  16236. var temps = invlist.GroupBy(p => p.HWTypeCode);
  16237. var rules = new BillPboxrule();
  16238. foreach (var item in temps)
  16239. {
  16240. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  16241. if (!invlist.Any())
  16242. {
  16243. continue;
  16244. }
  16245. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  16246. foreach (var stockTemps in mater)
  16247. {
  16248. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  16249. if (!invlist.Any())
  16250. {
  16251. continue;
  16252. }
  16253. if (invlist.Any(p => p.Wind == "L"))
  16254. {
  16255. invlist = invlist.Where(p => p.Wind == "L");
  16256. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16257. rule.Id = GetId();
  16258. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16259. rule.Wind = "L";
  16260. rule.ZXStateCode = 1;
  16261. rule.SpoolType = item.Key;
  16262. rule.PackRule = "OnePack";
  16263. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16264. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  16265. rule.BatchNo = "1";
  16266. rules = _boxrulerepository.InsertReturnEntity(rule);
  16267. }
  16268. else
  16269. {
  16270. invlist = invlist.Where(p => p.Wind == "R");
  16271. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16272. rule.Id = GetId();
  16273. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16274. rule.Wind = "R";
  16275. rule.ZXStateCode = 1;
  16276. rule.SpoolType = item.Key;
  16277. rule.PackRule = "OnePack";
  16278. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16279. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  16280. rule.BatchNo = "1";
  16281. rules = _boxrulerepository.InsertReturnEntity(rule);
  16282. }
  16283. if (item.Key == "BS60" || item.Key == "BS40")
  16284. {
  16285. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  16286. }
  16287. else
  16288. {
  16289. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  16290. }
  16291. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  16292. //码垛信息校验
  16293. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  16294. {
  16295. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  16296. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  16297. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  16298. return res;
  16299. }
  16300. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  16301. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  16302. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  16303. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16304. {
  16305. res.ResCode = trayres.ResCode;
  16306. res.ResMsg = trayres.ResMsg;
  16307. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut7", new RedisErrorInfo() { Equip = "OnePackOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  16308. return res;
  16309. }
  16310. var pallet = new Palletizing()
  16311. {
  16312. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  16313. PalletizState = 0,
  16314. Equip = palletequip.Code,
  16315. Finish = 0,
  16316. AddWho = "",
  16317. EditWho = "",
  16318. BoxRule = rules.PackRule,
  16319. BoxRuleId = rules.Id,
  16320. IsControlpanel = false,
  16321. TaskNum = int.Parse(trayres.Memo1),
  16322. GoodsType = item.Key == "BS80/33" ? 1 : 2
  16323. };
  16324. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  16325. List<PalletLayerMath> math = new List<PalletLayerMath>();
  16326. foreach (var invs in invlist)
  16327. {
  16328. var palletlayer = new PalletLayerMath()
  16329. {
  16330. ContGrpId = (long)invs.ContGrpId,
  16331. ContBarCode = invs.ContGrpBarCode,
  16332. Layer = 0,
  16333. SkuCode = rules.SkuCode,
  16334. Finish = 0,
  16335. PboxruleId = rules.Id,
  16336. Istask = 0,
  16337. Palletequip = palletequip.Code,
  16338. Depth = invs.Depth,
  16339. IsBlack = invs.IsBlack,
  16340. SolderCount = invs.SolderCount,
  16341. BoxCode = rules.PBoxCode
  16342. };
  16343. math.Add(palletlayer);
  16344. }
  16345. _palletlayerMathrepository.InsertRange(math);
  16346. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  16347. {
  16348. PreStock = "1"
  16349. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  16350. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  16351. foreach (var code in invlist)
  16352. {
  16353. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  16354. if (cell == null)
  16355. {
  16356. continue;
  16357. }
  16358. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16359. if (invs == null)
  16360. {
  16361. continue;
  16362. }
  16363. var root = DetermineRoot(palletequip.Code);
  16364. //先判断二升位是否能出库
  16365. if (code.Depth == 2)
  16366. {
  16367. var respon = MoveTask(code.Code);
  16368. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16369. {
  16370. continue;
  16371. }
  16372. }
  16373. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  16374. {
  16375. Code = code.ContGrpBarCode,
  16376. Equip = pallects.Equip,
  16377. Mater = code.MatCode,
  16378. Srm = code.SCRel,
  16379. PalletLayer = 1,
  16380. Grade = code.Grade,
  16381. Tunnel = code.Tunnel.ToString(),
  16382. CellCode = code.Code,
  16383. SkuCode = rules.SkuCode,
  16384. ProductMachCode = code.ProductMachCode,
  16385. Floor = code.Floor,
  16386. PalletizingId = pallects.Id,
  16387. Robot = root,
  16388. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  16389. });
  16390. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16391. {
  16392. continue;
  16393. }
  16394. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16395. {
  16396. Istask = 1,
  16397. Layer = 1
  16398. }, p => p.ContBarCode == code.ContGrpBarCode);
  16399. }
  16400. return res;
  16401. }
  16402. }
  16403. return res;
  16404. }
  16405. public SRes<bool> IsExistTask(DetailCodeRequest request)
  16406. {
  16407. var result = new SRes<bool>();
  16408. result.ResData = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == request.Code && p.Status < TaskStatus.Finish).Any();
  16409. return result;
  16410. }
  16411. public SRes<string> GetLocationInfo(DetailCodeRequest request)
  16412. {
  16413. var result = new SRes<string>();
  16414. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == request.Code && p.StateNum == LocationState.LocationState_Full).ToList();
  16415. result.ResData = cell.Any() ? cell.First().Code : "";
  16416. return result;
  16417. }
  16418. public SRes CancelPreStockinfo(CancelPreStockinfoRequest request)
  16419. {
  16420. var res = new SRes();
  16421. if (!request.Ids.Any())
  16422. {
  16423. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  16424. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  16425. return res;
  16426. }
  16427. foreach (var item in request.Ids)
  16428. {
  16429. var match = _palletlayerMathrepository.GetSingle(p => p.Id == item && p.Istask == 0);
  16430. if (match == null)
  16431. {
  16432. continue;
  16433. }
  16434. var inv = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == match.ContBarCode && p.ContGrpId == match.ContGrpId && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16435. if (inv == null)
  16436. {
  16437. continue;
  16438. }
  16439. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == inv.ContGrpBarCode).First();
  16440. if (task != null)
  16441. {
  16442. continue;
  16443. }
  16444. var sucess = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  16445. {
  16446. PreStock = string.Empty,
  16447. Memo = "取消预锁库存"
  16448. }, p => p.Id == inv.Id);
  16449. if (sucess)
  16450. {
  16451. _palletlayerMathrepository.Delete(p => p.Id == match.Id);
  16452. }
  16453. }
  16454. return res;
  16455. }
  16456. public SRes<GetTorsRangeRes> GetTorsRange(DetailCodeRequest request)
  16457. {
  16458. var result = new SRes<GetTorsRangeRes>() { ResData = new GetTorsRangeRes() };
  16459. var rules = _boxrulerepository.GetList(p => p.PBoxCode == request.Code);
  16460. if (rules != null && rules.Any())
  16461. {
  16462. var rule = rules.First();
  16463. result.ResData.TorsValue = rule.Torsion48Qty > 0 ? rule.Torsion48Qty : rule.Torsion72Qty > 0 ? rule.Torsion72Qty : rule.Torsion24Qty;
  16464. result.ResData.TorsRangeValue = rule.TorsionErrRange;
  16465. }
  16466. return result;
  16467. }
  16468. public SRes<string> GetCGradeList()
  16469. {
  16470. var res = new SRes<string>() { ResDataList = new List<string>() };
  16471. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16472. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.Grade == "C" || p.Grade == "D") && string.IsNullOrEmpty(p.PreStock)
  16473. && !p.InDocsNo.StartsWith("CHA"))
  16474. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16475. select loc.Code;
  16476. if (!invlist.Any())
  16477. {
  16478. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16479. res.ResMsg = "没有C级品库存不足";
  16480. return res;
  16481. }
  16482. res.ResDataList = invlist.Distinct().ToList();
  16483. return res;
  16484. }
  16485. public SRes<string> GetBGradeTimeOutList()
  16486. {
  16487. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent); // int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  16488. var res = new SRes<string>() { ResDataList = new List<string>() };
  16489. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16490. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "B" && string.IsNullOrEmpty(p.PreStock)
  16491. && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  16492. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16493. select loc.Code;
  16494. if (!invlist.Any())
  16495. {
  16496. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16497. res.ResMsg = "没有B级品超时库存不足";
  16498. return res;
  16499. }
  16500. res.ResDataList = invlist.Distinct().ToList();
  16501. return res;
  16502. }
  16503. public SRes ErrorDateclearJob()
  16504. {
  16505. var res = new SRes();
  16506. try
  16507. {
  16508. var task = _taskrepository.AsQueryable().Where(p => p.BusType == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription() && p.Status == TaskStatus.StackerCompleted && p.Type == TaskType.OutDepot && (DateTime.Now - p.EditTime).TotalMinutes > 20).Take(2).ToList();
  16509. foreach (var item in task)
  16510. {
  16511. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.BarCode);
  16512. if (stock == null)
  16513. {
  16514. if (_taskrepository.Delete(p => p.ID == item.ID))
  16515. {
  16516. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish, EditTime = DateTime.Now }).Where(p => p.Id == item.ID).SplitTable(p => p.Take(2)).ExecuteCommand();
  16517. }
  16518. }
  16519. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString() || stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  16520. {
  16521. if (_taskrepository.Delete(p => p.ID == item.ID))
  16522. {
  16523. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  16524. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish, EditTime = DateTime.Now }).Where(p => p.Id == item.ID).SplitTable(p => p.Take(2)).ExecuteCommand();
  16525. }
  16526. }
  16527. else
  16528. {
  16529. continue;
  16530. }
  16531. }
  16532. }
  16533. catch (Exception ex)
  16534. {
  16535. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16536. res.ResMsg = ex.Message;
  16537. return res;
  16538. }
  16539. return res;
  16540. }
  16541. public SRes FlowDataMoveJob(PalletizingPackStockOutRequest request)
  16542. {
  16543. var res = new SRes();
  16544. //流水表
  16545. try
  16546. {
  16547. var flow = _billInvflow.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddDays(-60)).OrderBy(p => p.Id).Take(100).ToList();
  16548. if (flow.Any())
  16549. {
  16550. var ids = flow.Select(p => p.Id).Distinct().ToList();
  16551. var flowhty = _mapper.Map<List<Bill_InvflowHty>>(flow);
  16552. if (_flowhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16553. {
  16554. _flowhtyrepository.Context.Deleteable<Bill_InvflowHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16555. }
  16556. _flowhtyrepository.InsertableSplitTable(flowhty);
  16557. _billInvflow.Delete(p => ids.Contains(p.Id));
  16558. }
  16559. }
  16560. catch (Exception ex)
  16561. {
  16562. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16563. res.ResMsg = ex.Message;
  16564. return res;
  16565. }
  16566. //码垛主表
  16567. try
  16568. {
  16569. var pallet = _palletizrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6) && p.PalletizState == 1).OrderBy(p => p.Id).Take(100).ToList();
  16570. if (pallet.Any())
  16571. {
  16572. var ids = pallet.Select(p => p.Id).Distinct().ToList();
  16573. var pallethty = _mapper.Map<List<PalletizingHty>>(pallet);
  16574. if (_pallethtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16575. {
  16576. _pallethtyrepository.Context.Deleteable<PalletizingHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16577. }
  16578. _pallethtyrepository.InsertableSplitTable(pallethty);
  16579. _palletizrepository.Delete(p => ids.Contains(p.Id));
  16580. }
  16581. }
  16582. catch (Exception ex)
  16583. {
  16584. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16585. res.ResMsg = ex.Message;
  16586. return res;
  16587. }
  16588. //推送表
  16589. try
  16590. {
  16591. var push = _billPushinforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6)).OrderBy(p => p.Id).Take(100).ToList();
  16592. if (push.Any())
  16593. {
  16594. var ids = push.Select(p => p.Id).Distinct().ToList();
  16595. var pushthty = _mapper.Map<List<BillPushinfoHty>>(push);
  16596. if (_pushhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16597. {
  16598. _pushhtyrepository.Context.Deleteable<BillPushinfoHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16599. }
  16600. _pushhtyrepository.InsertableSplitTable(pushthty);
  16601. _billPushinforepository.Delete(p => ids.Contains(p.Id));
  16602. }
  16603. }
  16604. catch (Exception ex)
  16605. {
  16606. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16607. res.ResMsg = ex.Message;
  16608. return res;
  16609. }
  16610. //箱号表
  16611. try
  16612. {
  16613. var boxrule = _boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6) && p.ZXStateCode == 2).OrderBy(p => p.Id).Take(100).ToList();
  16614. if (boxrule.Any())
  16615. {
  16616. var ids = boxrule.Select(p => p.Id).Distinct().ToList();
  16617. var boxrulethty = _mapper.Map<List<BillPboxruleHty>>(boxrule);
  16618. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16619. {
  16620. _pboxrulehtyrepository.Context.Deleteable<BillPboxruleHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16621. }
  16622. _pboxrulehtyrepository.InsertableSplitTable(boxrulethty);
  16623. _boxrulerepository.Delete(p => ids.Contains(p.Id));
  16624. }
  16625. }
  16626. catch (Exception ex)
  16627. {
  16628. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16629. res.ResMsg = ex.Message;
  16630. return res;
  16631. }
  16632. return res;
  16633. }
  16634. /// <summary>
  16635. /// 清理任务数据
  16636. /// </summary>
  16637. /// <param name="request"></param>
  16638. /// <returns></returns>
  16639. public SRes RemoveTaskData(PalletizingPackStockOutRequest request)
  16640. {
  16641. var res = new SRes();
  16642. try
  16643. {
  16644. var sysconfcon = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TaskRemoveHours").SContent) * (-1);
  16645. var tasklist = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status == TaskStatus.NewBuild && p.AddTime < DateTime.Now.AddHours(sysconfcon)).Take(100).ToList();
  16646. //var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddHours(sysconfcon)).SplitTable(p => p.Take(2)).Take(100).ToList();
  16647. if (tasklist.Any())
  16648. {
  16649. var ids = tasklist.Select(p => p.ID).ToList();
  16650. var barlist = tasklist.Select(p => p.BarCode).ToList();
  16651. _taskrepository.Delete(p => ids.Contains(p.ID));//任务表
  16652. var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//
  16653. foreach (var item in tables)
  16654. {
  16655. //删除历史任务表
  16656. _wcstaskoldrepository.Context.Deleteable<WCS_TaskOld>().AS(item.TableName)//使用当前分表名
  16657. .Where(p => ids.Contains(p.Id))
  16658. .ExecuteCommand();
  16659. }
  16660. _billInvinitrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  16661. _billInvnowrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  16662. }
  16663. }
  16664. catch (Exception ex)
  16665. {
  16666. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16667. res.ResMsg = ex.Message;
  16668. return res;
  16669. }
  16670. return res;
  16671. }
  16672. public void WreTimeOutRecord(List<string> contbars, string msg)
  16673. {
  16674. try
  16675. {
  16676. if (contbars.Any())
  16677. {
  16678. //存在的数据更新,不存在的新增
  16679. if (msg.Length > 4900)
  16680. {
  16681. msg = msg.Substring(0, 4900);
  16682. }
  16683. _timeoutrecord.AsUpdateable().SetColumns(p => new BillTimeOutRecord() { Reason = msg, EditTime = DateTime.Now }).Where(p => contbars.Contains(p.ContGrpBarCode)).SplitTable(p => p.Take(2)).ExecuteCommand();
  16684. var existlist = _timeoutrecord.AsQueryable().SplitTable(p => p.Take(2)).Select(p => p.ContGrpBarCode).Distinct().ToList();
  16685. var noexistlist = contbars.Where(p => !existlist.Contains(p)).Distinct().ToList();
  16686. List<BillTimeOutRecord> listrec = noexistlist.Select(p => new BillTimeOutRecord() { ContGrpBarCode = p, Reason = msg, AddTime = DateTime.Now, EditTime = DateTime.Now }).ToList();
  16687. if (listrec.Any()) _timeoutrecord.Context.Insertable(listrec).SplitTable().ExecuteCommand();
  16688. }
  16689. }
  16690. catch (Exception ex)
  16691. {
  16692. _logger.LogInformation("记录超时信息异常" + ex.ToString());
  16693. }
  16694. }
  16695. /// <summary>
  16696. /// 码垛工位与对应的机器人的关系
  16697. /// </summary>
  16698. /// <param name="palletequip"></param>
  16699. /// <returns></returns>
  16700. private string DetermineRoot(string palletequip)
  16701. {
  16702. return palletequip switch
  16703. {
  16704. "8090" => "Robot1",
  16705. "8092" => "Robot1",
  16706. "8096" => "Robot2",
  16707. "8098" => "Robot2",
  16708. "8307" => "Robot3",
  16709. "5434" => "Robot10",
  16710. _ => string.Empty // 默认值或其他处理
  16711. };
  16712. }
  16713. /// <summary>
  16714. /// 转换为百分比
  16715. /// </summary>
  16716. /// <param name="value"></param>
  16717. /// <returns></returns>
  16718. private static string ToPercentage(decimal value)
  16719. {
  16720. return (value * 100).ToString("F2") + "%";
  16721. }
  16722. }
  16723. }