SXService.cs 1018 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814
  1. using AutoMapper;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using SqlSugar;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq.Expressions;
  8. using System.Text;
  9. using wms.dataservice.IDataSetvice;
  10. using wms.dto.request;
  11. using wms.dto;
  12. using wms.dto.request.sx;
  13. using wms.dto.response;
  14. using wms.dto.response.sx;
  15. using wms.service.IService;
  16. using wms.sqlsugar;
  17. using wms.sqlsugar.model;
  18. using wms.sqlsugar.model.sx;
  19. using wms.util.Check;
  20. using WCS.Entity.sx;
  21. using wms.util.Ext;
  22. using System.Linq;
  23. using wms.dto.request.share;
  24. using wms.dto.request.hj;
  25. using wms.dto.response.hj;
  26. using wms.dto.request.hj.dto;
  27. using Org.BouncyCastle.Asn1.Crmf;
  28. using Org.BouncyCastle.Asn1.Ocsp;
  29. using wms.util.Http;
  30. using wms.dto.request.fj;
  31. using NPOI.SS.Formula.Functions;
  32. using System.Data;
  33. using Org.BouncyCastle.Bcpg;
  34. using wms.dto.request.cp.dto;
  35. using wms.dto.request.cp;
  36. using wms.dto.response.cp;
  37. using wms.dto.response.share;
  38. using System.Collections.ObjectModel;
  39. using System.Diagnostics;
  40. using SqlSugar.Extensions;
  41. using System.Reflection.Emit;
  42. using Castle.Core.Internal;
  43. using wms.util;
  44. using System.Threading.Tasks;
  45. using TaskStatus = wms.dto.TaskStatus;
  46. using NPOI.Util;
  47. using Castle.DynamicProxy.Generators;
  48. using NPOI.SS.Formula;
  49. using System.Collections;
  50. using ICSharpCode.SharpZipLib.Zip;
  51. using SQLitePCL;
  52. using NPOI.XSSF.Model;
  53. using Org.BouncyCastle.Crypto;
  54. namespace wms.service.Service
  55. {
  56. public class SXService : ISXService
  57. {
  58. private readonly IMapper _mapper;
  59. private readonly ILogger<SXService> _logger;
  60. private readonly ISXDataService _sxtDataService;
  61. static object lockerPalletizingPackTask = new object();
  62. static object lockerApplyLoc = new object();
  63. //static object lockerMoveTake = new object();
  64. public SXService(IMapper mapper, ILogger<SXService> logger, ISXDataService sxtDataService)
  65. {
  66. _mapper = mapper;
  67. _logger = logger;
  68. _sxtDataService = sxtDataService;
  69. }
  70. private Repository<sxSysConfig> _sysconfigrepository => new Repository<sxSysConfig>();
  71. /// <summary>
  72. /// 容器表
  73. /// </summary>
  74. private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
  75. /// <summary>
  76. /// 当前任务表
  77. /// </summary>
  78. private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();
  79. /// <summary>
  80. /// 库存表
  81. /// </summary>
  82. private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();
  83. /// <summary>
  84. /// 条码表
  85. /// </summary>
  86. private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();
  87. /// <summary>
  88. /// 物料表
  89. /// </summary>
  90. private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();
  91. /// <summary>
  92. /// 单据表
  93. /// </summary>
  94. private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();
  95. /// <summary>
  96. /// 任务历史表
  97. /// </summary>
  98. private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();
  99. /// <summary>
  100. /// 流水表
  101. /// </summary>
  102. private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();
  103. /// <summary>
  104. /// 甲方管理系统推送反馈
  105. /// </summary>
  106. private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();
  107. /// <summary>
  108. /// 货位表
  109. /// </summary>
  110. private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();
  111. /// <summary>
  112. /// 仓库表
  113. /// </summary>
  114. private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();
  115. private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();
  116. /// <summary>
  117. /// 机台表
  118. /// </summary>
  119. private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();
  120. private Repository<sxSysJob> _jobrepository => new Repository<sxSysJob>();
  121. private Repository<sxSysJobApiRelation> _jobApirepository => new Repository<sxSysJobApiRelation>();
  122. private Repository<BillSkuInfo> _skuInforepository => new Repository<BillSkuInfo>();
  123. private Repository<BillPackInfo> _packInforepository => new Repository<BillPackInfo>();
  124. private Repository<BillPboxrule> _boxrulerepository => new Repository<BillPboxrule>();
  125. private Repository<BillBoxSerial> _boxserialrepository => new Repository<BillBoxSerial>();
  126. private Repository<PalletLayerMath> _palletlayerMathrepository => new Repository<PalletLayerMath>();
  127. private Repository<Palletizingdetail> _palletizdetailrepository => new Repository<Palletizingdetail>();
  128. private Repository<Palletizing> _palletizrepository => new Repository<Palletizing>();
  129. private Repository<BaseTorchbandinfo> _torchbandinforepository => new Repository<BaseTorchbandinfo>();
  130. private Repository<BaseErrorinfo> _errorinforepository => new Repository<BaseErrorinfo>();
  131. private Repository<TorschWbCount> _torschwbcount => new Repository<TorschWbCount>();
  132. private Repository<BaseErrorinfoWcs> _errorinfowcs => new Repository<BaseErrorinfoWcs>();
  133. private RepositoryTask<BillTimeOutRecord> _timeoutrecord => new RepositoryTask<BillTimeOutRecord>();
  134. private RepositoryTask<Bill_InvflowHty> _flowhtyrepository => new RepositoryTask<Bill_InvflowHty>();
  135. private RepositoryTask<BillPboxruleHty> _pboxrulehtyrepository => new RepositoryTask<BillPboxruleHty>();
  136. private RepositoryTask<BillPushinfoHty> _pushhtyrepository => new RepositoryTask<BillPushinfoHty>();
  137. private RepositoryTask<PalletizingHty> _pallethtyrepository => new RepositoryTask<PalletizingHty>();
  138. ITenant _db => SqlSugarHelper.Db;//处理事务
  139. /// <summary>
  140. /// 获取配置内容信息
  141. /// </summary>
  142. /// <param name="code">配置表code值</param>
  143. /// <returns></returns>
  144. public string GetSysConfigContentByCode(string code)
  145. {
  146. //先读缓存
  147. var cacheContent = RedisHelper.Get("sys_config" + code);
  148. if (!string.IsNullOrEmpty(cacheContent))
  149. {
  150. return cacheContent;
  151. }
  152. var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);
  153. if (sysconf == null)
  154. {
  155. throw new Exception("数据表没有配置" + code);
  156. }
  157. var content = sysconf.SContent;
  158. string sysname = sysconf.Default1;//所属系统mes/erp
  159. RedisHelper.Set("sys_config" + code, content + "|" + sysname);
  160. return content;
  161. }
  162. /// <summary>
  163. /// 获取配置信息
  164. /// </summary>
  165. /// <param name="code"></param>
  166. /// <returns></returns>
  167. public sxSysConfig GetSysConfigByCode(string code)
  168. {
  169. //Repository<dynamic> _billdtrepository = new Repository<dynamic>();
  170. return _sysconfigrepository.GetSingle(p => p.Code == code);
  171. }
  172. /// <summary>
  173. /// 获取配置信息
  174. /// </summary>
  175. /// <param name="code"></param>
  176. /// <returns></returns>
  177. public sxSysConfig GetSysConfigByExpression(Expression<Func<sxSysConfig, bool>> WhereExpression)
  178. {
  179. return _sysconfigrepository.GetSingle(WhereExpression);
  180. }
  181. /// <summary>
  182. /// 获取反馈信息
  183. /// </summary>
  184. /// <param name="code"></param>
  185. /// <returns></returns>
  186. public List<BillPushinfo> GetBillPushinfoList(Expression<Func<BillPushinfo, bool>> WhereExpression)
  187. {
  188. return _billPushinforepository.GetList(WhereExpression);
  189. }
  190. ///// <summary>
  191. ///// 获取单据信息
  192. ///// </summary>
  193. ///// <param name="code"></param>
  194. ///// <returns></returns>
  195. //public fjBillDocument GetBillDocumentList(Expression<Func<fjBillDocument, bool>> WhereExpression)
  196. //{
  197. // return _billdtrepository.Context.Queryable<fjBillDocument, fjSysConfig>((doc, conf) => new object[] {
  198. // JoinType.Left, doc.BState == conf.Code
  199. // }).Where((doc, conf) => doc.Status == 0)
  200. // .Select((bc, bm) => bc).First();
  201. //}
  202. /// <summary>
  203. /// 更新SysConfig表字段
  204. /// </summary>
  205. /// <param name="updateModel"></param>
  206. /// <returns></returns>
  207. public bool UpdateSysConfigModelColumns(UpdateModelColumns<sxSysConfig> updateModel)
  208. {
  209. return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  210. }
  211. public List<BaseMatinfo> GetBaseMatinfoList(Expression<Func<BaseMatinfo, bool>> WhereExpression)
  212. {
  213. return _basematerrepository.GetList(WhereExpression);
  214. }
  215. /// <summary>
  216. /// 更新物料基础信息表
  217. /// </summary>
  218. /// <param name="updateModel"></param>
  219. /// <returns></returns>
  220. public bool UpdateMaterModelColumns(UpdateModelColumns<BaseMatinfo> updateModel)
  221. {
  222. return _basematerrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  223. }
  224. public bool UpdateMaterModel(BaseMatinfo updateModel)
  225. {
  226. return _basematerrepository.Update(updateModel);
  227. }
  228. /// <summary>
  229. /// 更新BillPushinfo表字段
  230. /// </summary>
  231. /// <param name="updateModel"></param>
  232. /// <returns></returns>
  233. public bool UpdateBillPushinfoModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  234. {
  235. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  236. }
  237. public bool SyncMaterInfo(List<SxSyncMaterInfoRequestItem> ResData)
  238. {
  239. foreach (var item in ResData)
  240. {
  241. if (_basematerrepository.IsAny(p => p.Code == item.MatCode))
  242. {
  243. _basematerrepository.UpdateModelColumns(p => new BaseMatinfo() { IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName, EditTime = DateTime.Now, Description = item.Describe },
  244. p => p.Code == item.MatCode);
  245. }
  246. else
  247. {
  248. var model = _mapper.Map<BaseMatinfo>(item);
  249. model.AddTime = DateTime.Now;
  250. _basematerrepository.Insert(model);
  251. }
  252. }
  253. return true;
  254. }
  255. /// <summary>
  256. /// 帘线工单信息传输
  257. /// </summary>
  258. /// <param name="reqDto"></param>
  259. /// <returns></returns>
  260. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  261. {
  262. var res = new SRes();
  263. List<BillPboxrule> rulelist = new List<BillPboxrule>();
  264. var skuinfolist = _skuInforepository.GetList(p => p.SkuCode == reqDto.SkuCode);
  265. if (!skuinfolist.Any())
  266. {
  267. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  268. res.ResMsg = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode;
  269. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode, Time = DateTime.Now });
  270. return res;
  271. }
  272. //箱号处理
  273. foreach (var item in reqDto.ListBoxInfo)
  274. {
  275. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == item.BoxNo);
  276. if (rule == null)
  277. {
  278. //判断历史数据箱号
  279. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(12)).Where(p => p.PBoxCode == item.BoxNo).Any())
  280. {
  281. continue;
  282. }
  283. var packinfllist = _packInforepository.GetList(p => p.PackCode == item.PackCode);
  284. if (!packinfllist.Any())
  285. {
  286. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  287. res.ResMsg = "没有找到包号,请先推送" + item.PackCode;
  288. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到包号,请先推送" + item.PackCode, Time = DateTime.Now });
  289. return res;
  290. }
  291. int solrder = 0;
  292. int perSolderMaxCount = 0;
  293. decimal torsion24Qty = 0;
  294. decimal torsion48Qty = 0;
  295. decimal torsionErrRange = 0;
  296. decimal hold = 0;
  297. if (skuinfolist.Where(p => p.FieldCode == "QC_B02").Any())
  298. {
  299. solrder = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B02").First().FieldValue);
  300. }
  301. if (skuinfolist.Where(p => p.FieldCode == "QC_B03").Any())
  302. {
  303. perSolderMaxCount = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B03").First().FieldValue);
  304. }
  305. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  306. {
  307. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  308. }
  309. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  310. {
  311. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  312. }
  313. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  314. {
  315. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  316. }
  317. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  318. {
  319. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  320. }
  321. rule = new BillPboxrule();
  322. rule.IsStop = 0;
  323. rule.DocsNo = reqDto.BillCode;
  324. rule.SkuCode = reqDto.SkuCode;
  325. rule.PBoxCode = item.BoxNo;
  326. rule.PackRule = reqDto.PackRule;
  327. rule.FullCountQty = item.FullCount;
  328. rule.IsSolder = solrder > 0 ? 1 : 0;
  329. rule.SolderMaxCount = solrder;
  330. rule.PerSolderMaxCount = perSolderMaxCount;
  331. rule.Torsion24Qty = torsion24Qty;
  332. rule.Torsion48Qty = torsion48Qty;
  333. rule.Torsion72Qty = 0;
  334. rule.TorsionErrRange = torsionErrRange;
  335. rule.ZXStateCode = 0;
  336. rule.BlackCount = 0;
  337. rule.ReturnCount = 0;
  338. rule.EmptyCountQty = item.EmptyCount;
  339. rule.TorsionMaxQty = 4;
  340. rule.TorsionMinQty = 1;
  341. rule.SpoolType = packinfllist.First().Spool;
  342. rule.HoldTime = hold;
  343. rule.PackJsonContent = JsonConvert.SerializeObject(packinfllist);
  344. rule.Wind = item.Winding;
  345. rule.BatchNo = item.Batch;
  346. rule.Dryer = item.PackCode;
  347. if (reqDto.ListPackagelnfo.Sum(p => p.Weight) > 0)
  348. {
  349. rule.PackWeight = reqDto.ListPackagelnfo.Sum(p => p.Weight) / 1000;
  350. }
  351. else
  352. {
  353. rule.PackWeight = packinfllist.Sum(p => p.Weight) / 1000;
  354. }
  355. if (packinfllist.Where(p => p.MatCode.StartsWith("C06-02-09") || p.MatCode.StartsWith("C12-01-06-0009")).Any())
  356. {
  357. if (packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).Any())
  358. {
  359. rule.TrayCode = packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).First().MatCode;
  360. //rule.TrayCode = "mutuopan";
  361. //rule.TrayCode = "rechulituopan";
  362. }
  363. }
  364. rulelist.Add(rule);
  365. }
  366. else
  367. {
  368. int solrder = 0;
  369. int perSolderMaxCount = 0;
  370. decimal torsion24Qty = 0;
  371. decimal torsion48Qty = 0;
  372. decimal torsionErrRange = 0;
  373. decimal hold = 0;
  374. if (skuinfolist.Where(p => p.FieldCode == "QC_B02").Any())
  375. {
  376. solrder = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B02").First().FieldValue);
  377. }
  378. if (skuinfolist.Where(p => p.FieldCode == "QC_B03").Any())
  379. {
  380. perSolderMaxCount = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B03").First().FieldValue);
  381. }
  382. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  383. {
  384. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  385. }
  386. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  387. {
  388. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  389. }
  390. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  391. {
  392. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  393. }
  394. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  395. {
  396. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  397. }
  398. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule()
  399. {
  400. SkuCode = reqDto.SkuCode,
  401. PackRule = reqDto.PackRule,
  402. SolderMaxCount = solrder,
  403. PerSolderMaxCount = perSolderMaxCount,
  404. Torsion24Qty = torsion24Qty,
  405. Torsion48Qty = torsion48Qty,
  406. EditWho = "MES重复推送",
  407. EditTime = DateTime.Now
  408. }).Where(p => p.PBoxCode == rule.PBoxCode && p.ZXStateCode == 0).ExecuteCommand();
  409. }
  410. }
  411. _boxrulerepository.InsertRange(rulelist);
  412. return res;
  413. }
  414. /// <summary>
  415. /// 帘线工字轮信息传输接口
  416. /// </summary>
  417. /// <param name="reqDto"></param>
  418. /// <returns></returns>
  419. public SRes SpoolMaterialInfoTrans(SxSpoolMaterialInfoTransRequest reqDto)
  420. {
  421. var res = new SRes();
  422. try
  423. {
  424. //var materlist = AppSettings.GetConfig("MaterInfo").Split(",");
  425. if (!_sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == "MaterConfig").Any())
  426. {
  427. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  428. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  429. return res;
  430. }
  431. var materlist = _sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p=>p.Code == "MaterConfig").First().Memo.Split(",");
  432. if (!materlist.Contains(reqDto.MatCode))
  433. {
  434. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  435. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  436. return res;
  437. }
  438. //var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);
  439. //if (container == null)
  440. //{
  441. // var insertcon = new BaseContinfo()
  442. // {
  443. // ContBarCode = reqDto.SpoolCode,
  444. // Name = reqDto.SpoolCode,
  445. // TypeCode = ContainerType.ContainerType_Spool.ToString(),
  446. // PrintQty = 1,
  447. // IsStop = 0,
  448. // WarehouseId = 0,
  449. // WeightQty = 0,
  450. // AddWho = "wms",
  451. // AddTime = DateTime.Now
  452. // };
  453. // if (!_baseContinfo.Insert(insertcon))
  454. // {
  455. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  456. // res.ResMsg = "工字轮载具初始化失败";
  457. // return res;
  458. // }
  459. //}
  460. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  461. var mater = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == reqDto.MatCode).First();
  462. if (mater == null)
  463. {
  464. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  465. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + reqDto.MatCode;
  466. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + ",物料编码:" + reqDto.MatCode, Time = DateTime.Now });
  467. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  468. return res;
  469. }
  470. var Winding = "";
  471. if (reqDto.SpoolCode.EndsWith("R"))
  472. {
  473. Winding = "R";
  474. }
  475. else
  476. {
  477. Winding = "L";
  478. }
  479. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  480. if (barstock == null)
  481. {
  482. var barinfo = new BillInvinit()
  483. {
  484. InvBarCode = reqDto.MatBarCode,
  485. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  486. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  487. ExecDocsNo = reqDto.WorkOrder,
  488. ExecDocsRowNo = reqDto.MatBarCode,
  489. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  490. InvInOut = InvInOutType.In,
  491. ExecWho = "MES",
  492. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  493. InDocsNo = reqDto.WorkOrder,
  494. InDocsRowNo = reqDto.MatBarCode,
  495. SuppCode = "",
  496. BomDocsNo = "",
  497. BomSetId = 0,
  498. SetGrpCode = "",
  499. BomMatCode = "",
  500. BomMatId = 0,
  501. BomMatName = "",
  502. MatId = mater.Id,
  503. MatCode = mater.Code,
  504. MatName = mater.Name,
  505. LengthQty = reqDto.Length,
  506. TareWQty = reqDto.Weight,
  507. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  508. RFIDBarCode = "",
  509. ProductMachCode = reqDto.WbCode,
  510. Grade = reqDto.Grade,
  511. HWBarCode = reqDto.SpoolCode,
  512. HWTypeCode = mater.SpoolCode, //BS80 大轮子 货物类型1
  513. ContGrpBarCode = reqDto.SpoolCode,
  514. ContGrpId = IdFactory.NewId(),
  515. IsFast = false,
  516. IsRework = reqDto.IsRework,
  517. CLBarCode = reqDto.MatBarCode,
  518. Size = 1,
  519. BackReason = "",
  520. IsBack = reqDto.IsBlack,
  521. IsCore = reqDto.IsCore,
  522. SolderCount = (int)reqDto.SolderCount,
  523. IsTorsChk = reqDto.IsTorsChk,
  524. WbGroupCode = reqDto.WbGroupCode,
  525. IsControlpanel = reqDto.IsControl,
  526. HoldTime = reqDto.HoldDuration,
  527. Wind = Winding,
  528. BatchNo = reqDto.Batch
  529. //IsMulti = reqDto.IsMulti
  530. };
  531. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  532. {
  533. barinfo.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  534. }
  535. _billInvinitrepository.Insert(barinfo);
  536. }
  537. else
  538. {
  539. }
  540. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  541. if (stock == null)
  542. {
  543. var inv = new BillInvnow()
  544. {
  545. InvBarCode = reqDto.MatBarCode,
  546. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  547. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  548. ExecDocsNo = reqDto.WorkOrder,
  549. ExecDocsRowNo = reqDto.MatBarCode,
  550. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  551. InvInOut = InvInOutType.In,
  552. ExecWho = "MES",
  553. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  554. InDocsNo = reqDto.WorkOrder,
  555. SuppCode = "",
  556. BomDocsNo = "",
  557. BomSetId = 0,
  558. SetGrpCode = "",
  559. BomMatCode = "",
  560. BomMatId = 0,
  561. BomMatName = "",
  562. MatId = mater.Id,
  563. MatCode = mater.Code,
  564. MatName = mater.Name,
  565. LengthQty = reqDto.Length,
  566. TareWQty = reqDto.Weight,
  567. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  568. RFIDBarCode = "",
  569. ProductMachCode = reqDto.WbCode,
  570. Grade = reqDto.Grade,
  571. HWBarCode = reqDto.SpoolCode,
  572. HWTypeCode = mater.SpoolCode,
  573. ContGrpBarCode = reqDto.SpoolCode,
  574. ContGrpId = IdFactory.NewId(),
  575. IsFast = false,
  576. IsRework = reqDto.IsRework,
  577. CLBarCode = reqDto.MatBarCode,
  578. ContGrpType = ContGrpType.Material,
  579. Size = 1,
  580. BackReason = "",
  581. IsBlack = reqDto.IsBlack,
  582. IsCore = reqDto.IsCore,
  583. WbGroupCode = reqDto.WbGroupCode,
  584. IsTorsChk = reqDto.IsTorsChk,
  585. IsControlpanel = reqDto.IsControl,
  586. HoldTime = reqDto.HoldDuration,
  587. SolderCount = reqDto.SolderCount,
  588. Wind = Winding,
  589. BatchNo = reqDto.Batch
  590. //IsMulti = reqDto.IsMulti
  591. };
  592. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  593. {
  594. inv.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  595. }
  596. if (!string.IsNullOrEmpty(reqDto.OvcValue))//已经扭转过的
  597. {
  598. inv.TorsChkValue = decimal.Parse(reqDto.OvcValue);
  599. inv.Memo = "接收数据含有扭转值";
  600. inv.Ovced = 1;
  601. inv.TorsChkQty = 1;
  602. }
  603. _billInvnowrepository.Insert(inv);
  604. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  605. }
  606. else
  607. {
  608. if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  609. {
  610. //if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  611. //{
  612. // stoc.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  613. //}
  614. bool isMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  615. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  616. {
  617. IsBlack = reqDto.IsBlack,
  618. IsCore = reqDto.IsCore,
  619. WbGroupCode = reqDto.WbGroupCode,
  620. IsTorsChk = reqDto.IsTorsChk,
  621. IsControlpanel = reqDto.IsControl,
  622. HoldTime = reqDto.HoldDuration,
  623. SolderCount = reqDto.SolderCount,
  624. IsRework = reqDto.IsRework,
  625. CLBarCode = reqDto.MatBarCode,
  626. MatCode = mater.Code,
  627. MatName = mater.Name,
  628. LengthQty = reqDto.Length,
  629. TareWQty = reqDto.Weight,
  630. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  631. RFIDBarCode = "",
  632. ProductMachCode = reqDto.WbCode,
  633. Grade = reqDto.Grade,
  634. InDocsNo = reqDto.WorkOrder,
  635. Wind = Winding,
  636. EditTime = DateTime.Now,
  637. IsMulti = isMulti
  638. }, p => p.ContGrpBarCode == reqDto.SpoolCode && p.Id == stock.Id);
  639. }
  640. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  641. {
  642. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  643. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  644. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(), Time = DateTime.Now });
  645. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  646. return res;
  647. }
  648. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  649. {
  650. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  651. res.ResMsg = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  652. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成", Time = DateTime.Now });
  653. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  654. return res;
  655. }
  656. }
  657. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  658. if (task != null && task.Type == TaskType.OutDepot)
  659. {
  660. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  661. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  662. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务", Time = DateTime.Now });
  663. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  664. return res;
  665. }
  666. if (task != null)
  667. {
  668. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  669. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  670. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(), Time = DateTime.Now });
  671. return res;
  672. }
  673. var wcs = new WCS_TaskInfo()
  674. {
  675. Status = TaskStatus.NewBuild,
  676. Type = TaskType.EnterDepot,
  677. Priority = 0,
  678. Device = "",
  679. SrmStation = "",
  680. AddrFrom = "root",
  681. BarCode = reqDto.SpoolCode,
  682. AddWho = "wms",
  683. EditWho = "wms",
  684. WarehouseCode = wareHosue.Code,
  685. AddrTo = "",
  686. Tunnel = "",
  687. MaterialCode = mater.Code,
  688. MatCode = mater.Code,
  689. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  690. Floor = 0,
  691. Grade = reqDto.Grade,
  692. Length = reqDto.Length,
  693. WorkBench = reqDto.WbCode,
  694. WorkOrder = reqDto.WorkOrder
  695. };
  696. _db.BeginTran();
  697. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  698. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  699. var wcsdtl = new WCS_TaskDtl()
  700. {
  701. ID = Guid.NewGuid(),
  702. CurPoint = reqDto.SpoolCode,
  703. AddTime = DateTime.Now,
  704. AddWho = "wms",
  705. Enabled = true,
  706. ParentTaskCode = wcstask.ID,
  707. Desc = wcstask.BusType
  708. };
  709. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  710. _db.CommitTran();
  711. }
  712. catch (Exception ex)
  713. {
  714. _db.RollbackTran();
  715. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  716. res.ResMsg = ex.Message;
  717. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  718. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ex.Message, Time = DateTime.Now });
  719. }
  720. return res;
  721. }
  722. /// <summary>
  723. /// 扭转出库申请
  724. /// </summary>
  725. /// <param name="request"></param>
  726. /// <returns></returns>
  727. public SRes TorsChkStockOut(TorsChkStockOutRequest request)
  728. {
  729. var res = new SRes();
  730. try
  731. {
  732. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  733. 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
  734. && !p.InDocsNo.StartsWith("CHA") && p.Grade == "A")
  735. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  736. select new
  737. {
  738. stock.MatCode,
  739. stock.InvBarCode,
  740. stock.Grade,
  741. stock.InvStateCode,
  742. stock.ProductTime,
  743. stock.SkuCode,
  744. stock.WbGroupCode,
  745. stock.IsTorsChk,
  746. stock.TorsChkQty,
  747. stock.TorsChkValue,
  748. stock.HoldTime,
  749. stock.ProductMachCode,
  750. stock.HWTypeCode,
  751. loc.Col,
  752. loc.Layer,
  753. loc.Shelf,
  754. loc.Depth,
  755. loc.Code,
  756. loc.Tunnel,
  757. loc.SCRel,
  758. loc.Floor,
  759. loc.WarehouseCode,
  760. loc.ContGrpBarCode,
  761. loc.Id,
  762. loc.StateNum,
  763. };
  764. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  765. if (tunlist.Any())
  766. {
  767. if (tunlist.Where(p => p.Default2 == "1").Any())
  768. {
  769. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  770. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  771. }
  772. if (tunlist.Where(p => p.Default2 == "2").Any())
  773. {
  774. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  775. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  776. }
  777. if (tunlist.Where(p => p.Default2 == "3").Any())
  778. {
  779. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  780. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  781. }
  782. }
  783. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  784. int srarthour = int.Parse(TorschkDate.Default2);
  785. int endhour = int.Parse(TorschkDate.Default3);
  786. 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);
  787. if (!invlist.Any())
  788. {
  789. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip1", new RedisErrorInfo() { Equip = "TorsChkEquip1", Con = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮", Time = DateTime.Now });
  790. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  791. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮";
  792. return res;
  793. }
  794. invlist = invlist.OrderBy(p => p.Depth).ThenBy(p => p.ProductTime);
  795. var tasklist = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription() && p.Type == TaskType.OutDepot).ToList();
  796. var torTaskCount = _sysconfigrepository.GetFirst(p => p.Code == "TorTaskCount").SContent;
  797. if (tasklist.Any() && tasklist.Count > int.Parse(torTaskCount))
  798. {
  799. res.ResMsg = "任务已经超最大数量";
  800. return res;
  801. }
  802. //var taskcount = (from task in tasklist.GroupBy(p => p.Floor)
  803. // select new FloorCountTemp
  804. // {
  805. // Floor = task.Key,//楼层的任务数量
  806. // Count = task.Count()
  807. // }).ToList();
  808. #region 按照堆垛机平均分配任务
  809. var tempcount = 12;//还可以创建的任务数量
  810. var mastinvlist = tasklist.Where(p => p.Status < TaskStatus.StackerCompleted);
  811. var tempinvlist = invlist;
  812. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  813. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.Device)
  814. select new SrmTaskTmep
  815. {
  816. Srm = x.Key,
  817. TaskCount = x.Count(),
  818. LocList = x.Select(q => q.AddrFrom).ToList()
  819. };
  820. var srmtasktobe = new List<SrmTaskTmep>();
  821. foreach (var srmlistitem in srmlist)
  822. {
  823. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  824. {
  825. srmtasktobe.Add(new SrmTaskTmep()
  826. {
  827. Srm = srmlistitem,
  828. TaskCount = 0,
  829. LocList = new List<string>()
  830. });
  831. }
  832. }
  833. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量
  834. var srmtasktobetemplocs = new List<string>();
  835. for (int i = 0; i < tempcount; i++)
  836. {
  837. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  838. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  839. foreach (var srmtasktobeitem in srmtasktobe)
  840. {
  841. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  842. {
  843. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  844. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  845. srmtasktobetemplocs.Add(first.Code);
  846. break;
  847. }
  848. }
  849. }
  850. #endregion
  851. invlist = invlist.Where(p => srmtasktobetemplocs.Contains(p.Code));
  852. //for (int floor = 1; floor <= 3; floor++)
  853. //{
  854. int pp = 0;
  855. //invlist = invlist.Where(p => p.Floor == floor);
  856. foreach (var item in invlist)
  857. {
  858. if (item.TorsChkValue != null)
  859. {
  860. continue;
  861. }
  862. //if (pp == 4)
  863. //{
  864. // break;
  865. //}
  866. var time1 = item.HoldTime + decimal.Parse(TorschkDate.SContent);
  867. var time2 = item.HoldTime - decimal.Parse(TorschkDate.Default1);
  868. //|| (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > 72 && decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > item.HoldTime)
  869. if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) >= time2)
  870. {
  871. var inv = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  872. if (inv == null)
  873. {
  874. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = item.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(), Time = DateTime.Now });
  875. continue;
  876. }
  877. if (item.Depth == 2)
  878. {
  879. var taskold = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  880. if (taskold != null)
  881. {
  882. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = item.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription(), Time = DateTime.Now });
  883. continue;
  884. }
  885. var respon = MoveTask(item.Code);
  886. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  887. {
  888. continue;
  889. }
  890. }
  891. else
  892. {
  893. //判断存不存在任务
  894. var taskoldexist = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  895. if (taskoldexist != null)
  896. {
  897. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务", Time = DateTime.Now });
  898. _logger.LogInformation(item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务");
  899. continue;
  900. }
  901. }
  902. var wcs = new WCS_TaskInfo()
  903. {
  904. Status = TaskStatus.NewBuild,
  905. Type = TaskType.OutDepot,
  906. Priority = 0,
  907. Device = item.SCRel,
  908. SrmStation = item.SCRel,
  909. AddrFrom = item.Code,
  910. BarCode = inv.ContGrpBarCode,
  911. AddWho = "wms",
  912. EditWho = "wms",
  913. WarehouseCode = item.WarehouseCode,
  914. AddrTo = "",
  915. Tunnel = item.Tunnel.ToString(),
  916. MaterialCode = item.MatCode,
  917. MatCode = item.MatCode,
  918. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription(),
  919. Floor = item.Floor,
  920. Grade = item.Grade,
  921. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2
  922. };
  923. _db.BeginTran();
  924. if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > time1)
  925. {
  926. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  927. {
  928. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  929. //ContUsageQty = 2, //扭转超时异常盘,2024-11-29客户要求不再更新异常
  930. EditTime = DateTime.Now
  931. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  932. }
  933. else
  934. {
  935. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  936. {
  937. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  938. EditTime = DateTime.Now
  939. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  940. }
  941. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  942. {
  943. StateNum = LocationState.LocationState_StockOut,
  944. EditTime = DateTime.Now
  945. }, p => p.Code == item.Code);
  946. var flow = _mapper.Map<BillInvflow>(inv);
  947. flow.Id = GetId();
  948. flow.AddTime = DateTime.Now;
  949. flow.EditTime = DateTime.Now;
  950. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  951. flow.Memo = "扭转出库";
  952. _billInvflow.Insert(flow);
  953. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  954. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  955. var wcsdtl = new WCS_TaskDtl()
  956. {
  957. ID = Guid.NewGuid(),
  958. CurPoint = wcstask.AddrFrom,
  959. AddTime = DateTime.Now,
  960. AddWho = "wms",
  961. Enabled = true,
  962. ParentTaskCode = wcstask.ID,
  963. Desc = wcstask.BusType
  964. };
  965. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  966. _db.CommitTran();
  967. //return res;
  968. pp++;
  969. }
  970. }
  971. //}
  972. }
  973. catch (Exception ex)
  974. {
  975. _db.RollbackTran();
  976. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  977. res.ResMsg = ResponseStatusCodeEnum.InnerServerErr.GetDescription() + ex.Message;
  978. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = ex.Message, Time = DateTime.Now });
  979. return res;
  980. }
  981. return res;
  982. }
  983. public SRes<int> TorsChkComplete(TorsChkCompleteRequest request)
  984. {
  985. var res = new SRes<int>();
  986. try
  987. {
  988. if (string.IsNullOrEmpty(request.TaskNo))
  989. {
  990. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  991. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  992. return res;
  993. }
  994. var ware = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  995. if (ware == null)
  996. {
  997. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  998. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  999. return res;
  1000. }
  1001. 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();
  1002. if (task == null)
  1003. {
  1004. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1005. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  1006. return res;
  1007. }
  1008. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.IsTorsChk == true && p.TorsChkQty > 0);
  1009. if (stock == null)
  1010. {
  1011. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1012. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  1013. return res;
  1014. }
  1015. _db.BeginTran();
  1016. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  1017. var flow = _mapper.Map<BillInvflow>(stock);
  1018. flow.Id = GetId();
  1019. flow.AddTime = DateTime.Now;
  1020. flow.EditTime = DateTime.Now;
  1021. flow.Memo = "扭转出库任务完成";
  1022. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1023. _billInvflow.Insert(flow);
  1024. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  1025. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  1026. {
  1027. Status = TaskStatus.Finish,
  1028. EditTime = DateTime.Now,
  1029. ManualRemarks = "扭转完成"
  1030. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  1031. var wcsdtl = new WCS_TaskDtl()
  1032. {
  1033. ID = Guid.NewGuid(),
  1034. CurPoint = stock.TorsChkMachCode,
  1035. AddTime = DateTime.Now,
  1036. AddWho = "wms",
  1037. Enabled = true,
  1038. ParentTaskCode = task.Id,
  1039. Desc = "扭转完成"
  1040. };
  1041. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  1042. var inv = stock;
  1043. inv.Id = GetId();
  1044. inv.ContGrpId = GetId();
  1045. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  1046. inv.Memo = "扭转回库";
  1047. _billInvnowrepository.Insert(inv);
  1048. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  1049. var wcs = new WCS_TaskInfo()
  1050. {
  1051. Status = TaskStatus.NewBuild,
  1052. Type = TaskType.EnterDepot,
  1053. Priority = 0,
  1054. Device = "",
  1055. SrmStation = "",
  1056. AddrFrom = inv.TorsChkMachCode,
  1057. BarCode = stock.ContGrpBarCode,
  1058. AddWho = "wms",
  1059. EditWho = "wms",
  1060. WarehouseCode = ware.Code,
  1061. AddrTo = "",
  1062. Tunnel = "",
  1063. MaterialCode = inv.MatCode,
  1064. MatCode = inv.MatCode,
  1065. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  1066. Grade = inv.Grade
  1067. };
  1068. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  1069. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  1070. var wcsdtls = new WCS_TaskDtl()
  1071. {
  1072. ID = Guid.NewGuid(),
  1073. CurPoint = wcstask.AddrFrom,
  1074. AddTime = DateTime.Now,
  1075. AddWho = "wms",
  1076. Enabled = true,
  1077. ParentTaskCode = wcstask.ID,
  1078. Desc = wcstask.BusType
  1079. };
  1080. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  1081. res.ResData = wcstask.ID;
  1082. _db.CommitTran();
  1083. }
  1084. catch (Exception ex)
  1085. {
  1086. _db.RollbackTran();
  1087. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1088. res.ResMsg = ex.Message;
  1089. return res;
  1090. }
  1091. return res;
  1092. }
  1093. private long GetId()
  1094. {
  1095. return IdFactory.NewId();
  1096. }
  1097. /// <summary>
  1098. /// sku信息传输
  1099. /// </summary>
  1100. /// <param name="reqDto"></param>
  1101. /// <returns></returns>
  1102. public SRes SKUInfoTrans(SKUInfoTransRequest reqDto)
  1103. {
  1104. var res = new SRes();
  1105. foreach (var item in reqDto.ListInfo)
  1106. {
  1107. var model = _skuInforepository.GetSingle(p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1108. if (model == null)
  1109. {
  1110. _skuInforepository.Insert(new BillSkuInfo()
  1111. {
  1112. SkuCode = reqDto.SkuCode,
  1113. TypeCode = item.TypeCode,
  1114. TypeName = item.TypeName,
  1115. FieldCode = item.FieldCode,
  1116. FieldName = item.FieldName,
  1117. FieldUnit = item.FieldUnit,
  1118. FieldValue = item.FieldValue
  1119. });
  1120. }
  1121. else
  1122. {
  1123. //if (model.FieldCode == "QC_B02" || model.FieldCode == "QC_B03")
  1124. //{
  1125. _skuInforepository.UpdateSetColumnsTrue(p => new BillSkuInfo()
  1126. {
  1127. //TypeCode = item.TypeCode,
  1128. //TypeName = item.TypeName,
  1129. //FieldCode = item.FieldCode,
  1130. //FieldName = item.FieldName,
  1131. FieldUnit = item.FieldUnit,
  1132. FieldValue = item.FieldValue,
  1133. EditTime = DateTime.Now
  1134. }, p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1135. //}
  1136. }
  1137. }
  1138. return res;
  1139. }
  1140. /// <summary>
  1141. /// 包装信息传输
  1142. /// </summary>
  1143. /// <param name="reqDto"></param>
  1144. /// <returns></returns>
  1145. public SRes PackInfoTrans(PackInfoTrans reqDto)
  1146. {
  1147. var res = new SRes();
  1148. foreach (var item in reqDto.ListInfo)
  1149. {
  1150. var model = _packInforepository.GetSingle(p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1151. if (model == null)
  1152. {
  1153. _packInforepository.Insert(new BillPackInfo()
  1154. {
  1155. PackCode = reqDto.PackCode,
  1156. MatCode = item.MatCode,
  1157. MatName = item.MatName,
  1158. Count = item.Count,
  1159. UnitName = item.UnitName,
  1160. Weight = item.Weight,
  1161. PackDesc = reqDto.PackDesc,
  1162. PackMethodCode = reqDto.PackMethodCode,
  1163. PackMethod = reqDto.PackMethod,
  1164. EmptySpoolNum = reqDto.EmptySpoolNum,
  1165. Spool = reqDto.Spool,
  1166. SpoolNum = reqDto.SpoolNum,
  1167. LayersSpoolNum = reqDto.LayersSpoolNum,
  1168. LayersNum = reqDto.LayersNum,
  1169. AddWho = "MES",
  1170. EditWho = ""
  1171. });
  1172. }
  1173. else
  1174. {
  1175. _packInforepository.UpdateSetColumnsTrue(p => new BillPackInfo()
  1176. {
  1177. Count = item.Count,
  1178. UnitName = item.UnitName,
  1179. Weight = item.Weight,
  1180. PackDesc = reqDto.PackDesc,
  1181. PackMethodCode = reqDto.PackMethodCode,
  1182. PackMethod = reqDto.PackMethod,
  1183. EmptySpoolNum = reqDto.EmptySpoolNum,
  1184. Spool = reqDto.Spool,
  1185. SpoolNum = reqDto.SpoolNum,
  1186. LayersSpoolNum = reqDto.LayersSpoolNum,
  1187. LayersNum = reqDto.LayersNum,
  1188. EditWho = "MES"
  1189. }, p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1190. }
  1191. }
  1192. return res;
  1193. }
  1194. /// <summary>
  1195. /// 异常信息通用方法
  1196. /// </summary>
  1197. /// <param name="Code"></param>
  1198. /// <param name="Message"></param>
  1199. /// <returns></returns>
  1200. private SRes InsertErrorinfo(string Code, string Message)
  1201. {
  1202. var res = new SRes();
  1203. var error = new BaseErrorinfo()
  1204. {
  1205. ContBarCode = Code,
  1206. Message = Message,
  1207. AddWho = "",
  1208. EditWho = "",
  1209. Count = 1
  1210. };
  1211. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == Code && p.Message == Message);
  1212. if (errorinfo != null)
  1213. {
  1214. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  1215. {
  1216. Count = errorinfo.Count + 1
  1217. }, p => p.ContBarCode == errorinfo.ContBarCode);
  1218. }
  1219. else
  1220. {
  1221. _errorinforepository.Insert(error);
  1222. }
  1223. return res;
  1224. }
  1225. /// <summary>
  1226. /// 分配楼层
  1227. /// </summary>
  1228. /// <param name="reqDto"></param>
  1229. /// <returns></returns>
  1230. public SRes<ApplyFloorResponse> ApplyFloor(ApplyFloorRequest reqDto)
  1231. {
  1232. var result = new SRes<ApplyFloorResponse>()
  1233. {
  1234. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1235. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1236. ResData = new ApplyFloorResponse(),
  1237. };
  1238. if (!Const.SxFloorEquip.Contains(reqDto.EquNo))
  1239. {
  1240. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1241. result.ResMsg = reqDto.EquNo + "没有当前扫码设备";
  1242. InsertErrorinfo(reqDto.Code, "异常口:" + result.ResMsg + "自动排出" + DateTime.Now);
  1243. return result;
  1244. }
  1245. //C质量异常排出处理
  1246. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1247. if (stock == null)
  1248. {
  1249. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1250. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1251. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1252. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1253. return result;
  1254. }
  1255. else
  1256. {
  1257. if (stock.Grade == "C" || stock.Grade == "D" || stock.Grade == "B")
  1258. {
  1259. try
  1260. {
  1261. _db.BeginTran();
  1262. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1263. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1264. var flow = _mapper.Map<BillInvflow>(stock);
  1265. flow.Id = GetId();
  1266. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1267. flow.AddTime = DateTime.Now;
  1268. flow.EditTime = DateTime.Now;
  1269. flow.Memo = "BCD质量异常排出";
  1270. _billInvflow.Insert(flow);
  1271. _db.CommitTran();
  1272. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1273. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1274. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1275. return result;
  1276. }
  1277. catch (Exception ex)
  1278. {
  1279. _db.RollbackTran();
  1280. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1281. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1282. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1283. return result;
  1284. }
  1285. }
  1286. }
  1287. //由于重绕盘间隔时间太长,所以查当前任务表
  1288. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(3)).First();
  1289. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).First();
  1290. if (wcstask == null)
  1291. {
  1292. try
  1293. {
  1294. _db.BeginTran();
  1295. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1296. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1297. if (stocks != null)
  1298. {
  1299. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1300. var flow = _mapper.Map<BillInvflow>(stocks);
  1301. flow.Id = GetId();
  1302. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1303. flow.AddTime = DateTime.Now;
  1304. flow.EditTime = DateTime.Now;
  1305. flow.Memo = "任务异常排出";
  1306. _billInvflow.Insert(flow);
  1307. }
  1308. _db.CommitTran();
  1309. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1310. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1311. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1312. return result;
  1313. }
  1314. catch (Exception ex)
  1315. {
  1316. _db.RollbackTran();
  1317. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1318. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1319. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1320. return result;
  1321. }
  1322. }
  1323. if (wcstask.Type != TaskType.EnterDepot)
  1324. {
  1325. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1326. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1327. if (stocks != null)
  1328. {
  1329. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1330. var flow = _mapper.Map<BillInvflow>(stocks);
  1331. flow.Id = GetId();
  1332. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1333. flow.AddTime = DateTime.Now;
  1334. flow.EditTime = DateTime.Now;
  1335. flow.Memo = "任务异常排出";
  1336. _billInvflow.Insert(flow);
  1337. }
  1338. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1339. result.ResMsg = reqDto.Code + "不是入库任务,不允许分配楼层";
  1340. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1341. return result;
  1342. }
  1343. result.ResData.TaskNo = wcstask.ID;
  1344. if (stock.HWTypeCode == "BS60" || stock.HWTypeCode == "BS40")
  1345. {
  1346. result.Memo1 = "1";
  1347. }
  1348. else
  1349. {
  1350. result.Memo1 = "2";
  1351. }
  1352. 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();
  1353. //去掉禁用巷道
  1354. List<int> distuns = new List<int>();
  1355. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty).ToList();
  1356. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  1357. if (disabletunnels != null && disabletunnels.Any())
  1358. {
  1359. foreach (var item in disabletunnels)
  1360. {
  1361. var distun = int.Parse(item.Default1);
  1362. var disfloor = int.Parse(item.Default2);
  1363. var disids = cell.Where(p => p.Floor == disfloor && p.Tunnel == distun).Select(p => p.Id);
  1364. cell = cell.Where(p => !disids.Contains(p.Id)).ToList();
  1365. }
  1366. }
  1367. bool isTobeTors = false;
  1368. int tun = 2;
  1369. int row = 8;
  1370. if (stock.IsTorsChk == true && stock.IsControlpanel == true && stock.TorsChkQty <= 0 && stock.Ovced == 0)
  1371. {
  1372. isTobeTors = true;
  1373. }
  1374. 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楼层可用的货位数
  1375. 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楼层可用的货位数
  1376. 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楼层可用的货位数
  1377. 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楼层同规格数量
  1378. 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楼层同规格数量
  1379. 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楼层同规格数量
  1380. var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent);
  1381. var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  1382. if (!string.IsNullOrEmpty(forbidlayer))
  1383. {
  1384. if (forbidlayer.Contains("1")) cellfloor1count = 0;
  1385. if (forbidlayer.Contains("2")) cellfloor2count = 0;
  1386. if (forbidlayer.Contains("3")) cellfloor3count = 0;
  1387. }
  1388. //cellfloor2count = 0;//临时修改,限制楼层分配
  1389. var tempcells = new List<Tuple<int, int,double>>() {
  1390. new Tuple<int, int,double>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count*1.0)),
  1391. new Tuple<int, int,double>(2,cellfloor2count,cellfloor2stockcount / (cellfloor2count*1.0)),
  1392. new Tuple<int, int,double>(3,cellfloor3count,cellfloor3stockcount / (cellfloor3count*1.0)),
  1393. };
  1394. //tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();//按照空位数排序
  1395. tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  1396. //每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  1397. var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  1398. if (tempcells[0].Item2 > 30)
  1399. {
  1400. if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > floorTaskCount || tempcells[0].Item2 == 0)
  1401. {
  1402. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  1403. {
  1404. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  1405. {
  1406. result.ResData.TaskNo = 0;
  1407. result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1408. result.ResData.Floor = 0;
  1409. return result;
  1410. }
  1411. else
  1412. {
  1413. result.ResData.Floor = tempcells[2].Item1;
  1414. }
  1415. }
  1416. else
  1417. {
  1418. result.ResData.Floor = tempcells[1].Item1;
  1419. }
  1420. }
  1421. else
  1422. {
  1423. result.ResData.Floor = tempcells[0].Item1;
  1424. }
  1425. }
  1426. else
  1427. {
  1428. if (tempcells[1].Item2 > 30)
  1429. {
  1430. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  1431. {
  1432. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  1433. {
  1434. result.ResData.TaskNo = 0;
  1435. result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1436. result.ResData.Floor = 0;
  1437. return result;
  1438. }
  1439. else
  1440. {
  1441. result.ResData.Floor = tempcells[2].Item1;
  1442. }
  1443. }
  1444. else
  1445. {
  1446. result.ResData.Floor = tempcells[1].Item1;
  1447. }
  1448. }
  1449. else
  1450. {
  1451. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  1452. {
  1453. result.ResData.Floor = tempcells[2].Item1;
  1454. }
  1455. else
  1456. {
  1457. result.ResData.TaskNo = 0;
  1458. result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1459. result.ResData.Floor = 0;
  1460. return result;
  1461. }
  1462. }
  1463. }
  1464. #region 逻辑暂时不用(不换楼层优先)
  1465. //switch (reqDto.EquNo)
  1466. //{
  1467. // case "2134": //一号分层扫码器
  1468. // if (cellfloor1count > 30)
  1469. // {
  1470. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1471. // {
  1472. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1473. // {
  1474. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1475. // {
  1476. // result.ResData.TaskNo = 0;
  1477. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1478. // result.ResData.Floor = 0;
  1479. // return result;
  1480. // }
  1481. // else
  1482. // {
  1483. // result.ResData.Floor = 3;
  1484. // }
  1485. // }
  1486. // else
  1487. // {
  1488. // result.ResData.Floor = 2;
  1489. // }
  1490. // }
  1491. // else
  1492. // {
  1493. // result.ResData.Floor = 1;
  1494. // }
  1495. // }
  1496. // else
  1497. // {
  1498. // if (cellfloor2count > 30)
  1499. // {
  1500. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1501. // {
  1502. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1503. // {
  1504. // result.ResData.TaskNo = 0;
  1505. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1506. // result.ResData.Floor = 0;
  1507. // return result;
  1508. // }
  1509. // else
  1510. // {
  1511. // result.ResData.Floor = 3;
  1512. // }
  1513. // }
  1514. // else
  1515. // {
  1516. // result.ResData.Floor = 2;
  1517. // }
  1518. // }
  1519. // else
  1520. // {
  1521. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1522. // {
  1523. // result.ResData.Floor = 3;
  1524. // }
  1525. // else
  1526. // {
  1527. // result.ResData.TaskNo = 0;
  1528. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1529. // result.ResData.Floor = 0;
  1530. // return result;
  1531. // }
  1532. // }
  1533. // }
  1534. // break;
  1535. // case "2258": //二号分层扫码器
  1536. // if (cellfloor2count > 30)
  1537. // {
  1538. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1539. // {
  1540. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1541. // {
  1542. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1543. // {
  1544. // result.ResData.TaskNo = 0;
  1545. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1546. // result.ResData.Floor = 0;
  1547. // return result;
  1548. // }
  1549. // else
  1550. // {
  1551. // result.ResData.Floor = 3;
  1552. // }
  1553. // }
  1554. // else
  1555. // {
  1556. // result.ResData.Floor = 1;
  1557. // }
  1558. // }
  1559. // else
  1560. // {
  1561. // result.ResData.Floor = 2;
  1562. // }
  1563. // }
  1564. // else
  1565. // {
  1566. // if (cellfloor1count > 30)
  1567. // {
  1568. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1569. // {
  1570. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1571. // {
  1572. // result.ResData.TaskNo = 0;
  1573. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1574. // result.ResData.Floor = 0;
  1575. // return result;
  1576. // }
  1577. // else
  1578. // {
  1579. // result.ResData.Floor = 3;
  1580. // }
  1581. // }
  1582. // else
  1583. // {
  1584. // result.ResData.Floor = 1;
  1585. // }
  1586. // }
  1587. // else
  1588. // {
  1589. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1590. // {
  1591. // result.ResData.Floor = 3;
  1592. // }
  1593. // else
  1594. // {
  1595. // result.ResData.TaskNo = 0;
  1596. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1597. // result.ResData.Floor = 0;
  1598. // return result;
  1599. // }
  1600. // }
  1601. // }
  1602. // break;
  1603. // case "2419": //三号分层扫码器
  1604. // if (cellfloor3count > 30)
  1605. // {
  1606. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1607. // {
  1608. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1609. // {
  1610. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1611. // {
  1612. // result.ResData.TaskNo = 0;
  1613. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1614. // result.ResData.Floor = 0;
  1615. // return result;
  1616. // }
  1617. // else
  1618. // {
  1619. // result.ResData.Floor = 1;
  1620. // }
  1621. // }
  1622. // else
  1623. // {
  1624. // result.ResData.Floor = 2;
  1625. // }
  1626. // }
  1627. // else
  1628. // {
  1629. // result.ResData.Floor = 3;
  1630. // }
  1631. // }
  1632. // else
  1633. // {
  1634. // if (cellfloor1count > 30)
  1635. // {
  1636. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1637. // {
  1638. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1639. // {
  1640. // result.ResData.TaskNo = 0;
  1641. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1642. // result.ResData.Floor = 0;
  1643. // return result;
  1644. // }
  1645. // else
  1646. // {
  1647. // result.ResData.Floor = 2;
  1648. // }
  1649. // }
  1650. // else
  1651. // {
  1652. // result.ResData.Floor = 1;
  1653. // }
  1654. // }
  1655. // else
  1656. // {
  1657. // if (taskcount.Where(p => p.Floor == 2).Count() < 32 && cellfloor2count > 30)
  1658. // {
  1659. // result.ResData.Floor = 2;
  1660. // }
  1661. // else
  1662. // {
  1663. // result.ResData.TaskNo = 0;
  1664. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1665. // result.ResData.Floor = 0;
  1666. // return result;
  1667. // }
  1668. // }
  1669. // }
  1670. // break;
  1671. // default:
  1672. // break;
  1673. //}
  1674. #endregion
  1675. //var maxcount = cellfloor1count > cellfloor2count ? (cellfloor1count > cellfloor3count ? cellfloor1count : cellfloor3count) : (cellfloor2count > cellfloor3count ? cellfloor2count : cellfloor3count);
  1676. //if (maxcount == cellfloor1count)
  1677. //{
  1678. // result.ResData.Floor = 1;
  1679. //}
  1680. //else if (maxcount == cellfloor2count)
  1681. //{
  1682. // result.ResData.Floor = 2;
  1683. //}
  1684. //else if (maxcount == cellfloor3count)
  1685. //{
  1686. // result.ResData.Floor = 3;
  1687. //}
  1688. //楼层禁用
  1689. //var floorlist = _sysconfigrepository.GetList(p => p.SType == "FloorType" && !string.IsNullOrEmpty(p.SContent));
  1690. //if (floorlist.Any())
  1691. //{
  1692. // if (floorlist.Select(p => p.Code).ToList().Contains(result.ResData.Floor.ToString()))
  1693. // {
  1694. // result.ResData.Floor = 0;
  1695. // }
  1696. //}
  1697. result.Memo2 = stock.Grade;
  1698. return result;
  1699. }
  1700. /// <summary>
  1701. /// 获取巷道
  1702. /// </summary>
  1703. /// <param name="reqEntity"></param>
  1704. /// <returns></returns>
  1705. public SRes<string> GetTunnelPriorityList(GetSxTunnelPriorityListRequest reqEntity)
  1706. {
  1707. var result = new SRes<string>();
  1708. if (reqEntity.Floor <= 0 || reqEntity.Floor > 3)
  1709. {
  1710. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1711. result.ResMsg = reqEntity.Code + "楼层参数不能为0或大于3";
  1712. result.ResData = "";
  1713. return result;
  1714. }
  1715. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqEntity.Code && p.Status < TaskStatus.Finish).First();
  1716. if (wcstask == null)
  1717. {
  1718. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1719. result.ResMsg = reqEntity.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1720. return result;
  1721. }
  1722. if (wcstask.Type != TaskType.EnterDepot)
  1723. {
  1724. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1725. result.ResMsg = reqEntity.Code + "不是入库任务,不允许分配巷道";
  1726. return result;
  1727. }
  1728. //获取任务数占用最少的
  1729. 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);
  1730. var tunnelcountlist = new List<TunnelCountTemp>();
  1731. var runningtasks = wcstasks.ToList();
  1732. if (runningtasks.Any())
  1733. {
  1734. tunnelcountlist = (from task in runningtasks.GroupBy(p => p.Tunnel)
  1735. select new TunnelCountTemp
  1736. {
  1737. Tunnel = task.Key,
  1738. Count = task.Count()
  1739. }).ToList();
  1740. }
  1741. //获取库位所有巷道列表
  1742. var alltunnels = _basewarecellrepository.GetList(p => p.Floor == reqEntity.Floor).Select(p => p.Tunnel).Distinct();
  1743. foreach (var item in alltunnels)
  1744. {
  1745. if (!tunnelcountlist.Where(p => p.Tunnel == item.ToString()).Any())
  1746. {
  1747. tunnelcountlist.Add(new TunnelCountTemp()
  1748. {
  1749. Tunnel = item.ToString(),
  1750. Count = 0
  1751. });
  1752. }
  1753. }
  1754. var tasktunnelcountlist = tunnelcountlist.OrderBy(p => p.Count).ToList();
  1755. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  1756. //获取已占用库位最少的货架
  1757. var threshold = 5; //int.Parse(ConfigUtil.GetConfiguration["Threshold"]);//阈值
  1758. 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);
  1759. 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() });
  1760. List<TunnelCountTemp> tempProportion = new List<TunnelCountTemp>();
  1761. if (locationsreturn == null || !locationsreturn.Any())
  1762. {
  1763. result.ResData = string.Join(",", tasktunnelcountlist.OrderBy(p => p.Count).Select(p => p.Tunnel));
  1764. }
  1765. else
  1766. {
  1767. var grouplocationtunnels = (from location in locationsreturn.GroupBy(p => p.Tunnel)
  1768. select new TunnelCountTemp
  1769. {
  1770. Tunnel = location.Key.ToString(),
  1771. Count = location.Count(),
  1772. 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)
  1773. }).ToList().OrderBy(p => p.Count).ToList();
  1774. foreach (var item in alltunnels)
  1775. {
  1776. if (!grouplocationtunnels.Where(p => p.Tunnel == item.ToString()).Any())
  1777. {
  1778. grouplocationtunnels.Add(new TunnelCountTemp()
  1779. {
  1780. Tunnel = item.ToString(),
  1781. Count = 0,
  1782. Proportion = 0
  1783. });
  1784. }
  1785. }
  1786. tempProportion = grouplocationtunnels;
  1787. grouplocationtunnels = grouplocationtunnels.OrderBy(p => p.Proportion).ToList();
  1788. var sorttunnels = grouplocationtunnels.OrderBy(p => p.Proportion).Select(p => p.Tunnel).ToList();
  1789. for (var i = 0; i < grouplocationtunnels.Count - 1; i++)
  1790. {
  1791. if (tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i].Tunnel).First().Count - threshold > tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i + 1].Tunnel).First().Count)
  1792. {
  1793. sorttunnels[i] = grouplocationtunnels[i + 1].Tunnel;
  1794. sorttunnels[i + 1] = grouplocationtunnels[i].Tunnel;
  1795. i++;
  1796. }
  1797. else
  1798. {
  1799. sorttunnels[i] = grouplocationtunnels[i].Tunnel;
  1800. }
  1801. }
  1802. result.ResData = string.Join(",", sorttunnels);
  1803. }
  1804. //删除没有空闲货位的货架
  1805. var arrresultTunnels = result.ResData.Split(',');
  1806. 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);
  1807. var resultTunenls = new List<string>();
  1808. foreach (var sorttunnel in arrresultTunnels)
  1809. {
  1810. //获取巷道的入库任务数
  1811. 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();
  1812. int left = 0;
  1813. if (emptylocationsreturn.Where(p => p.Tunnel == int.Parse(sorttunnel)).Count() - tunneltaskcount > left)
  1814. {
  1815. resultTunenls.Add(sorttunnel);
  1816. }
  1817. result.ResData = string.Join(",", resultTunenls);
  1818. }
  1819. //已分巷道的按巷道、物料编码分组,凑齐两个物料
  1820. var materTunenls = new List<string>();
  1821. var evenlist = new List<string>();
  1822. foreach (var item in result.ResData.Split(','))
  1823. {
  1824. var ss = runningtasks.Where(p => p.Tunnel == item);
  1825. var code = (from mat in ss.GroupBy(p => p.MatCode)
  1826. select new MaterCodeItems
  1827. {
  1828. MaterCode = mat.Key,
  1829. Count = mat.Count()
  1830. }).ToList();
  1831. if (code.Where(p => p.MaterCode == wcstask.MatCode).Any())
  1832. {
  1833. if (code.Where(p => p.MaterCode == wcstask.MatCode).First().Count % 2 == 1)
  1834. {
  1835. materTunenls.Add(item);
  1836. }
  1837. else
  1838. {
  1839. evenlist.Add(item);
  1840. }
  1841. }
  1842. else
  1843. {
  1844. evenlist.Add(item);
  1845. }
  1846. }
  1847. if (materTunenls.Any())
  1848. {
  1849. var tunlist = materTunenls.Union(evenlist).ToList();
  1850. result.ResData = string.Join(",", tunlist);
  1851. }
  1852. else
  1853. {
  1854. result.ResData = string.Join(",", evenlist);
  1855. }
  1856. //每条巷道最多允许存在2组任务
  1857. var MaxtaskcountTunnels = result.ResData.Split(',');
  1858. var tunnellist = new List<string>();
  1859. foreach (var item in MaxtaskcountTunnels)
  1860. {
  1861. if (runningtasks.Where(p => p.Tunnel == item).Count() > 5)
  1862. {
  1863. continue;
  1864. }
  1865. else
  1866. {
  1867. tunnellist.Add(item);
  1868. }
  1869. result.ResData = string.Join(",", tunnellist);
  1870. }
  1871. //根据配置过滤禁用的巷道
  1872. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent) && p.Default2 == reqEntity.Floor.ToString());
  1873. if (disabletunnels != null && disabletunnels.Any())
  1874. {
  1875. var resultTunenlsNew = new List<string>();
  1876. var resultTunenlsTemp = result.ResData.Split(',');
  1877. foreach (var tun in resultTunenlsTemp)
  1878. {
  1879. if (!disabletunnels.Select(p => p.Default1).Contains(tun))
  1880. {
  1881. resultTunenlsNew.Add(tun);
  1882. }
  1883. }
  1884. result.ResData = string.Join(",", resultTunenlsNew);
  1885. }
  1886. if (!string.IsNullOrEmpty(reqEntity.Memo1))
  1887. {
  1888. if (result.ResData.Contains(reqEntity.Memo1))
  1889. {
  1890. result.ResData = reqEntity.Memo1;
  1891. }
  1892. }
  1893. result.Memo1 = wcstask.ID.ToString();
  1894. //待检测的优先1-2巷道,检测过的或者不需要检测的优先3-8巷道
  1895. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode);
  1896. var tunellist = result.ResData.Split(',');
  1897. var tunlen2list = tunellist.Where(p => int.Parse(p) < 4);
  1898. var tunthen2list = tunellist.Where(p => int.Parse(p) >= 4);
  1899. if (stock.IsTorsChk == true && stock.TorsChkQty == 0 && stock.Ovced == 0)
  1900. {
  1901. if (tunlen2list.Any())
  1902. {
  1903. result.ResData = string.Join(",", tunlen2list);
  1904. }
  1905. }
  1906. else if ((stock.IsTorsChk == true && stock.TorsChkQty == 1) || stock.IsTorsChk == false)
  1907. {
  1908. var torsTunelEnable = _sysconfigrepository.GetFirst(p => p.Code == "TorsTunelEnable");
  1909. //如果扭转任务数量小于20,并且库容量小于0.5的可以使用
  1910. 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)
  1911. {
  1912. foreach (var item in tunlen2list.OrderByDescending(p=> int.Parse(p) ))
  1913. {
  1914. if (tempProportion.Where(p => p.Tunnel == item).Any() && tempProportion.Where(p => p.Tunnel == item).First().Proportion < decimal.Parse(torsTunelEnable.Default1) )
  1915. {
  1916. tunthen2list = tunthen2list.Prepend(item);
  1917. }
  1918. }
  1919. }
  1920. if (tunthen2list.Any())
  1921. {
  1922. result.ResData = string.Join(",", tunthen2list);
  1923. }
  1924. else
  1925. {
  1926. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1927. result.ResMsg = reqEntity.Code + "没有可用巷道";
  1928. return result;
  1929. }
  1930. }
  1931. if (string.IsNullOrEmpty(result.ResData))
  1932. {
  1933. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1934. result.ResMsg = reqEntity.Code + "没有可用巷道";
  1935. return result;
  1936. }
  1937. return result;
  1938. }
  1939. /// <summary>
  1940. /// 分配货位
  1941. /// </summary>
  1942. /// <param name="request"></param>
  1943. /// <returns></returns>
  1944. public SRes<List<ApplyStockInLocResponse>> ApplyStockInLoc(SxApplyStockInLocRequest reqEntity)
  1945. {
  1946. var res = new SRes<List<ApplyStockInLocResponse>>();
  1947. if (reqEntity.Floor == 0 || reqEntity.Floor > 3)
  1948. {
  1949. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1950. res.ResMsg = string.Join(',', reqEntity.TaskNum) + "楼层参数传递错误";
  1951. res.ResData = new List<ApplyStockInLocResponse>();
  1952. return res;
  1953. }
  1954. if (reqEntity.TunnelNum <= 0)
  1955. {
  1956. res.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();
  1957. res.ResMsg = string.Join(',', reqEntity.TaskNum) + ResponseStatusCodeEnum.NotTunnelNum.GetDescription();
  1958. return res;
  1959. }
  1960. if (reqEntity.TaskNum.Count > 2)
  1961. {
  1962. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1963. res.ResMsg = "当前申请分配货位的任务数大于2";
  1964. return res;
  1965. }
  1966. if (reqEntity.TaskNum.Count == 0)
  1967. {
  1968. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  1969. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  1970. return res;
  1971. }
  1972. lock (lockerApplyLoc)
  1973. {
  1974. res = ApplyStockInLocTemp(reqEntity);
  1975. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  1976. {
  1977. if (res.ResData.Any())
  1978. {
  1979. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  1980. {
  1981. StateNum = LocationState.LocationState_Empty
  1982. }, p => res.ResData.Select(p => p.CellNo).Contains(p.Code));
  1983. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  1984. {
  1985. AddrTo = "",
  1986. Fork = 0
  1987. }).Where(p => reqEntity.TaskNum.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  1988. res.ResData = new List<ApplyStockInLocResponse>();
  1989. }
  1990. else
  1991. {
  1992. }
  1993. return res;
  1994. }
  1995. }
  1996. return res;
  1997. }
  1998. /// <summary>
  1999. /// 分配货位
  2000. /// </summary>
  2001. /// <param name="request"></param>
  2002. /// <returns></returns>
  2003. public SRes<List<ApplyStockInLocResponse>> ApplyStockInLocTemp(SxApplyStockInLocRequest reqEntity)
  2004. {
  2005. var result = new SRes<List<ApplyStockInLocResponse>>() { ResData = new List<ApplyStockInLocResponse>() };
  2006. //var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.ID) && p.Status < TaskStatus.Finish).ToList();
  2007. var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => reqEntity.TaskNum.Contains(p.Id) && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).ToList();
  2008. if (!wcstask.Any())
  2009. {
  2010. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2011. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2012. return result;
  2013. }
  2014. if (wcstask.Any(p => p.Type == TaskType.OutDepot))
  2015. {
  2016. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2017. result.ResMsg = "该任务是出库任务,不能分配货位;wms任务号" + string.Join(",", reqEntity.TaskNum);
  2018. return result;
  2019. }
  2020. if (reqEntity.TaskNum.Count != wcstask.Count)
  2021. {
  2022. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2023. result.ResMsg = string.Join(',', reqEntity.TaskNum) + "申请的任务数与实际任务数不符";
  2024. return result;
  2025. }
  2026. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == "sxhouse");
  2027. if (warehouse == null)
  2028. {
  2029. result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  2030. result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  2031. return result;
  2032. }
  2033. var stocklist = _billInvnowrepository.GetList(p => wcstask.Select(p => p.BarCode).Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2034. if (!stocklist.Any())
  2035. {
  2036. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2037. result.ResMsg = string.Join(",", reqEntity.TaskNum) + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2038. return result;
  2039. }
  2040. if (reqEntity.TaskNum.Count != stocklist.Count)
  2041. {
  2042. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2043. result.ResMsg = string.Join(",", reqEntity.TaskNum) + "申请的任务数与库存数量不符";
  2044. return result;
  2045. }
  2046. if (wcstask.Count > 1)
  2047. {
  2048. List<ApplyStockInLocResponse> list = new List<ApplyStockInLocResponse>();
  2049. var code = string.Empty;
  2050. var num = new List<int>() { reqEntity.TaskNum[1], reqEntity.TaskNum[0] };
  2051. foreach (var item in num)
  2052. {
  2053. //验证库存
  2054. var task = wcstask.Where(p => p.Id == item).First();
  2055. var stock = stocklist.Where(p => p.ContGrpBarCode == task.BarCode).First();
  2056. if (!string.IsNullOrEmpty(task.AddrTo) && task.Fork != 0)
  2057. {
  2058. var applyCell = new ApplyStockInLocResponse()
  2059. {
  2060. TunnelNum = reqEntity.TunnelNum.ToString(),
  2061. CellNo = task.AddrTo,
  2062. Row = task.AddrTo.Split('-')[0] != null ? int.Parse(task.AddrTo.Split('-')[0]) : 0,
  2063. Colomn = task.AddrTo.Split('-')[1] != null ? int.Parse(task.AddrTo.Split('-')[1]) : 0,
  2064. Layer = task.AddrTo.Split('-')[2] != null ? int.Parse(task.AddrTo.Split('-')[2]) : 0,
  2065. Fork = task.Fork,
  2066. TaskNo = task.Id
  2067. };
  2068. result.ResData.Add(applyCell);
  2069. continue;
  2070. }
  2071. if (!string.IsNullOrEmpty(code))
  2072. {
  2073. var cell2 = ApplyLoc(new ApplyLocRequest()
  2074. {
  2075. MaterialId = stock.MatId,
  2076. MaterialCode = stock.MatCode,
  2077. TunnelNum = reqEntity.TunnelNum,
  2078. WarehuoseId = warehouse.Id,
  2079. IsMove = task.Type == TaskType.TransferDepot,
  2080. Floor = reqEntity.Floor,
  2081. CellCode = code,
  2082. Fork = 2,
  2083. Wind = stock.Wind,
  2084. IsControlpanel = stock.IsControlpanel,
  2085. IsTorsChk = stock.IsTorsChk,
  2086. TorsChkQty = stock.TorsChkQty,
  2087. ProductTime = stock.ProductTime,
  2088. Wbgroup = stock.WbGroupCode
  2089. });
  2090. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2091. {
  2092. result.ResCode = cell2.ResCode;
  2093. result.ResMsg = item + cell2.ResMsg;
  2094. return result;
  2095. }
  2096. try
  2097. {
  2098. cell2.ResData.Fork = 2;
  2099. cell2.ResData.TaskNo = item;
  2100. _db.BeginTran();
  2101. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2102. {
  2103. AddrTo = cell2.ResData.CellNo,
  2104. Fork = cell2.ResData.Fork
  2105. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2106. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2107. p => cell2.ResData.CellNo == p.Code);
  2108. _db.CommitTran();
  2109. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  2110. }
  2111. catch (Exception ex)
  2112. {
  2113. _db.RollbackTran();
  2114. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2115. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2116. return result;
  2117. }
  2118. continue;
  2119. }
  2120. #region 处理两个任务都是一货叉情况
  2121. if (item == reqEntity.TaskNum[0])
  2122. {
  2123. var cell2 = ApplyLoc(new ApplyLocRequest()
  2124. {
  2125. MaterialId = stock.MatId,
  2126. MaterialCode = stock.MatCode,
  2127. TunnelNum = reqEntity.TunnelNum,
  2128. WarehuoseId = warehouse.Id,
  2129. IsMove = task.Type == TaskType.TransferDepot,
  2130. Floor = reqEntity.Floor,
  2131. Fork = 2,
  2132. Wind = stock.Wind,
  2133. IsControlpanel = stock.IsControlpanel,
  2134. IsTorsChk = stock.IsTorsChk,
  2135. TorsChkQty = stock.TorsChkQty,
  2136. ProductTime = stock.ProductTime,
  2137. Wbgroup = stock.WbGroupCode
  2138. });
  2139. if (cell2.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2140. {
  2141. result.ResCode = cell2.ResCode;
  2142. result.ResMsg = item + cell2.ResMsg;
  2143. return result;
  2144. }
  2145. try
  2146. {
  2147. cell2.ResData.Fork = 2;
  2148. cell2.ResData.TaskNo = item;
  2149. _db.BeginTran();
  2150. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2151. {
  2152. AddrTo = cell2.ResData.CellNo,
  2153. Fork = cell2.ResData.Fork
  2154. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2155. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2156. p => cell2.ResData.CellNo == p.Code);
  2157. _db.CommitTran();
  2158. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell2.ResData));
  2159. }
  2160. catch (Exception ex)
  2161. {
  2162. _db.RollbackTran();
  2163. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2164. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2165. return result;
  2166. }
  2167. continue;
  2168. }
  2169. #endregion
  2170. var cell1 = ApplyLoc(new ApplyLocRequest()
  2171. {
  2172. MaterialId = stock.MatId,
  2173. MaterialCode = stock.MatCode,
  2174. TunnelNum = reqEntity.TunnelNum,
  2175. WarehuoseId = warehouse.Id,
  2176. IsMove = task.Type == TaskType.TransferDepot,
  2177. Floor = reqEntity.Floor,
  2178. Fork = 1,
  2179. Wind = stock.Wind,
  2180. IsControlpanel = stock.IsControlpanel,
  2181. IsTorsChk = stock.IsTorsChk,
  2182. TorsChkQty = stock.TorsChkQty,
  2183. ProductTime = stock.ProductTime,
  2184. Wbgroup = stock.WbGroupCode
  2185. });
  2186. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2187. {
  2188. result.ResCode = cell1.ResCode;
  2189. result.ResMsg = item + cell1.ResMsg;
  2190. return result;
  2191. }
  2192. try
  2193. {
  2194. cell1.ResData.Fork = 1;
  2195. cell1.ResData.TaskNo = item;
  2196. code = cell1.ResData.CellNo;
  2197. _db.BeginTran();
  2198. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2199. {
  2200. AddrTo = cell1.ResData.CellNo,
  2201. Fork = cell1.ResData.Fork
  2202. }).Where(p => p.Id == item).SplitTable(p => p.Take(2)).ExecuteCommand();
  2203. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2204. p => cell1.ResData.CellNo == p.Code);
  2205. _db.CommitTran();
  2206. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  2207. }
  2208. catch (Exception ex)
  2209. {
  2210. _db.RollbackTran();
  2211. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2212. result.ResMsg = item + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2213. return result;
  2214. }
  2215. }
  2216. }
  2217. else
  2218. {
  2219. //验证库存
  2220. var stock = stocklist.Where(p => p.ContGrpBarCode == wcstask.First().BarCode).First();
  2221. if (stock == null)
  2222. {
  2223. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2224. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2225. return result;
  2226. }
  2227. if (!string.IsNullOrEmpty(wcstask.First().AddrTo) && wcstask.First().Fork != 0)
  2228. {
  2229. var applyCell = new ApplyStockInLocResponse()
  2230. {
  2231. TunnelNum = reqEntity.TunnelNum.ToString(),
  2232. CellNo = wcstask.First().AddrTo,
  2233. Row = wcstask.First().AddrTo.Split('-')[0] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[0]) : 0,
  2234. Colomn = wcstask.First().AddrTo.Split('-')[1] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[1]) : 0,
  2235. Layer = wcstask.First().AddrTo.Split('-')[2] != null ? int.Parse(wcstask.First().AddrTo.Split('-')[2]) : 0,
  2236. Fork = wcstask.First().Fork,
  2237. TaskNo = wcstask.First().Id
  2238. };
  2239. result.ResData.Add(applyCell);
  2240. return result;
  2241. }
  2242. var cell1 = ApplyLoc(new ApplyLocRequest()
  2243. {
  2244. MaterialId = stock.MatId,
  2245. MaterialCode = stock.MatCode,
  2246. TunnelNum = reqEntity.TunnelNum,
  2247. WarehuoseId = warehouse.Id,
  2248. IsMove = wcstask.First().Type == TaskType.TransferDepot,
  2249. Floor = reqEntity.Floor,
  2250. Fork = 2,
  2251. Wind = stock.Wind,
  2252. IsControlpanel = stock.IsControlpanel,
  2253. IsTorsChk = stock.IsTorsChk,
  2254. TorsChkQty = stock.TorsChkQty,
  2255. ProductTime = stock.ProductTime,
  2256. Wbgroup = stock.WbGroupCode
  2257. });
  2258. if (cell1.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2259. {
  2260. result.ResCode = cell1.ResCode;
  2261. result.ResMsg = wcstask.First().Id + cell1.ResMsg;
  2262. return result;
  2263. }
  2264. try
  2265. {
  2266. cell1.ResData.TaskNo = wcstask.First().Id;
  2267. cell1.ResData.Fork = 2;
  2268. _db.BeginTran();
  2269. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2270. {
  2271. AddrTo = cell1.ResData.CellNo,
  2272. Fork = cell1.ResData.Fork,
  2273. }).Where(p => p.Id == wcstask.First().Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  2274. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockIn, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2275. p => p.Code == cell1.ResData.CellNo);
  2276. _db.CommitTran();
  2277. result.ResData.Add(_mapper.Map<ApplyStockInLocResponse>(cell1.ResData));
  2278. }
  2279. catch (Exception ex)
  2280. {
  2281. _db.RollbackTran();
  2282. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2283. result.ResMsg = wcstask.First().Id + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  2284. }
  2285. }
  2286. return result;
  2287. }
  2288. public SRes<ApplyStockInLocResponse> ApplyLoc(ApplyLocRequest reqEntity)
  2289. {
  2290. var result = new SRes<ApplyStockInLocResponse>()
  2291. {
  2292. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2293. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  2294. ResData = new ApplyStockInLocResponse(),
  2295. };
  2296. //预留货位数量
  2297. var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
  2298. && p.StateNum == LocationState.LocationState_Empty
  2299. && p.TypeNum == LocationType.LocationType_StorageLocation
  2300. && p.Tunnel == reqEntity.TunnelNum
  2301. && p.WarehouseId == reqEntity.WarehuoseId
  2302. && p.Floor == reqEntity.Floor
  2303. );
  2304. //判断是否移库
  2305. if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 10))
  2306. {
  2307. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2308. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  2309. return result;
  2310. }
  2311. var loc1ist = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  2312. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  2313. && loc1.Tunnel == reqEntity.TunnelNum
  2314. && loc1.WarehouseId == reqEntity.WarehuoseId
  2315. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1).ToList()
  2316. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  2317. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor).ToList()
  2318. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  2319. join stock in _billInvnowrepository.GetList(inv => inv.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(inv.PreStock))
  2320. on loct2.ContGrpBarCode equals stock.ContGrpBarCode
  2321. where loct1.Tunnel == reqEntity.TunnelNum && loct1.Floor == reqEntity.Floor
  2322. select new stocktemp1 {
  2323. Code = loct1.Code.ToString(),
  2324. Id = loct1.Id,
  2325. Row = loct1.Row,
  2326. Col = loct1.Col,
  2327. Layer = loct1.Layer,
  2328. Tunnel = loct1.Tunnel,
  2329. Floor = loct1.Floor,
  2330. ContGrpBarCode = loct2.ContGrpBarCode,
  2331. Shelf = loct2.Shelf,
  2332. MatCode = stock.MatCode,
  2333. MatId = stock.MatId,
  2334. WbGroupCode = stock.WbGroupCode,
  2335. InDocsNo = stock.InDocsNo,
  2336. Wind = stock.Wind,
  2337. IsControlpanel = stock.IsControlpanel,
  2338. IsTorsChk = stock.IsTorsChk,
  2339. TorsChkQty = stock.TorsChkQty,
  2340. ProductTime = stock.ProductTime
  2341. };
  2342. #region 非控制盘、已扭转的控制盘
  2343. if (reqEntity.IsControlpanel == false)
  2344. {
  2345. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2346. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  2347. {
  2348. if (reqEntity.Fork == 1)
  2349. {
  2350. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2351. && p.WbGroupCode == reqEntity.Wbgroup && Math.Abs((p.ProductTime - reqEntity.ProductTime).TotalHours) < 1).Any())
  2352. {
  2353. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2354. && 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();
  2355. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2356. result.ResData.CellNo = resloc.Code;
  2357. result.ResData.Row = resloc.Row;
  2358. result.ResData.Colomn = resloc.Col;
  2359. result.ResData.Layer = resloc.Layer;
  2360. _logger.LogInformation("分货位埋点1:" + result.ResData.CellNo);
  2361. return result;
  2362. }
  2363. }
  2364. else
  2365. {
  2366. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2367. && 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();
  2368. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2369. result.ResData.CellNo = resloc.Code;
  2370. result.ResData.Row = resloc.Row;
  2371. result.ResData.Colomn = resloc.Col;
  2372. result.ResData.Layer = resloc.Layer;
  2373. _logger.LogInformation("分货位埋点2:" + result.ResData.CellNo);
  2374. return result;
  2375. }
  2376. }
  2377. }
  2378. else
  2379. {
  2380. if (reqEntity.IsControlpanel == true && reqEntity.IsTorsChk == true && reqEntity.TorsChkQty > 0) //已扭转完
  2381. {
  2382. //var starttime = reqEntity.ProductTime.Date.AddHours(13);
  2383. //var endtime = reqEntity.ProductTime.Date.AddDays(1).AddHours(8);
  2384. if (loc1ist != null && loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2385. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0).Any())// && p.ProductTime >= starttime && p.ProductTime <= endtime
  2386. {
  2387. if (reqEntity.Fork == 1)
  2388. {
  2389. if (loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2390. && p.WbGroupCode == reqEntity.Wbgroup && reqEntity.IsTorsChk == p.IsTorsChk && p.TorsChkQty > 0 ).Any())//&& p.ProductTime >= starttime && p.ProductTime <= endtime
  2391. {
  2392. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Col < 70 && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2393. && 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
  2394. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2395. result.ResData.CellNo = resloc.Code;
  2396. result.ResData.Row = resloc.Row;
  2397. result.ResData.Colomn = resloc.Col;
  2398. result.ResData.Layer = resloc.Layer;
  2399. _logger.LogInformation("分货位埋点3:" + result.ResData.CellNo);
  2400. return result;
  2401. }
  2402. }
  2403. else
  2404. {
  2405. var resloc = loc1ist.ToList().Where(p => p.MatId == reqEntity.MaterialId && p.Wind == reqEntity.Wind && p.IsControlpanel == reqEntity.IsControlpanel
  2406. && 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
  2407. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2408. result.ResData.CellNo = resloc.Code;
  2409. result.ResData.Row = resloc.Row;
  2410. result.ResData.Colomn = resloc.Col;
  2411. result.ResData.Layer = resloc.Layer;
  2412. _logger.LogInformation("分货位埋点4:" + result.ResData.CellNo);
  2413. return result;
  2414. }
  2415. }
  2416. }
  2417. }
  2418. #endregion
  2419. //再找二深位空的
  2420. if (emptyLoc.Where(p => p.Depth == 2).Any())
  2421. {
  2422. //一深位必须空
  2423. 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)
  2424. join loc2 in emptyLoc.Where(p => p.Depth == 2) on new { loc1.Col, loc1.Layer } equals new { loc2.Col, loc2.Layer }
  2425. select loc2;
  2426. if (templist == null || !templist.Any())
  2427. {
  2428. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2429. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的二升位";
  2430. _logger.LogInformation("分货位埋点5:" + result.ResData.CellNo);
  2431. return result;
  2432. }
  2433. if (!string.IsNullOrEmpty(reqEntity.CellCode))
  2434. {
  2435. var cell = reqEntity.CellCode.Split('-');
  2436. if (cell[4] == "2")
  2437. {
  2438. var cell2 = templist.Where(p => p.Depth == 2 && p.Shelf == cell[3]).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row); //优先同货架相邻同层货位
  2439. if (cell2.Where(p => p.Depth == 2 && p.Shelf == cell[3] && p.Layer == int.Parse(cell[2])).Any())
  2440. {
  2441. 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();
  2442. result.ResData.TunnelNum = cell3.Tunnel.ToString();
  2443. result.ResData.CellNo = cell3.Code;
  2444. result.ResData.Row = cell3.Row;
  2445. result.ResData.Colomn = cell3.Col;
  2446. result.ResData.Layer = cell3.Layer;
  2447. result.ResData.Fork = 2;
  2448. _logger.LogInformation("分货位埋点6:" + result.ResData.CellNo);
  2449. return result;
  2450. }
  2451. else
  2452. {
  2453. if (cell2.Any())
  2454. {
  2455. var cell4 = cell2.First();
  2456. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  2457. result.ResData.CellNo = cell4.Code;
  2458. result.ResData.Row = cell4.Row;
  2459. result.ResData.Colomn = cell4.Col;
  2460. result.ResData.Layer = cell4.Layer;
  2461. result.ResData.Fork = 2;
  2462. _logger.LogInformation("分货位埋点7:" + result.ResData.CellNo);
  2463. return result;
  2464. }
  2465. else
  2466. {
  2467. var cell4 = templist.OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2468. result.ResData.TunnelNum = cell4.Tunnel.ToString();
  2469. result.ResData.CellNo = cell4.Code;
  2470. result.ResData.Row = cell4.Row;
  2471. result.ResData.Colomn = cell4.Col;
  2472. result.ResData.Layer = cell4.Layer;
  2473. result.ResData.Fork = 2;
  2474. _logger.LogInformation("分货位埋点8:" + result.ResData.CellNo);
  2475. return result;
  2476. }
  2477. }
  2478. }
  2479. }
  2480. if (reqEntity.Fork == 2)
  2481. {
  2482. //var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  2483. var resloc = templist.Where(p => p.Depth == 2).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2484. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2485. result.ResData.CellNo = resloc.Code;
  2486. result.ResData.Row = resloc.Row;
  2487. result.ResData.Colomn = resloc.Col;
  2488. result.ResData.Layer = resloc.Layer;
  2489. _logger.LogInformation("分货位埋点9:" + result.ResData.CellNo);
  2490. return result;
  2491. }
  2492. else
  2493. {
  2494. //templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).Any()
  2495. if (templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).Any())
  2496. {
  2497. //var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  2498. var resloc = templist.Where(p => p.Depth == 2 && p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2499. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  2500. result.ResData.CellNo = resloc.Code;
  2501. result.ResData.Row = resloc.Row;
  2502. result.ResData.Colomn = resloc.Col;
  2503. result.ResData.Layer = resloc.Layer;
  2504. _logger.LogInformation("分货位埋点10:" + result.ResData.CellNo);
  2505. return result;
  2506. }
  2507. else
  2508. {
  2509. }
  2510. }
  2511. }
  2512. if (loc1ist == null || !loc1ist.Any())
  2513. {
  2514. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2515. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription() + "没有可用的一升位货位";
  2516. _logger.LogInformation("分货位埋点11:" + result.ResData.CellNo);
  2517. return result;
  2518. }
  2519. if (reqEntity.Fork == 1)
  2520. {
  2521. if (loc1ist.ToList().Where(p => p.Col < 70).Any())
  2522. {
  2523. var aa = loc1ist.ToList();
  2524. var code = aa.Where(p => p.Col < 70).OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2525. result.ResData.TunnelNum = code.Tunnel.ToString();
  2526. result.ResData.CellNo = code.Code;
  2527. result.ResData.Row = code.Row;
  2528. result.ResData.Colomn = code.Col;
  2529. result.ResData.Layer = code.Layer;
  2530. _logger.LogInformation("分货位埋点12:" + result.ResData.CellNo);
  2531. return result;
  2532. }
  2533. else
  2534. {
  2535. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  2536. result.ResMsg = "一货叉没有可用库位";
  2537. _logger.LogInformation("分货位埋点13:" + result.ResData.CellNo);
  2538. return result;
  2539. }
  2540. }
  2541. var loc1ist11 = from loct1 in _basewarecellrepository.GetList(loc1 => loc1.IsStop == 0 && loc1.StateNum == LocationState.LocationState_Empty
  2542. && loc1.TypeNum == LocationType.LocationType_StorageLocation
  2543. && loc1.Tunnel == reqEntity.TunnelNum
  2544. && loc1.WarehouseId == reqEntity.WarehuoseId
  2545. && loc1.Floor == reqEntity.Floor && loc1.Depth == 1 && loc1.Floor == reqEntity.Floor).ToList()
  2546. join loct2 in _basewarecellrepository.GetList(loc2 => loc2.IsStop == 0 && loc2.Depth == 2 && loc2.StateNum == LocationState.LocationState_Full
  2547. && loc2.Tunnel == reqEntity.TunnelNum && loc2.Floor == reqEntity.Floor
  2548. ).ToList()
  2549. on new { loct1.Shelf, loct1.Col, loct1.Layer } equals new { loct2.Shelf, loct2.Col, loct2.Layer }
  2550. select loct1;
  2551. var loc = loc1ist11.ToList().OrderBy(p => p.Col).ThenBy(p => p.Layer).ThenBy(p => p.Row).First();
  2552. //var loc = loc1ist.First();
  2553. result.ResData.TunnelNum = loc.Tunnel.ToString();
  2554. result.ResData.CellNo = loc.Code;
  2555. result.ResData.Row = loc.Row;
  2556. result.ResData.Colomn = loc.Col;
  2557. result.ResData.Layer = loc.Layer;
  2558. _logger.LogInformation("分货位埋点14:" + result.ResData.CellNo);
  2559. return result;
  2560. }
  2561. /// <summary>
  2562. /// 完成出库任务
  2563. /// </summary>
  2564. /// <param name="reqDto"></param>
  2565. /// <returns></returns>
  2566. public SRes<int> CompleteTask(SxCompleteTaskRequest reqDto)
  2567. {
  2568. var result = new SRes<int>()
  2569. {
  2570. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2571. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  2572. };
  2573. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.AddrTo == reqDto.Equip && p.Status < TaskStatus.Finish && p.Type < TaskType.OutDepot).SplitTable(p => p.Take(2));
  2574. //if (!tasklist.Any())
  2575. //{
  2576. // result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2577. // result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2578. // return result;
  2579. //}
  2580. ////处理时效库存
  2581. //var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2582. //if (!stocklist.Any())
  2583. //{
  2584. // result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2585. // result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2586. // return result;
  2587. //}
  2588. //var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2589. //foreach (var flow in flowlist)
  2590. //{
  2591. // flow.Id = IdFactory.NewId();
  2592. // flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2593. // flow.AddTime = DateTime.Now;
  2594. // flow.EditTime = DateTime.Now;
  2595. // flow.Memo = "码垛装箱完成";
  2596. //}
  2597. //var palletizing = _palletizrepository.GetSingle(p => p.Id == tasklist.First().PalletizingId && p.PalletizState == 0 && p.Equip == reqDto.Equip);
  2598. //if (palletizing == null)
  2599. //{
  2600. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2601. // result.ResMsg = "没有找到符合条件的码垛信息";
  2602. // return result;
  2603. //}
  2604. //var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  2605. //if (!pallctdetail.Any())
  2606. //{
  2607. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2608. // result.ResMsg = "未找到码垛明细数据";
  2609. // return result;
  2610. //}
  2611. ////转向成品
  2612. //try
  2613. //{
  2614. // _db.BeginTran();
  2615. // _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  2616. // _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  2617. // _palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  2618. // {
  2619. // PalletizState = 1
  2620. // }, p => p.Equip == reqDto.Equip && p.Id == palletizing.Id);
  2621. // _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  2622. // _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2623. // p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  2624. // _billInvflow.InsertRange(flowlist);
  2625. // _db.CommitTran();
  2626. //}
  2627. //catch (Exception ex)
  2628. //{
  2629. // _db.RollbackTran();
  2630. // _logger.LogInformation(ex.ToString());
  2631. // result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2632. // result.ResMsg = "完成码垛任务异常";
  2633. //}
  2634. return result;
  2635. }
  2636. /// <summary>
  2637. /// 堆垛机放完
  2638. /// </summary>
  2639. /// <param name="reqDto"></param>
  2640. /// <returns></returns>
  2641. public SRes<int> SrmCompleted(SxCompleteTaskRequest reqDto)
  2642. {
  2643. var result = new SRes<int>()
  2644. {
  2645. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2646. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  2647. ResData = reqDto.TaskNum
  2648. };
  2649. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  2650. if (wcstask == null || wcstask.Id <= 0)
  2651. {
  2652. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2653. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2654. return result;
  2655. }
  2656. if (wcstask.Type == TaskType.EnterDepot)
  2657. {
  2658. //库存,货位
  2659. try
  2660. {
  2661. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  2662. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2663. if (stock == null)
  2664. {
  2665. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2666. if (stocks != null)
  2667. {
  2668. return result;
  2669. }
  2670. else
  2671. {
  2672. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2673. result.ResMsg = wcstask.BarCode + "没有已组盘的信息";
  2674. return result;
  2675. }
  2676. }
  2677. int row = int.Parse(wcstask.AddrTo.Split('-')[0]);
  2678. int col = int.Parse(wcstask.AddrTo.Split('-')[1]);
  2679. int layer = int.Parse(wcstask.AddrTo.Split('-')[2]);
  2680. int depth = int.Parse(wcstask.AddrTo.Split('-')[4]);
  2681. _db.BeginTran();
  2682. //更新库存
  2683. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), PutRow = row, PutCol = col, PutLayer = layer,Depth = depth, OneInTime = DateTime.Now, EditTime = DateTime.Now },
  2684. p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2685. //更新货位
  2686. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now },
  2687. p => p.Row == row && p.Col == col && p.Layer == layer);
  2688. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2689. foreach (var flow in stocklist)
  2690. {
  2691. flow.Id = IdFactory.NewId();
  2692. flow.AddTime = DateTime.Now;
  2693. flow.EditTime = DateTime.Now;
  2694. flow.Memo = "入库任务完成";
  2695. }
  2696. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(stocklist));
  2697. //单据
  2698. var list = new List<BillPushinfo>();
  2699. string pushtype = SxFackbeekType.InterfaceType_SX_CurtainStockIn.ToString();
  2700. //回调数据
  2701. foreach (var push in stocklist)
  2702. {
  2703. list.Add(new BillPushinfo
  2704. {
  2705. DocsNo = stock.ExecDocsNo,
  2706. TypeCode = pushtype,
  2707. RFIDBarCode = stock.ContGrpBarCode,
  2708. HWBarCode = stock.ContGrpBarCode,
  2709. CLBarCode = push.CLBarCode,
  2710. WarehouseId = warehouse.Id,
  2711. WarehouseCode = warehouse.Code,
  2712. WareCellId = 0,
  2713. WareCellCode = wcstask.AddrTo,
  2714. MatId = push.MatId,
  2715. MatCode = push.MatCode,
  2716. MatName = push.MatName,
  2717. TolWQty = push.TolWQty,
  2718. NetWQty = push.NetWQty,
  2719. TareWQty = push.TareWQty,
  2720. ReqNo = Guid.NewGuid().ToString()
  2721. });
  2722. }
  2723. _billPushinforepository.InsertRange(list);
  2724. _db.CommitTran();
  2725. }
  2726. catch (Exception ex)
  2727. {
  2728. _db.RollbackTran();
  2729. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2730. result.ResMsg = wcstask.Id + "完成入库任务异常";
  2731. _logger.LogInformation("完成入库任务异常" + ex.ToString());
  2732. }
  2733. }
  2734. else if (wcstask.Type == TaskType.OutDepot)
  2735. {
  2736. //库存删除
  2737. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2738. if (stocklist == null || !stocklist.Any())
  2739. {
  2740. //result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2741. //result.ResMsg = wcstask.Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2742. return result;
  2743. }
  2744. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.StateNum == LocationState.LocationState_StockOut);
  2745. if (cell == null)
  2746. {
  2747. //result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2748. //result.ResMsg = wcstask.Id + "货位清除不符合条件";
  2749. return result;
  2750. }
  2751. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2752. foreach (var flow in flowlist)
  2753. {
  2754. flow.Id = IdFactory.NewId();
  2755. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2756. flow.AddTime = DateTime.Now;
  2757. flow.EditTime = DateTime.Now;
  2758. flow.Memo = "出库任务堆垛机放货完成";
  2759. }
  2760. try
  2761. {
  2762. _db.BeginTran();
  2763. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2764. p => p.StateNum == LocationState.LocationState_StockOut && p.Code.Contains(wcstask.AddrFrom));
  2765. if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription())
  2766. {
  2767. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2768. {
  2769. PutRow = 0,
  2770. PutCol = 0,
  2771. PutLayer = 0
  2772. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2773. var purch = new BillPushinfo()
  2774. {
  2775. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2776. TypeCode = SxFackbeekType.InterfaceType_SX_CurtainStockOut.ToString(),
  2777. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2778. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2779. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2780. WarehouseId = cell.WarehouseId,
  2781. WarehouseCode = "sxhouse",
  2782. WareCellId = cell.Id,
  2783. WareCellCode = wcstask.AddrFrom,
  2784. MatId = stocklist.FirstOrDefault().MatId,
  2785. MatCode = stocklist.FirstOrDefault().MatCode,
  2786. MatName = stocklist.FirstOrDefault().MatName,
  2787. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2788. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2789. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2790. ReqNo = Guid.NewGuid().ToString()
  2791. };
  2792. _billPushinforepository.Insert(purch);
  2793. }
  2794. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription())
  2795. {
  2796. var purch = new BillPushinfo()
  2797. {
  2798. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2799. TypeCode = SxFackbeekType.InterfaceType_SX_ErrorStockOut.ToString(),
  2800. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2801. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2802. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2803. WarehouseId = cell.WarehouseId,
  2804. WarehouseCode = "sxhouse",
  2805. WareCellId = cell.Id,
  2806. WareCellCode = wcstask.AddrFrom,
  2807. MatId = stocklist.FirstOrDefault().MatId,
  2808. MatCode = stocklist.FirstOrDefault().MatCode,
  2809. MatName = stocklist.FirstOrDefault().MatName,
  2810. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2811. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2812. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2813. ReqNo = Guid.NewGuid().ToString()
  2814. };
  2815. _billPushinforepository.Insert(purch);
  2816. }
  2817. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription())
  2818. {
  2819. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2820. {
  2821. PutRow = 0,
  2822. PutCol = 0,
  2823. PutLayer = 0
  2824. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2825. }
  2826. else if (wcstask.BusType == "Test" || wcstask.BusType == "异常出库")
  2827. {
  2828. _billInvnowrepository.Delete(p => p.ContGrpBarCode == wcstask.BarCode);
  2829. _billInvflow.InsertRange(flowlist);
  2830. }
  2831. //_taskrepository.Delete(p => p.BarCode == wcstask.BarCode);
  2832. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish }).Where(p => p.Id == wcstask.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  2833. _db.CommitTran();
  2834. }
  2835. catch (Exception ex)
  2836. {
  2837. _db.RollbackTran();
  2838. _logger.LogInformation(ex.ToString());
  2839. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2840. result.ResMsg = wcstask.Id + "出库任务堆垛机放货完成异常";
  2841. }
  2842. }
  2843. else if (wcstask.Type == TaskType.TransferDepot)
  2844. {
  2845. var fromcell = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom);
  2846. if (string.IsNullOrEmpty(fromcell.ContGrpBarCode) || fromcell.ContGrpBarCode != wcstask.BarCode)
  2847. {
  2848. _logger.LogInformation(wcstask.Id + "移库任务重复完成");
  2849. return result;
  2850. }
  2851. var grcontid = fromcell.ContGrpId;
  2852. var grcontcode = fromcell.ContGrpBarCode;
  2853. var fromcellno = fromcell.Code;
  2854. var tocellno = wcstask.AddrTo;
  2855. try
  2856. {
  2857. _db.BeginTran();
  2858. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == fromcellno);
  2859. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = grcontcode, ContGrpId = grcontid, EditTime = DateTime.Now }, p => p.Code == tocellno);
  2860. int row = int.Parse(tocellno.Split('-')[0]);
  2861. int col = int.Parse(tocellno.Split('-')[1]);
  2862. int layer = int.Parse(tocellno.Split('-')[2]);
  2863. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = row, PutCol = col, PutLayer = layer }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2864. _db.CommitTran();
  2865. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2866. //流水表
  2867. var flow = _mapper.Map<BillInvflow>(stock);
  2868. flow.Id = IdFactory.NewId();
  2869. flow.AddTime = DateTime.Now;
  2870. flow.EditTime = DateTime.Now;
  2871. flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";
  2872. _billInvflow.Insert(flow);
  2873. //推送表
  2874. var purch = new BillPushinfo()
  2875. {
  2876. DocsNo = stock.InDocsNo,
  2877. TypeCode = SxFackbeekType.InterfaceType_SX_CellMove.ToString(),
  2878. RFIDBarCode = stock.ContGrpBarCode,
  2879. HWBarCode = stock.ContGrpBarCode,
  2880. CLBarCode = stock.CLBarCode,
  2881. WarehouseId = fromcell.WarehouseId,
  2882. WarehouseCode = "sxhouse",
  2883. WareCellId = 0,
  2884. WareCellCode = wcstask.AddrFrom,
  2885. RodBarCode = wcstask.AddrTo,
  2886. MatId = stock.MatId,
  2887. MatCode = stock.MatCode,
  2888. MatName = stock.MatName,
  2889. TolWQty = stock.TolWQty,
  2890. NetWQty = stock.NetWQty,
  2891. TareWQty = stock.TareWQty,
  2892. ReqNo = Guid.NewGuid().ToString()
  2893. };
  2894. _billPushinforepository.Insert(purch);
  2895. }
  2896. catch (Exception ex)
  2897. {
  2898. _db.RollbackTran();
  2899. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2900. result.ResMsg = wcstask.Id + "完成移库任务异常";
  2901. _logger.LogInformation("完成移库任务异常" + ex.ToString());
  2902. }
  2903. }
  2904. return result;
  2905. }
  2906. /// <summary>
  2907. /// 完成码垛任务
  2908. /// </summary>
  2909. /// <param name="reqDto"></param>
  2910. /// <returns></returns>
  2911. public SRes<int> CompletePalletizingTask(SxPalletizingCompleteRequest reqDto)
  2912. {
  2913. var res = new SRes<int>()
  2914. {
  2915. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2916. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  2917. };
  2918. var palletizing = _palletizrepository.GetFirst(p => p.PalletizState == 0 && p.Equip == reqDto.Equip);
  2919. if (palletizing == null)
  2920. {
  2921. //兼容wcs任务没有清掉的情况
  2922. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2923. if (lefttask != null)
  2924. {
  2925. var pazid = lefttask.PalletizingId;
  2926. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2927. {
  2928. res.Memo1 = lefttask.PalletizingId.ToString();
  2929. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2930. return res;
  2931. }
  2932. }
  2933. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2934. res.ResMsg = reqDto.Equip + "没有找到正在码垛的信息";
  2935. return res;
  2936. }
  2937. 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();
  2938. if (!tasklist.Any())
  2939. {
  2940. //兼容wcs任务没有清掉的情况
  2941. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2942. if (lefttask != null)
  2943. {
  2944. var pazid = lefttask.PalletizingId;
  2945. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2946. {
  2947. res.Memo1 = lefttask.PalletizingId.ToString();
  2948. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2949. return res;
  2950. }
  2951. }
  2952. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2953. res.ResMsg = reqDto.Equip + "不存在该码垛工位的出库任务";
  2954. return res;
  2955. }
  2956. //处理时效库存
  2957. var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2958. if (!stocklist.Any())
  2959. {
  2960. if (!_palletizrepository.IsAny(p => p.Equip == reqDto.Equip && p.PalletizState == 0))
  2961. {
  2962. return res;
  2963. }
  2964. else
  2965. {
  2966. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2967. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2968. return res;
  2969. }
  2970. }
  2971. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2972. foreach (var flow in flowlist)
  2973. {
  2974. flow.Id = IdFactory.NewId();
  2975. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2976. flow.AddTime = DateTime.Now;
  2977. flow.EditTime = DateTime.Now;
  2978. flow.Memo = "码垛装箱完成";
  2979. }
  2980. var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  2981. if (!pallctdetail.Any())
  2982. {
  2983. //兼容wcs任务没有清掉的情况
  2984. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2985. if (lefttask != null)
  2986. {
  2987. var pazid = lefttask.PalletizingId;
  2988. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2989. {
  2990. res.Memo1 = lefttask.PalletizingId.ToString();
  2991. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2992. return res;
  2993. }
  2994. }
  2995. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2996. res.ResMsg = reqDto.Equip + "未找到码垛明细数据";
  2997. return res;
  2998. }
  2999. if (palletizing.Finish == 0)
  3000. {
  3001. if (palletizing.PalletMax != pallctdetail.Count)
  3002. {
  3003. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3004. res.ResMsg = reqDto.Equip + "已码数量不符最大码垛数量";
  3005. return res;
  3006. }
  3007. }
  3008. var boxcode = _boxrulerepository.GetSingle(p => p.Id == palletizing.BoxRuleId && p.ZXStateCode != 2);
  3009. if (boxcode == null)
  3010. {
  3011. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3012. res.ResMsg = reqDto.Equip + "跺型未找到关联的装箱信息";
  3013. return res;
  3014. }
  3015. var packinfo = _packInforepository.GetList(p => p.MatCode == boxcode.TrayCode).First();
  3016. var packlist = _packInforepository.GetList(p => p.PackCode == boxcode.Dryer);
  3017. decimal wqty = 0;
  3018. if (packlist.Any())
  3019. {
  3020. decimal tuopanqty = 0;
  3021. decimal packsqty = 0;
  3022. decimal dituoqty = 0;
  3023. decimal gebanqty = 0;
  3024. if (packlist.Any(p => p.MatCode == "C06-02-09-0043"))
  3025. {
  3026. var tuopan = packlist.Where(p => p.MatCode == "C06-02-09-0043").FirstOrDefault();
  3027. tuopanqty = tuopan.Count * tuopan.Weight / 1000;
  3028. }
  3029. if (packlist.Any(p => p.MatCode == "C12-01-08-0004"))
  3030. {
  3031. var packs = packlist.Where(p => p.MatCode == "C12-01-08-0004").FirstOrDefault();
  3032. packsqty = packs.Count * packs.Weight / 1000;
  3033. }
  3034. if (packlist.Any(p => p.MatCode == "C12-01-10-0003"))
  3035. {
  3036. var dituo = packlist.Where(p => p.MatCode == "C12-01-10-0003").FirstOrDefault();
  3037. dituoqty = dituo.Count * dituo.Weight / 1000;
  3038. }
  3039. if (packlist.Any(p => p.MatCode == "C12-01-09-0003"))
  3040. {
  3041. var geban = packlist.Where(p => p.MatCode == "C12-01-09-0003").FirstOrDefault();
  3042. gebanqty = 1 * geban.Weight / 1000;
  3043. }
  3044. wqty = tuopanqty + packsqty + dituoqty + gebanqty;
  3045. }
  3046. if (wqty == 0)
  3047. {
  3048. wqty = 16;
  3049. }
  3050. //判断托盘号是否一致
  3051. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == palletizing.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  3052. //if (wcstask == null)
  3053. //{
  3054. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3055. // res.ResMsg = reqDto.Equip + "码垛主表的托盘任务id不存在任务信息";
  3056. // return res;
  3057. //}
  3058. var tray = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code = " + palletizing.Equip).First();
  3059. //if (wcstask.BarCode != tray.Code)
  3060. //{
  3061. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3062. // res.ResMsg = reqDto.Equip + "托盘号不匹配";
  3063. // return res;
  3064. //}
  3065. //转向成品
  3066. var info = _mapper.Map<List<PalletinfoDetail>>(pallctdetail);
  3067. info.ForEach(p => p.HuNr = boxcode.PBoxCode);
  3068. var product = new PalletBoxCodeinfoRequest()
  3069. {
  3070. TaskNum = palletizing.TaskNum,
  3071. Equip = tray.Code,
  3072. BoxCode = boxcode.PBoxCode,
  3073. TrayCode = tray.SContent,
  3074. HwType = stocklist.First().HWTypeCode,
  3075. TrayType = packinfo.MatName,
  3076. Wqty = wqty,
  3077. PackWeight = boxcode.PackWeight,
  3078. list = info
  3079. };
  3080. try
  3081. {
  3082. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/PalletAutoInTask", JsonConvert.SerializeObject(product));
  3083. var resp = JsonConvert.DeserializeObject<SRes>(response);
  3084. if (resp.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3085. {
  3086. res.ResCode = resp.ResCode;
  3087. res.ResMsg = reqDto.Equip + resp.ResMsg;
  3088. return res;
  3089. }
  3090. _db.BeginTran();
  3091. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  3092. _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  3093. _palletlayerMathrepository.Delete(p => p.PboxruleId == boxcode.Id);
  3094. _palletizrepository.AsUpdateable()
  3095. .SetColumns(p => new Palletizing() { PalletizState = 1, EditTime = DateTime.Now })
  3096. .Where(p => p.Equip == reqDto.Equip && p.Id == palletizing.Id)
  3097. .ExecuteCommand();
  3098. _palletizrepository.AsUpdateable()
  3099. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  3100. .Where(p => p.Equip == reqDto.Equip && p.PalletizState == 2)
  3101. .ExecuteCommand();
  3102. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  3103. //{
  3104. // PalletizState = 0
  3105. //}, p => p.Equip == reqDto.Equip && p.PalletizState == 2);
  3106. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule() { ZXStateCode = 2, EditTime = DateTime.Now }).Where(p => p.Id == boxcode.Id).ExecuteCommand();
  3107. _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  3108. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  3109. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  3110. _billInvflow.InsertRange(flowlist);
  3111. //_boxrulerepository.Delete(p => p.Id == boxcode.Id);
  3112. _db.CommitTran();
  3113. }
  3114. catch (Exception ex)
  3115. {
  3116. _db.RollbackTran();
  3117. _logger.LogInformation(ex.ToString());
  3118. res.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  3119. res.ResMsg = "完成码垛任务异常" + ex.Message;
  3120. }
  3121. return res;
  3122. }
  3123. /// <summary>
  3124. /// 码垛层配装箱出库
  3125. /// </summary>
  3126. /// <param name="request"></param>
  3127. /// <returns></returns>
  3128. public SRes PalletizingLayerPackStockOut(PalletizingPackStockOutRequest request)
  3129. {
  3130. var res = new SRes();
  3131. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "层配");
  3132. if (palletlist.Any())
  3133. {
  3134. foreach (var item in palletlist)
  3135. {
  3136. 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));
  3137. if (tasklist.Any())
  3138. {
  3139. continue;
  3140. }
  3141. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  3142. if (equips == null)
  3143. {
  3144. continue;
  3145. }
  3146. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0 && p.PboxruleId == item.BoxRuleId).OrderBy(p => p.Layer);
  3147. if (!palletMach.Any())
  3148. {
  3149. continue;
  3150. }
  3151. //var layers = (from aa in match.GroupBy(p => p.Layer)
  3152. // select new LayerCount
  3153. // {
  3154. // Layer = aa.Key,
  3155. // Count = aa.Count()
  3156. // }).ToList();
  3157. #region 分层出库
  3158. if (palletMach.Where(p => p.Layer == 1).Any())
  3159. {
  3160. var pallectMachs = palletMach.Where(p => p.Layer == 1);
  3161. foreach (var pallets in pallectMachs)
  3162. {
  3163. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3164. if (cell == null)
  3165. {
  3166. continue;
  3167. }
  3168. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3169. if (invs == null)
  3170. {
  3171. continue;
  3172. }
  3173. var root = "";
  3174. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3175. {
  3176. root = "Robot1";
  3177. }
  3178. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3179. {
  3180. root = "Robot2";
  3181. }
  3182. //先判断二升位是否能出库
  3183. if (cell.Depth == 2)
  3184. {
  3185. var respon = MoveTask(cell.Code);
  3186. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3187. {
  3188. continue;
  3189. }
  3190. }
  3191. PalletizingPackTask(new PalletizingPackTaskRequest()
  3192. {
  3193. Code = pallets.ContBarCode,
  3194. CellCode = cell.Code,
  3195. Srm = cell.SCRel,
  3196. Tunnel = cell.Tunnel.ToString(),
  3197. Floor = cell.Floor,
  3198. Grade = invs.Grade,
  3199. Mater = invs.MatCode,
  3200. SkuCode = invs.SkuCode,
  3201. PalletLayer = pallets.Layer,
  3202. ProductMachCode = invs.ProductMachCode,
  3203. Equip = item.Equip,
  3204. PalletizingId = item.Id,
  3205. Robot = root,
  3206. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3207. });
  3208. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3209. {
  3210. Istask = 1
  3211. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3212. }
  3213. return res;
  3214. }
  3215. else if (palletMach.Where(p => p.Layer == 2).Any())
  3216. {
  3217. var pallectMachs = palletMach.Where(p => p.Layer == 2);
  3218. foreach (var pallets in pallectMachs)
  3219. {
  3220. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3221. if (cell == null)
  3222. {
  3223. continue;
  3224. }
  3225. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3226. if (invs == null)
  3227. {
  3228. continue;
  3229. }
  3230. var root = "";
  3231. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3232. {
  3233. root = "Robot1";
  3234. }
  3235. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3236. {
  3237. root = "Robot2";
  3238. }
  3239. //先判断二升位是否能出库
  3240. if (cell.Depth == 2)
  3241. {
  3242. var respon = MoveTask(cell.Code);
  3243. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3244. {
  3245. continue;
  3246. }
  3247. }
  3248. PalletizingPackTask(new PalletizingPackTaskRequest()
  3249. {
  3250. Code = pallets.ContBarCode,
  3251. CellCode = cell.Code,
  3252. Srm = cell.SCRel,
  3253. Tunnel = cell.Tunnel.ToString(),
  3254. Floor = cell.Floor,
  3255. Grade = invs.Grade,
  3256. Mater = invs.MatCode,
  3257. SkuCode = invs.SkuCode,
  3258. PalletLayer = pallets.Layer,
  3259. ProductMachCode = invs.ProductMachCode,
  3260. Equip = item.Equip,
  3261. PalletizingId = item.Id,
  3262. Robot = root,
  3263. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3264. });
  3265. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3266. {
  3267. Istask = 1
  3268. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3269. }
  3270. return res;
  3271. }
  3272. else if (palletMach.Where(p => p.Layer == 3).Any())
  3273. {
  3274. var pallectMachs = palletMach.Where(p => p.Layer == 3);
  3275. foreach (var pallets in pallectMachs)
  3276. {
  3277. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3278. if (cell == null)
  3279. {
  3280. continue;
  3281. }
  3282. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3283. if (invs == null)
  3284. {
  3285. continue;
  3286. }
  3287. var root = "";
  3288. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3289. {
  3290. root = "Robot1";
  3291. }
  3292. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3293. {
  3294. root = "Robot2";
  3295. }
  3296. //先判断二升位是否能出库
  3297. if (cell.Depth == 2)
  3298. {
  3299. var respon = MoveTask(cell.Code);
  3300. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3301. {
  3302. continue;
  3303. }
  3304. }
  3305. PalletizingPackTask(new PalletizingPackTaskRequest()
  3306. {
  3307. Code = pallets.ContBarCode,
  3308. CellCode = cell.Code,
  3309. Srm = cell.SCRel,
  3310. Tunnel = cell.Tunnel.ToString(),
  3311. Floor = cell.Floor,
  3312. Grade = invs.Grade,
  3313. Mater = invs.MatCode,
  3314. SkuCode = invs.SkuCode,
  3315. PalletLayer = pallets.Layer,
  3316. ProductMachCode = invs.ProductMachCode,
  3317. Equip = item.Equip,
  3318. PalletizingId = item.Id,
  3319. Robot = root,
  3320. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3321. });
  3322. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3323. {
  3324. Istask = 1
  3325. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3326. }
  3327. return res;
  3328. }
  3329. else if (palletMach.Where(p => p.Layer == 4).Any())
  3330. {
  3331. var pallectMachs = palletMach.Where(p => p.Layer == 4);
  3332. foreach (var pallets in pallectMachs)
  3333. {
  3334. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3335. if (cell == null)
  3336. {
  3337. continue;
  3338. }
  3339. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3340. if (invs == null)
  3341. {
  3342. continue;
  3343. }
  3344. var root = "";
  3345. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3346. {
  3347. root = "Robot1";
  3348. }
  3349. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3350. {
  3351. root = "Robot2";
  3352. }
  3353. //先判断二升位是否能出库
  3354. if (cell.Depth == 2)
  3355. {
  3356. var respon = MoveTask(cell.Code);
  3357. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3358. {
  3359. continue;
  3360. }
  3361. }
  3362. PalletizingPackTask(new PalletizingPackTaskRequest()
  3363. {
  3364. Code = pallets.ContBarCode,
  3365. CellCode = cell.Code,
  3366. Srm = cell.SCRel,
  3367. Tunnel = cell.Tunnel.ToString(),
  3368. Floor = cell.Floor,
  3369. Grade = invs.Grade,
  3370. Mater = invs.MatCode,
  3371. SkuCode = invs.SkuCode,
  3372. PalletLayer = pallets.Layer,
  3373. ProductMachCode = invs.ProductMachCode,
  3374. Equip = item.Equip,
  3375. PalletizingId = item.Id,
  3376. Robot = root,
  3377. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3378. });
  3379. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3380. {
  3381. Istask = 1
  3382. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3383. }
  3384. return res;
  3385. }
  3386. else if (palletMach.Where(p => p.Layer == 5).Any())
  3387. {
  3388. var pallectMachs = palletMach.Where(p => p.Layer == 5);
  3389. foreach (var pallets in pallectMachs)
  3390. {
  3391. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3392. if (cell == null)
  3393. {
  3394. continue;
  3395. }
  3396. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3397. if (invs == null)
  3398. {
  3399. continue;
  3400. }
  3401. var root = "";
  3402. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3403. {
  3404. root = "Robot1";
  3405. }
  3406. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3407. {
  3408. root = "Robot2";
  3409. }
  3410. //先判断二升位是否能出库
  3411. if (cell.Depth == 2)
  3412. {
  3413. var respon = MoveTask(cell.Code);
  3414. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3415. {
  3416. continue;
  3417. }
  3418. }
  3419. PalletizingPackTask(new PalletizingPackTaskRequest()
  3420. {
  3421. Code = pallets.ContBarCode,
  3422. CellCode = cell.Code,
  3423. Srm = cell.SCRel,
  3424. Tunnel = cell.Tunnel.ToString(),
  3425. Floor = cell.Floor,
  3426. Grade = invs.Grade,
  3427. Mater = invs.MatCode,
  3428. SkuCode = invs.SkuCode,
  3429. PalletLayer = pallets.Layer,
  3430. ProductMachCode = invs.ProductMachCode,
  3431. Equip = item.Equip,
  3432. PalletizingId = item.Id,
  3433. Robot = root,
  3434. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3435. });
  3436. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3437. {
  3438. Istask = 1
  3439. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3440. }
  3441. return res;
  3442. }
  3443. else if (palletMach.Where(p => p.Layer == 6).Any())
  3444. {
  3445. var pallectMachs = palletMach.Where(p => p.Layer == 6);
  3446. foreach (var pallets in pallectMachs)
  3447. {
  3448. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3449. if (cell == null)
  3450. {
  3451. continue;
  3452. }
  3453. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3454. if (invs == null)
  3455. {
  3456. continue;
  3457. }
  3458. var root = "";
  3459. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  3460. {
  3461. root = "Robot1";
  3462. }
  3463. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  3464. {
  3465. root = "Robot2";
  3466. }
  3467. //先判断二升位是否能出库
  3468. if (cell.Depth == 2)
  3469. {
  3470. var respon = MoveTask(cell.Code);
  3471. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3472. {
  3473. continue;
  3474. }
  3475. }
  3476. PalletizingPackTask(new PalletizingPackTaskRequest()
  3477. {
  3478. Code = pallets.ContBarCode,
  3479. CellCode = cell.Code,
  3480. Srm = cell.SCRel,
  3481. Tunnel = cell.Tunnel.ToString(),
  3482. Floor = cell.Floor,
  3483. Grade = invs.Grade,
  3484. Mater = invs.MatCode,
  3485. SkuCode = invs.SkuCode,
  3486. PalletLayer = pallets.Layer,
  3487. ProductMachCode = invs.ProductMachCode,
  3488. Equip = item.Equip,
  3489. PalletizingId = item.Id,
  3490. Robot = root,
  3491. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3492. });
  3493. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3494. {
  3495. Istask = 1
  3496. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3497. }
  3498. return res;
  3499. }
  3500. #endregion
  3501. }
  3502. }
  3503. //取视图码垛设备号
  3504. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  3505. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  3506. {
  3507. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3508. res.ResMsg = "没有空闲的码垛工位";
  3509. return res;
  3510. }
  3511. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  3512. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  3513. if (!devices.Where(p => p.pH_STATUS == true).Any())
  3514. {
  3515. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3516. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  3517. return res;
  3518. }
  3519. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  3520. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  3521. 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)
  3522. && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.TorsChkValueIsGood == "OK" && p.ContUsageQty <= 0)
  3523. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  3524. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "层配")
  3525. on stock.InDocsNo equals rule1.DocsNo
  3526. select new
  3527. {
  3528. stock.MatCode,
  3529. stock.InvBarCode,
  3530. stock.Grade,
  3531. stock.InvStateCode,
  3532. stock.ProductTime,
  3533. stock.WbGroupCode,
  3534. stock.IsTorsChk,
  3535. stock.TorsChkQty,
  3536. stock.TorsChkValue,
  3537. stock.HoldTime,
  3538. stock.ProductMachCode,
  3539. stock.IsRework,
  3540. stock.IsBlack,
  3541. stock.SolderCount,
  3542. stock.HWTypeCode,
  3543. stock.TorsChkChord,
  3544. stock.TorsChkFlatness,
  3545. loc.Col,
  3546. loc.Layer,
  3547. loc.Shelf,
  3548. loc.Depth,
  3549. loc.Code,
  3550. loc.Tunnel,
  3551. loc.SCRel,
  3552. loc.Floor,
  3553. loc.WarehouseCode,
  3554. loc.ContGrpBarCode,
  3555. loc.ContGrpId,
  3556. loc.Id,
  3557. loc.StateNum,
  3558. rule1.SkuCode
  3559. };
  3560. if (!invlist.Any())
  3561. {
  3562. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3563. res.ResMsg = "库存不足";
  3564. return res;
  3565. }
  3566. invlist = invlist.Distinct();
  3567. var invlist2 = invlist;
  3568. var sku = invlist.GroupBy(p => p.SkuCode).ToList();
  3569. if (!sku.Any())
  3570. {
  3571. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3572. res.ResMsg = "库中没有SKU或SKU不能为空";
  3573. return res;
  3574. }
  3575. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "层配");
  3576. if (!rulelist.Any())
  3577. {
  3578. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  3579. res.ResMsg = "层配装箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  3580. return res;
  3581. }
  3582. foreach (var item in sku)
  3583. {
  3584. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.ZXStateCode == 0 && p.PackRule == "层配").OrderBy(p => p.AddTime);
  3585. if (!rules.Any())
  3586. {
  3587. continue;
  3588. }
  3589. foreach (var rule in rules)
  3590. {
  3591. var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  3592. if (!syslist.Any())
  3593. {
  3594. //_logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  3595. continue;
  3596. }
  3597. var dev = devices.Where(p => syslist.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  3598. if (!dev.Any())
  3599. {
  3600. //_logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  3601. continue;
  3602. }
  3603. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).GroupBy(p => p.WbGroupCode);
  3604. if (!wbgrouplist.Any())
  3605. {
  3606. continue;
  3607. }
  3608. foreach (var wbgroup in wbgrouplist)
  3609. {
  3610. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType);
  3611. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  3612. {
  3613. break;
  3614. }
  3615. }
  3616. //焊点、返工盘、黑盘一些基本属性筛选
  3617. if (!string.IsNullOrEmpty(rule.SpoolType))
  3618. {
  3619. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  3620. }
  3621. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  3622. {
  3623. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  3624. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  3625. }
  3626. else
  3627. {
  3628. //不允许焊点盘
  3629. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  3630. }
  3631. if (rule.ReturnCount > 0)
  3632. {
  3633. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  3634. invlist2 = tt.Union(invlist2);
  3635. }
  3636. else
  3637. {
  3638. invlist2 = invlist2.Where(p => p.IsRework == false);
  3639. }
  3640. //黑盘
  3641. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  3642. {
  3643. rule.BlackCount = 3;
  3644. }
  3645. else
  3646. {
  3647. rule.BlackCount = 1;
  3648. }
  3649. if (rule.BlackCount > 0)
  3650. {
  3651. var tt = invlist2.Where(p => p.IsBlack == true).Take(rule.BlackCount);
  3652. invlist2 = tt.Union(invlist2);
  3653. }
  3654. else
  3655. {
  3656. invlist2 = invlist2.Where(p => p.IsBlack == false);
  3657. }
  3658. if (!invlist2.Any())
  3659. {
  3660. continue;
  3661. }
  3662. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1)).OrderBy(p => p.EditTime).First();
  3663. //码垛信息校验
  3664. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  3665. {
  3666. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3667. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  3668. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  3669. return res;
  3670. }
  3671. //if (invlist2.Count() < rule.FullCountQty)
  3672. //{
  3673. // continue;
  3674. //}
  3675. if (invlist2.Where(p => p.HoldTime == rule.HoldTime).Count() >= rule.FullCountQty)
  3676. {
  3677. int layer = rule.FullCountQty / 12;
  3678. int num = 12;
  3679. #region 计算扭转层工字轮
  3680. for (int i = 0; i < layer; i++)
  3681. {
  3682. #region 计算扭转
  3683. if (rule.HoldTime == 24)
  3684. {
  3685. var torslist = invlist2.OrderBy(p => p.ProductTime).ToList().GetRange(0, num);
  3686. if (Math.Abs((decimal)(rule.Torsion24Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3687. {
  3688. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3689. #region 记录码垛的每层工字轮明细
  3690. foreach (var palletla in torslist)
  3691. {
  3692. var palletlayer = new PalletLayerMath()
  3693. {
  3694. ContGrpId = (long)palletla.ContGrpId,
  3695. ContBarCode = palletla.ContGrpBarCode,
  3696. Layer = i + 1,
  3697. SkuCode = palletla.SkuCode,
  3698. Finish = 0,
  3699. PboxruleId = rule.Id,
  3700. Istask = 0,
  3701. Palletequip = palletequip.Code
  3702. };
  3703. _palletlayerMathrepository.Insert(palletlayer);
  3704. }
  3705. #endregion
  3706. invlist2 = invlist2.Except(torslist);
  3707. }
  3708. else
  3709. {
  3710. //记下头尾元素
  3711. var start = torslist.First();
  3712. var end = torslist.Last();
  3713. List<string> code = new List<string>() { start.ContGrpBarCode, end.ContGrpBarCode };
  3714. //去掉头尾
  3715. torslist = torslist.Skip(1).Take(torslist.Count - 2).ToList();
  3716. //追加两个筹齐12个重新计算
  3717. torslist.AddRange(invlist2.Where(p => !code.Contains(p.ContGrpBarCode)).OrderBy(p => p.ProductTime).Take(2));
  3718. if (Math.Abs((decimal)(rule.Torsion24Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3719. {
  3720. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3721. #region 记录码垛的每层工字轮明细
  3722. foreach (var palletla in torslist)
  3723. {
  3724. var palletlayer = new PalletLayerMath()
  3725. {
  3726. ContGrpId = (long)palletla.ContGrpId,
  3727. ContBarCode = palletla.ContGrpBarCode,
  3728. Layer = i + 1,
  3729. SkuCode = palletla.SkuCode,
  3730. Finish = 0,
  3731. PboxruleId = rule.Id,
  3732. Istask = 0,
  3733. Palletequip = palletequip.Code
  3734. };
  3735. _palletlayerMathrepository.Insert(palletlayer);
  3736. }
  3737. #endregion
  3738. invlist2 = invlist2.Except(torslist);
  3739. }
  3740. }
  3741. }
  3742. else if (rule.HoldTime == 48)
  3743. {
  3744. var torslist = invlist2.OrderBy(p => p.ProductTime).ToList().GetRange(0, num);
  3745. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3746. {
  3747. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3748. #region 记录码垛的每层工字轮明细
  3749. foreach (var palletla in torslist)
  3750. {
  3751. var palletlayer = new PalletLayerMath()
  3752. {
  3753. ContGrpId = (long)palletla.ContGrpId,
  3754. ContBarCode = palletla.ContGrpBarCode,
  3755. Layer = i + 1,
  3756. SkuCode = palletla.SkuCode,
  3757. Finish = 0,
  3758. PboxruleId = rule.Id,
  3759. Istask = 0,
  3760. Palletequip = palletequip.Code
  3761. };
  3762. _palletlayerMathrepository.Insert(palletlayer);
  3763. }
  3764. #endregion
  3765. invlist2 = invlist2.Except(torslist);
  3766. }
  3767. else
  3768. {
  3769. //记下头尾元素
  3770. var start = torslist.First();
  3771. var end = torslist.Last();
  3772. List<string> code = new List<string>() { start.ContGrpBarCode, end.ContGrpBarCode };
  3773. //去掉头尾
  3774. torslist = torslist.Skip(1).Take(torslist.Count - 2).ToList();
  3775. //追加两个筹齐12个重新计算
  3776. torslist.AddRange(invlist2.Where(p => !code.Contains(p.ContGrpBarCode)).OrderBy(p => p.ProductTime).Take(2));
  3777. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3778. {
  3779. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3780. #region 记录码垛的每层工字轮明细
  3781. foreach (var palletla in torslist)
  3782. {
  3783. var palletlayer = new PalletLayerMath()
  3784. {
  3785. ContGrpId = (long)palletla.ContGrpId,
  3786. ContBarCode = palletla.ContGrpBarCode,
  3787. Layer = i + 1,
  3788. SkuCode = palletla.SkuCode,
  3789. Finish = 0,
  3790. PboxruleId = rule.Id,
  3791. Istask = 0,
  3792. Palletequip = palletequip.Code
  3793. };
  3794. _palletlayerMathrepository.Insert(palletlayer);
  3795. }
  3796. #endregion
  3797. invlist2 = invlist2.Except(torslist);
  3798. }
  3799. }
  3800. }
  3801. else if (rule.HoldTime == 72)
  3802. {
  3803. }
  3804. #endregion
  3805. }
  3806. #endregion
  3807. var palletCodelist = _palletlayerMathrepository.GetList(p => p.PboxruleId == rule.Id);
  3808. if (!palletCodelist.Any())
  3809. {
  3810. continue;
  3811. }
  3812. if (palletCodelist.Count != rule.FullCountQty)
  3813. {
  3814. _palletlayerMathrepository.Delete(p => p.PboxruleId == rule.Id);
  3815. continue;
  3816. }
  3817. var palletCode = palletCodelist.OrderBy(p => p.Layer).Take(12);
  3818. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  3819. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  3820. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  3821. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3822. {
  3823. res.ResCode = trayres.ResCode;
  3824. res.ResMsg = trayres.ResMsg;
  3825. return res;
  3826. }
  3827. var pallet = new Palletizing()
  3828. {
  3829. PalletMax = rule.FullCountQty,
  3830. PalletizState = 0,
  3831. Equip = palletequip.Code,
  3832. Finish = 0,
  3833. AddWho = "",
  3834. EditWho = "",
  3835. BoxRule = rule.PackRule,
  3836. BoxRuleId = rule.Id,
  3837. IsControlpanel = true,
  3838. TaskNum = int.Parse(trayres.Memo1),
  3839. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3840. };
  3841. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  3842. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  3843. {
  3844. ZXStateCode = 1
  3845. }, p => p.Id == rule.Id);
  3846. foreach (var code in palletCode)
  3847. {
  3848. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  3849. if (cell == null)
  3850. {
  3851. continue;
  3852. }
  3853. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3854. if (invs == null)
  3855. {
  3856. continue;
  3857. }
  3858. var inv = invlist2.Where(p => p.ContGrpBarCode == code.ContBarCode && p.ContGrpId == code.ContGrpId).First();
  3859. var root = "";
  3860. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  3861. {
  3862. root = "Robot1";
  3863. }
  3864. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  3865. {
  3866. root = "Robot2";
  3867. }
  3868. //先判断二升位是否能出库
  3869. if (cell.Depth == 2)
  3870. {
  3871. var respon = MoveTask(cell.Code);
  3872. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3873. {
  3874. continue;
  3875. }
  3876. }
  3877. PalletizingPackTask(new PalletizingPackTaskRequest()
  3878. {
  3879. Code = code.ContBarCode,
  3880. Equip = pallects.Equip,
  3881. Mater = inv.MatCode,
  3882. Srm = inv.SCRel,
  3883. PalletLayer = code.Layer,
  3884. Grade = inv.Grade,
  3885. Tunnel = inv.Tunnel.ToString(),
  3886. CellCode = inv.Code,
  3887. SkuCode = rule.SkuCode,
  3888. ProductMachCode = inv.ProductMachCode,
  3889. Floor = inv.Floor,
  3890. PalletizingId = pallects.Id,
  3891. Robot = root,
  3892. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3893. });
  3894. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3895. {
  3896. Istask = 1
  3897. }, p => p.ContBarCode == code.ContBarCode);
  3898. }
  3899. return res;
  3900. }
  3901. }
  3902. }
  3903. return res;
  3904. }
  3905. /// <summary>
  3906. /// 码垛SPC非控制装箱(缓存托盘)
  3907. /// </summary>
  3908. /// <param name="request"></param>
  3909. /// <returns></returns>
  3910. public SRes PalletizingSpcNotPackStockOut2(PalletizingPackStockOutRequest request)
  3911. {
  3912. var res = new SRes();
  3913. var timesign = IdFactory.NewId();
  3914. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  3915. if (palletlist.Any())
  3916. {
  3917. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  3918. if (maxtaskStemp.Any())
  3919. {
  3920. var maxtaskcount = (from tas in maxtaskStemp
  3921. select new TunnelCountTemp()
  3922. {
  3923. Tunnel = tas.Key,
  3924. Count = tas.Count()
  3925. }).ToList();
  3926. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  3927. }
  3928. //箱之间状态卡控限制标识
  3929. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  3930. //某个机械手最大下发的限制状态任务数量
  3931. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  3932. foreach (var item in palletlist)
  3933. {
  3934. //判断任务数量
  3935. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  3936. {
  3937. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  3938. continue;
  3939. }
  3940. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  3941. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  3942. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  3943. {
  3944. //判断是不是第3箱
  3945. //判断是否是第三箱
  3946. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  3947. {
  3948. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  3949. if (item.Id == thirdbox)//第3箱子
  3950. {
  3951. 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())
  3952. {
  3953. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  3954. continue;
  3955. }
  3956. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  3957. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  3958. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  3959. {
  3960. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  3961. continue;
  3962. }
  3963. }
  3964. else if (item.Id > thirdbox)
  3965. {
  3966. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  3967. continue;
  3968. }
  3969. }
  3970. //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())
  3971. //{
  3972. // _logger.LogInformation("同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  3973. // continue;
  3974. //}
  3975. }
  3976. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  3977. if (equips == null)
  3978. {
  3979. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  3980. continue;
  3981. }
  3982. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  3983. if (!palletMach.Any())
  3984. {
  3985. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  3986. continue;
  3987. }
  3988. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  3989. var curdocid = maxdocid + 1;
  3990. if (palletMach.Any())
  3991. {
  3992. var pid = palletMach.First().PalletizingId;
  3993. 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)
  3994. {
  3995. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  3996. }
  3997. }
  3998. foreach (var pallets in palletMach)
  3999. {
  4000. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4001. if (cell == null)
  4002. {
  4003. continue;
  4004. }
  4005. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4006. if (invs == null)
  4007. {
  4008. continue;
  4009. }
  4010. var root = "";
  4011. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4012. {
  4013. root = "Robot1";
  4014. }
  4015. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4016. {
  4017. root = "Robot2";
  4018. }
  4019. //先判断二升位是否能出库
  4020. if (cell.Depth == 2)
  4021. {
  4022. var respon = MoveTask(cell.Code);
  4023. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4024. {
  4025. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4026. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4027. continue;
  4028. }
  4029. }
  4030. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4031. {
  4032. Code = pallets.ContBarCode,
  4033. CellCode = cell.Code,
  4034. Srm = cell.SCRel,
  4035. Tunnel = cell.Tunnel.ToString(),
  4036. Floor = cell.Floor,
  4037. Grade = invs.Grade,
  4038. Mater = invs.MatCode,
  4039. SkuCode = pallets.SkuCode,
  4040. PalletLayer = 0,
  4041. ProductMachCode = invs.ProductMachCode,
  4042. Equip = item.Equip,
  4043. PalletizingId = item.Id,
  4044. Robot = root,
  4045. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4046. DocId = curdocid
  4047. });
  4048. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4049. {
  4050. continue;
  4051. }
  4052. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4053. {
  4054. Istask = 1,
  4055. Layer = 0
  4056. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4057. }
  4058. //下完任务后将标识值加1
  4059. 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);
  4060. taskflag = taskflag + 1;
  4061. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4062. #region 分层下任务暂时不用
  4063. //var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  4064. //var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  4065. //if (tasklayer != 12 && tasklayer < 12)
  4066. //{
  4067. // palletMach = palletMach.Take(12 - tasklayer);
  4068. // foreach (var pallets in palletMach)
  4069. // {
  4070. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4071. // if (cell == null)
  4072. // {
  4073. // continue;
  4074. // }
  4075. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4076. // if (invs == null)
  4077. // {
  4078. // continue;
  4079. // }
  4080. // var root = "";
  4081. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4082. // {
  4083. // root = "Robot1";
  4084. // }
  4085. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4086. // {
  4087. // root = "Robot2";
  4088. // }
  4089. // //先判断二升位是否能出库
  4090. // if (cell.Depth == 2)
  4091. // {
  4092. // var respon = MoveTask(cell.Code);
  4093. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4094. // {
  4095. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4096. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4097. // continue;
  4098. // }
  4099. // }
  4100. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4101. // {
  4102. // Code = pallets.ContBarCode,
  4103. // CellCode = cell.Code,
  4104. // Srm = cell.SCRel,
  4105. // Tunnel = cell.Tunnel.ToString(),
  4106. // Floor = cell.Floor,
  4107. // Grade = invs.Grade,
  4108. // Mater = invs.MatCode,
  4109. // SkuCode = pallets.SkuCode,
  4110. // PalletLayer = curlayer,
  4111. // ProductMachCode = invs.ProductMachCode,
  4112. // Equip = item.Equip,
  4113. // PalletizingId = item.Id,
  4114. // Robot = root,
  4115. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  4116. // });
  4117. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4118. // {
  4119. // continue;
  4120. // }
  4121. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4122. // {
  4123. // Istask = 1,
  4124. // Layer = curlayer
  4125. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  4126. // }
  4127. // //return res;
  4128. //}
  4129. //else
  4130. //{
  4131. // foreach (var pallets in palletMach)
  4132. // {
  4133. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4134. // if (cell == null)
  4135. // {
  4136. // continue;
  4137. // }
  4138. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4139. // if (invs == null)
  4140. // {
  4141. // continue;
  4142. // }
  4143. // var root = "";
  4144. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4145. // {
  4146. // root = "Robot1";
  4147. // }
  4148. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4149. // {
  4150. // root = "Robot2";
  4151. // }
  4152. // //先判断二升位是否能出库
  4153. // if (cell.Depth == 2)
  4154. // {
  4155. // var respon = MoveTask(cell.Code);
  4156. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4157. // {
  4158. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4159. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4160. // continue;
  4161. // }
  4162. // }
  4163. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4164. // {
  4165. // Code = pallets.ContBarCode,
  4166. // CellCode = cell.Code,
  4167. // Srm = cell.SCRel,
  4168. // Tunnel = cell.Tunnel.ToString(),
  4169. // Floor = cell.Floor,
  4170. // Grade = invs.Grade,
  4171. // Mater = invs.MatCode,
  4172. // SkuCode = pallets.SkuCode,
  4173. // PalletLayer = curlayer + 1,
  4174. // ProductMachCode = invs.ProductMachCode,
  4175. // Equip = item.Equip,
  4176. // PalletizingId = item.Id,
  4177. // Robot = root,
  4178. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  4179. // });
  4180. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4181. // {
  4182. // continue;
  4183. // }
  4184. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4185. // {
  4186. // Istask = 1,
  4187. // Layer = curlayer + 1
  4188. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  4189. // }
  4190. // //return res;
  4191. //}
  4192. #endregion
  4193. }
  4194. }
  4195. //待码垛箱任务下发
  4196. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  4197. if (palletlisttobe.Any())
  4198. {
  4199. foreach (var item in palletlisttobe.OrderBy(p=>p.Id))
  4200. {
  4201. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  4202. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  4203. {
  4204. _palletizrepository.AsUpdateable()
  4205. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4206. .Where(p => p.Id == item.Id)
  4207. .ExecuteCommand();
  4208. }
  4209. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  4210. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  4211. {
  4212. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  4213. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  4214. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  4215. {
  4216. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  4217. continue;
  4218. }
  4219. //箱之间状态卡控限制标识
  4220. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  4221. //判断任务数量
  4222. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  4223. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  4224. {
  4225. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  4226. continue;
  4227. }
  4228. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  4229. 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()
  4230. {
  4231. //判断是否是第三箱
  4232. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  4233. {
  4234. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  4235. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  4236. if (item.Id == thirdbox)//第3箱子
  4237. {
  4238. 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())
  4239. {
  4240. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4241. continue;
  4242. }
  4243. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  4244. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  4245. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  4246. {
  4247. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  4248. continue;
  4249. }
  4250. }
  4251. else if (item.Id > thirdbox)
  4252. {
  4253. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  4254. continue;
  4255. }
  4256. }
  4257. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  4258. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  4259. {
  4260. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  4261. if (!palletMach.Any())
  4262. {
  4263. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  4264. continue;
  4265. }
  4266. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  4267. var curdocid = maxdocid + 1;
  4268. if (palletMach.Any())
  4269. {
  4270. var pid = palletMach.First().PalletizingId;
  4271. 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)
  4272. {
  4273. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  4274. }
  4275. }
  4276. foreach (var pallets in palletMach)
  4277. {
  4278. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4279. if (cell == null)
  4280. {
  4281. continue;
  4282. }
  4283. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4284. if (invs == null)
  4285. {
  4286. continue;
  4287. }
  4288. var root = "";
  4289. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  4290. {
  4291. root = "Robot1";
  4292. }
  4293. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  4294. {
  4295. root = "Robot2";
  4296. }
  4297. //先判断二升位是否能出库
  4298. if (cell.Depth == 2)
  4299. {
  4300. var respon = MoveTask(cell.Code);
  4301. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4302. {
  4303. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4304. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4305. continue;
  4306. }
  4307. }
  4308. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4309. {
  4310. Code = pallets.ContBarCode,
  4311. CellCode = cell.Code,
  4312. Srm = cell.SCRel,
  4313. Tunnel = cell.Tunnel.ToString(),
  4314. Floor = cell.Floor,
  4315. Grade = invs.Grade,
  4316. Mater = invs.MatCode,
  4317. SkuCode = pallets.SkuCode,
  4318. PalletLayer = 0,
  4319. ProductMachCode = invs.ProductMachCode,
  4320. Equip = item.Equip,
  4321. PalletizingId = item.Id,
  4322. Robot = root,
  4323. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4324. DocId = curdocid
  4325. });
  4326. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4327. {
  4328. continue;
  4329. }
  4330. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4331. {
  4332. Istask = 1,
  4333. Layer = 0
  4334. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4335. }
  4336. //下完任务后将标识值加1
  4337. 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);
  4338. taskflag = taskflag + 1;
  4339. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4340. }
  4341. }
  4342. }
  4343. else
  4344. {
  4345. _palletizrepository.AsUpdateable()
  4346. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4347. .Where(p => p.Id == item.Id)
  4348. .ExecuteCommand();
  4349. }
  4350. }
  4351. }
  4352. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  4353. var iscontinue = false;
  4354. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  4355. {
  4356. if (string.IsNullOrEmpty(palletequip.Default1))
  4357. {
  4358. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  4359. {
  4360. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4361. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4362. if (preinvlist.Any())
  4363. {
  4364. //机械手交叉下任务需求
  4365. //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)
  4366. //{
  4367. // 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();
  4368. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4369. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4370. // {
  4371. // }
  4372. // else
  4373. // {
  4374. // iscontinue = false;
  4375. // continue;
  4376. // }
  4377. //}
  4378. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4379. 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)
  4380. {
  4381. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4382. 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();
  4383. if (minequ != null)
  4384. {
  4385. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4386. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4387. {
  4388. }
  4389. else
  4390. {
  4391. iscontinue = false;
  4392. continue;
  4393. }
  4394. }
  4395. }
  4396. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4397. {
  4398. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4399. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4400. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4401. return res;
  4402. }
  4403. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4404. //码垛信息校验
  4405. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  4406. {
  4407. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4408. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  4409. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  4410. return res;
  4411. }
  4412. var root = "";
  4413. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  4414. {
  4415. root = "Robot1";
  4416. }
  4417. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  4418. {
  4419. root = "Robot2";
  4420. }
  4421. var pallet = new Palletizing()
  4422. {
  4423. PalletMax = rule.FullCountQty,
  4424. PalletizState = 0,
  4425. Equip = palletequip.Code,
  4426. Finish = 0,
  4427. AddWho = "",
  4428. EditWho = "",
  4429. BoxRule = rule.PackRule,
  4430. BoxRuleId = rule.Id,
  4431. IsControlpanel = false,
  4432. TaskNum = int.Parse(palletequip.Default3),
  4433. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4434. Robot = root
  4435. };
  4436. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4437. if (pallects.Id == 0)
  4438. {
  4439. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4440. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4441. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4442. return res;
  4443. }
  4444. var palletizId = pallects.Id;
  4445. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4446. {
  4447. ZXStateCode = 1
  4448. }, p => p.Id == rule.Id);
  4449. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4450. foreach (var invs in preinvlist)
  4451. {
  4452. var palletlayer = new PalletLayerMath()
  4453. {
  4454. PalletizingId = palletizId,
  4455. ContGrpId = (long)invs.ContGrpId,
  4456. ContBarCode = invs.ContGrpBarCode,
  4457. Layer = 0,
  4458. SkuCode = rule.SkuCode,
  4459. Finish = 0,
  4460. PboxruleId = rule.Id,
  4461. Istask = 0,
  4462. Palletequip = palletequip.Code,
  4463. Depth = invs.Depth,
  4464. IsBlack = invs.IsBlack,
  4465. SolderCount = invs.SolderCount,
  4466. BoxCode = rule.PBoxCode,
  4467. Wbgroup = invs.WbGroupCode,
  4468. StockDonse = invs.InDocsNo,
  4469. BoxDonse = rule.DocsNo
  4470. };
  4471. math.Add(palletlayer);
  4472. }
  4473. _palletlayerMathrepository.InsertRange(math);
  4474. //把库存预锁标志更新掉
  4475. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4476. {
  4477. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4478. BomMatCode = "",
  4479. PreStock = "1"
  4480. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4481. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4482. res.ResMsg = "非控制捞取预锁库存处理成功";
  4483. return res;
  4484. }
  4485. else
  4486. {
  4487. iscontinue = false;
  4488. continue;
  4489. }
  4490. }
  4491. if (string.IsNullOrEmpty(palletequip.Cache1State))
  4492. {
  4493. iscontinue = true;
  4494. break;
  4495. }
  4496. else
  4497. {
  4498. iscontinue = false;
  4499. continue;
  4500. }
  4501. }
  4502. else
  4503. {
  4504. if (!string.IsNullOrEmpty(palletequip.Default3))
  4505. {
  4506. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4507. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4508. if (preinvlist.Any())
  4509. {
  4510. //机械手交叉下任务需求
  4511. //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)
  4512. //{
  4513. // 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();
  4514. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4515. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4516. // {
  4517. // }
  4518. // else
  4519. // {
  4520. // iscontinue = false;
  4521. // continue;
  4522. // }
  4523. //}
  4524. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4525. 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)
  4526. {
  4527. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4528. 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();
  4529. if (minequ != null)
  4530. {
  4531. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4532. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4533. {
  4534. }
  4535. else
  4536. {
  4537. iscontinue = false;
  4538. continue;
  4539. }
  4540. }
  4541. }
  4542. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4543. {
  4544. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4545. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4546. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4547. return res;
  4548. }
  4549. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4550. //码垛信息校验
  4551. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  4552. {
  4553. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4554. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  4555. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  4556. return res;
  4557. }
  4558. var root = "";
  4559. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  4560. {
  4561. root = "Robot1";
  4562. }
  4563. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  4564. {
  4565. root = "Robot2";
  4566. }
  4567. var pallet = new Palletizing()
  4568. {
  4569. PalletMax = rule.FullCountQty,
  4570. PalletizState = 2,
  4571. Equip = palletequip.Code,
  4572. Finish = 0,
  4573. AddWho = "",
  4574. EditWho = "",
  4575. BoxRule = rule.PackRule,
  4576. BoxRuleId = rule.Id,
  4577. IsControlpanel = false,
  4578. TaskNum = int.Parse(palletequip.Default3),
  4579. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4580. Robot = root
  4581. };
  4582. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4583. if (pallects.Id == 0)
  4584. {
  4585. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4586. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4587. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4588. return res;
  4589. }
  4590. var palletizId = pallects.Id;
  4591. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4592. {
  4593. ZXStateCode = 1
  4594. }, p => p.Id == rule.Id);
  4595. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4596. foreach (var invs in preinvlist)
  4597. {
  4598. var palletlayer = new PalletLayerMath()
  4599. {
  4600. PalletizingId = palletizId,
  4601. ContGrpId = (long)invs.ContGrpId,
  4602. ContBarCode = invs.ContGrpBarCode,
  4603. Layer = 0,
  4604. SkuCode = rule.SkuCode,
  4605. Finish = 0,
  4606. PboxruleId = rule.Id,
  4607. Istask = 0,
  4608. Palletequip = palletequip.Code,
  4609. Depth = invs.Depth,
  4610. IsBlack = invs.IsBlack,
  4611. SolderCount = invs.SolderCount,
  4612. BoxCode = rule.PBoxCode,
  4613. Wbgroup = invs.WbGroupCode,
  4614. StockDonse = invs.InDocsNo,
  4615. BoxDonse = rule.DocsNo
  4616. };
  4617. math.Add(palletlayer);
  4618. }
  4619. _palletlayerMathrepository.InsertRange(math);
  4620. //把库存预锁标志更新掉
  4621. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4622. {
  4623. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4624. BomMatCode = "",
  4625. PreStock = "1"
  4626. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4627. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4628. res.ResMsg = "非控制捞取预锁库存处理成功";
  4629. return res;
  4630. }
  4631. else
  4632. {
  4633. iscontinue = false;
  4634. continue;
  4635. }
  4636. }
  4637. else
  4638. {
  4639. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  4640. {
  4641. iscontinue = true;
  4642. break;
  4643. }
  4644. else
  4645. {
  4646. iscontinue = false;
  4647. continue;
  4648. }
  4649. }
  4650. }
  4651. }
  4652. if (!iscontinue)
  4653. {
  4654. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  4655. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  4656. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  4657. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  4658. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  4659. {
  4660. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4661. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4662. res.ResMsg = "没有空闲的码垛工位";
  4663. return res;
  4664. }
  4665. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  4666. {
  4667. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4668. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4669. res.ResMsg = "没有空闲的码垛工位";
  4670. return res;
  4671. }
  4672. }
  4673. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  4674. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  4675. if (!devices.Where(p => p.pH_STATUS == true).Any())
  4676. {
  4677. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  4678. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4679. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  4680. return res;
  4681. }
  4682. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  4683. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  4684. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  4685. 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
  4686. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  4687. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  4688. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  4689. on stock.InDocsNo equals rule1.DocsNo
  4690. select new StockTemp
  4691. {
  4692. MatCode = stock.MatCode,
  4693. InvBarCode = stock.InvBarCode,
  4694. Grade = stock.Grade,
  4695. InvStateCode = stock.InvStateCode,
  4696. ProductTime = stock.ProductTime,
  4697. WbGroupCode = stock.WbGroupCode,
  4698. IsTorsChk = stock.IsTorsChk,
  4699. TorsChkQty = stock.TorsChkQty,
  4700. TorsChkValue = stock.TorsChkValue,
  4701. HoldTime = stock.HoldTime,
  4702. ProductMachCode = stock.ProductMachCode,
  4703. IsControlpanel = stock.IsControlpanel,
  4704. HWTypeCode = stock.HWTypeCode,
  4705. SolderCount = stock.SolderCount,
  4706. IsRework = stock.IsRework,
  4707. IsBlack = stock.IsBlack,
  4708. Col = loc.Col,
  4709. Layer = loc.Layer,
  4710. Shelf = loc.Shelf,
  4711. Depth = loc.Depth,
  4712. Code = loc.Code,
  4713. Tunnel = loc.Tunnel,
  4714. SCRel = loc.SCRel,
  4715. Floor = loc.Floor,
  4716. WarehouseCode = loc.WarehouseCode,
  4717. ContGrpBarCode = loc.ContGrpBarCode,
  4718. ContGrpId = loc.ContGrpId,
  4719. Id = loc.Id,
  4720. StateNum = loc.StateNum,
  4721. SkuCode = rule1.SkuCode,
  4722. Wind = stock.Wind,
  4723. InDocsNo = stock.InDocsNo
  4724. };
  4725. if (!invlist.Any())
  4726. {
  4727. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  4728. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4729. res.ResMsg = "库存不足";
  4730. return res;
  4731. }
  4732. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  4733. invlist = invlist.Distinct(new CompareStock());
  4734. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  4735. if (tunlist.Any())
  4736. {
  4737. if (tunlist.Where(p => p.Default2 == "1").Any())
  4738. {
  4739. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4740. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4741. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  4742. }
  4743. if (tunlist.Where(p => p.Default2 == "2").Any())
  4744. {
  4745. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4746. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4747. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  4748. }
  4749. if (tunlist.Where(p => p.Default2 == "3").Any())
  4750. {
  4751. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4752. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  4753. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  4754. }
  4755. }
  4756. if (!invlist.Any())
  4757. {
  4758. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  4759. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4760. res.ResMsg = "禁用巷道后 | 库存不足";
  4761. return res;
  4762. }
  4763. var invlist2 = invlist;
  4764. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  4765. if (!sku.Any())
  4766. {
  4767. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  4768. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4769. res.ResMsg = "库中没有SKU或SKU不能为空";
  4770. return res;
  4771. }
  4772. 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));
  4773. if (!rulelist.Any())
  4774. {
  4775. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  4776. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  4777. _logger.LogInformation("非控制不满足装箱:" + msg);
  4778. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  4779. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  4780. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  4781. return res;
  4782. }
  4783. foreach (var item in sku)
  4784. {
  4785. 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);
  4786. if (!rules.Any())
  4787. {
  4788. string msg = "SKU:" + item.Key + ",没有可用箱号";
  4789. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  4790. _logger.LogInformation("非控制不满足装箱:" + msg);
  4791. res.ResMsg = msg;
  4792. 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()));
  4793. continue;
  4794. }
  4795. var rulegroup = rules.GroupBy(p => new
  4796. {
  4797. p.Wind,
  4798. p.SpoolType,
  4799. p.FullCountQty,
  4800. p.DocsNo
  4801. }).ToList();
  4802. foreach (var rulestem in rulegroup)
  4803. {
  4804. //先判断该单号下是否有黑盘,如果没有则直接跳过
  4805. if (!invlist.Where(p => p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo).Any())
  4806. {
  4807. WreTimeOutRecord(invlist.Where(p => p.IsBlack == false && p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), "该单号下没有黑盘"+ rulestem.Key.DocsNo);
  4808. continue;
  4809. }
  4810. 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();
  4811. //var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  4812. //if (!syslist.Any())
  4813. //{
  4814. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  4815. // _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  4816. // continue;
  4817. //}
  4818. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  4819. List<string> equips = new List<string>();
  4820. foreach (var pp in sys)
  4821. {
  4822. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  4823. {
  4824. equips.Add(pp.Code);
  4825. }
  4826. }
  4827. if (!equips.Any())
  4828. {
  4829. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  4830. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  4831. //自动更新子托盘配置
  4832. foreach (var item1 in sys)
  4833. {
  4834. if (!item1.SContent.Contains(rule.TrayCode))
  4835. {
  4836. string con = item1.SContent + "," + rule.TrayCode;
  4837. _sysconfigrepository.AsUpdateable()
  4838. .SetColumns(p => new sxSysConfig() { SContent = con })
  4839. .Where(p => p.Id == item1.Id)
  4840. .ExecuteCommand();
  4841. }
  4842. }
  4843. continue;
  4844. }
  4845. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  4846. if (!dev.Any())
  4847. {
  4848. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key, Time = DateTime.Now });
  4849. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key);
  4850. WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  4851. continue;
  4852. }
  4853. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  4854. if (!wbgrouplist.Any())
  4855. {
  4856. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  4857. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  4858. continue;
  4859. }
  4860. ; //找到重绕盘,拼接进去,重绕盘不需要扭转
  4861. var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  4862. 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
  4863. && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind) // && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours
  4864. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  4865. where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  4866. select new StockTemp
  4867. {
  4868. MatCode = stock.MatCode,
  4869. InvBarCode = stock.InvBarCode,
  4870. Grade = stock.Grade,
  4871. InvStateCode = stock.InvStateCode,
  4872. ProductTime = stock.ProductTime,
  4873. WbGroupCode = stock.WbGroupCode,
  4874. IsTorsChk = stock.IsTorsChk,
  4875. TorsChkQty = stock.TorsChkQty,
  4876. TorsChkValue = stock.TorsChkValue,
  4877. HoldTime = stock.HoldTime,
  4878. ProductMachCode = stock.ProductMachCode,
  4879. IsControlpanel = stock.IsControlpanel,
  4880. HWTypeCode = stock.HWTypeCode,
  4881. SolderCount = stock.SolderCount,
  4882. IsRework = stock.IsRework,
  4883. IsBlack = stock.IsBlack,
  4884. Col = loc.Col,
  4885. Layer = loc.Layer,
  4886. Shelf = loc.Shelf,
  4887. Depth = loc.Depth,
  4888. Code = loc.Code,
  4889. Tunnel = loc.Tunnel,
  4890. SCRel = loc.SCRel,
  4891. Floor = loc.Floor,
  4892. WarehouseCode = loc.WarehouseCode,
  4893. ContGrpBarCode = loc.ContGrpBarCode,
  4894. ContGrpId = loc.ContGrpId,
  4895. Id = loc.Id,
  4896. StateNum = loc.StateNum,
  4897. SkuCode = "",
  4898. Wind = stock.Wind
  4899. };
  4900. //过滤重饶盘被禁用的巷道
  4901. invlistchongrao = invlistchongrao.Distinct();
  4902. if (tunlist.Any())
  4903. {
  4904. if (tunlist.Where(p => p.Default2 == "1").Any())
  4905. {
  4906. var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4907. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4908. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  4909. }
  4910. if (tunlist.Where(p => p.Default2 == "2").Any())
  4911. {
  4912. var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4913. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4914. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  4915. }
  4916. if (tunlist.Where(p => p.Default2 == "3").Any())
  4917. {
  4918. var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  4919. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  4920. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  4921. }
  4922. }
  4923. var tempsign = false;
  4924. foreach (var wbgroup in wbgrouplist)
  4925. {
  4926. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  4927. invlistchongrao = invlistchongrao.OrderBy(p => p.ProductTime);
  4928. invlist2 = invlistchongrao.Union(invlist2);
  4929. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty && invlist2.Where(p => p.IsBlack == true).Any())
  4930. {
  4931. //tempsign = true;
  4932. //break;
  4933. }
  4934. else
  4935. {
  4936. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  4937. {
  4938. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有黑盘;SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  4939. }
  4940. else
  4941. {
  4942. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count()+ ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  4943. }
  4944. continue;
  4945. }
  4946. if (!invlist2.Any())
  4947. {
  4948. string msg = "没有对应单号的库存,单号:" + rule.DocsNo + ",SKU:" + item.Key + ",绕向:" + rule.Wind + ",机器组:" + wbgroup.Key;
  4949. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  4950. _logger.LogInformation("非控制不满足装箱:" + msg);
  4951. res.ResMsg = msg;
  4952. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count());
  4953. continue;
  4954. }
  4955. if (!string.IsNullOrEmpty(rule.SpoolType))
  4956. {
  4957. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  4958. }
  4959. if (!string.IsNullOrEmpty(rule.Wind))
  4960. {
  4961. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  4962. }
  4963. //焊点、返工盘、黑盘一些基本属性筛选
  4964. #region 判断是否为最后一箱
  4965. int pro = 0;
  4966. //if (_boxrulerepository.GetList(p => p.DocsNo == rule.DocsNo && p.ZXStateCode == 0).Count > 1)
  4967. //{
  4968. // if (rule.SpoolType == "BS60")
  4969. // {
  4970. // rule.BlackCount = 4;
  4971. // }
  4972. // else
  4973. // {
  4974. // rule.BlackCount = 2;
  4975. // }
  4976. //}
  4977. //else
  4978. //{
  4979. // if (rule.SpoolType == "BS60")
  4980. // {
  4981. // rule.BlackCount = 2;
  4982. // }
  4983. // else
  4984. // {
  4985. // rule.BlackCount = 1;
  4986. // }
  4987. // pro = 1;
  4988. //}
  4989. //不再限制最后一箱黑盘数量,保持统一,BS60两个,BS80一个,2024-5-18
  4990. pro = 0;
  4991. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  4992. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  4993. {
  4994. rule.BlackCount = int.Parse(blackcount.Default1);
  4995. }
  4996. else
  4997. {
  4998. rule.BlackCount = int.Parse(blackcount.Default2);
  4999. }
  5000. #endregion
  5001. var blackinvlist = new List<StockTemp>();
  5002. if (pro == 1)
  5003. {
  5004. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime).ToList();
  5005. if (!blackinvlist.Any())
  5006. {
  5007. string msg = "SKU:"+rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo +"下的黑盘数量为0";
  5008. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  5009. _logger.LogInformation("非控制不满足装箱:" + msg);
  5010. res.ResMsg = msg;
  5011. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  5012. continue;
  5013. }
  5014. blackinvlist = blackinvlist.Where(p => p.IsBlack == true).ToList();
  5015. }
  5016. else
  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.Take(rule.BlackCount).ToList();
  5029. }
  5030. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  5031. {
  5032. if (blackinvlist.Count <= 1)
  5033. {
  5034. string msg = "BS60工字轮黑盘数量至少2个,当前黑盘数量" + blackinvlist.Count + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向" + rule.Wind + "SKU:" + rule.SkuCode + ",单号:" + rule.DocsNo;
  5035. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut14", new RedisErrorInfo() { Equip = "NoControlOut14", Con = msg, Time = DateTime.Now });
  5036. _logger.LogInformation("非控制不满足装箱:" + msg);
  5037. res.ResMsg = msg;
  5038. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  5039. continue;
  5040. }
  5041. }
  5042. invlist2 = invlist2.Where(p => !blackinvlist.Select(q => q.ContGrpBarCode).Contains(p.ContGrpBarCode) && p.IsBlack == false).ToList();
  5043. var tempoutrecord = invlist2.ToList();
  5044. var solderinvlist = new List<StockTemp>();
  5045. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  5046. {
  5047. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  5048. var solcount = rulemaxcount - blackinvlist.Count;
  5049. if (solcount <= 0)
  5050. {
  5051. solcount = 0;
  5052. };
  5053. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  5054. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  5055. }
  5056. else
  5057. {
  5058. //不允许焊点盘
  5059. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  5060. }
  5061. var returninvlist = new List<StockTemp>();
  5062. if (rule.ReturnCount > 0)
  5063. {
  5064. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  5065. invlist2 = invlist2.Where(p => p.IsRework == false);
  5066. }
  5067. else
  5068. {
  5069. invlist2 = invlist2.Where(p => p.IsRework == false);
  5070. }
  5071. if (!invlist2.Any())
  5072. {
  5073. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  5074. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  5075. _logger.LogInformation("非控制不满足装箱:" + msg);
  5076. res.ResMsg = msg;
  5077. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足,"+ "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  5078. continue;
  5079. }
  5080. //var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5081. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) < rule.FullCountQty)
  5082. {
  5083. //if (invlist3.Count() >= rule.FullCountQty - (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count))
  5084. //{
  5085. // invlist2 = invlist2.Union(invlist3.Take(rule.FullCountQty - (invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count)));
  5086. //}
  5087. //else
  5088. //{
  5089. 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;
  5090. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  5091. _logger.LogInformation("非控制不满足装箱:" + msg);
  5092. res.ResMsg = msg;
  5093. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  5094. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5095. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5096. WreTimeOutRecord(blackinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5097. continue;
  5098. //}
  5099. }
  5100. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  5101. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 12); //12小时之内的按堆垛机平均分
  5102. #region 按照堆垛机平均分配任务
  5103. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count);//符合条件的普通盘数量
  5104. var mastinvlist = solderinvlist.Union(returninvlist).Union(blackinvlist);
  5105. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  5106. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  5107. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  5108. select new SrmTaskTmep
  5109. {
  5110. Srm = x.Key,
  5111. TaskCount = x.Count(),
  5112. LocList = x.Select(q=>q.Code).ToList()
  5113. };
  5114. var srmtasktobe = new List<SrmTaskTmep>();
  5115. foreach (var srmlistitem in srmlist)
  5116. {
  5117. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  5118. {
  5119. srmtasktobe.Add(new SrmTaskTmep()
  5120. {
  5121. Srm = srmlistitem,
  5122. TaskCount = 0,
  5123. LocList = new List<string>()
  5124. });
  5125. }
  5126. }
  5127. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  5128. var srmtasktobetemplocs = new List<string>();
  5129. for (int i = 0; i < tempcount; i++)
  5130. {
  5131. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  5132. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  5133. foreach (var srmtasktobeitem in srmtasktobe)
  5134. {
  5135. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  5136. {
  5137. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p=>p.Depth).ThenBy(p => p.ProductTime).First();
  5138. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  5139. srmtasktobetemplocs.Add(first.Code);
  5140. break;
  5141. }
  5142. }
  5143. }
  5144. #endregion
  5145. var tempbuchong = new List<StockTemp>();
  5146. if (tempcount > srmtasktobetemplocs.Count())
  5147. {
  5148. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  5149. }
  5150. 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));
  5151. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist).Union(blackinvlist);
  5152. invlist2 = invlist2.Union(tempbuchong);
  5153. var finstocks = invlist2.ToList();
  5154. //最后验证数据
  5155. #region 最后验证数据
  5156. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  5157. {
  5158. _logger.LogInformation("非控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5159. continue;
  5160. }
  5161. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  5162. {
  5163. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5164. continue;
  5165. }
  5166. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  5167. {
  5168. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5169. continue;
  5170. }
  5171. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  5172. {
  5173. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5174. continue;
  5175. }
  5176. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  5177. {
  5178. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5179. continue;
  5180. }
  5181. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  5182. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  5183. {
  5184. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5185. continue;
  5186. }
  5187. #endregion
  5188. //获取下工位的最新状态
  5189. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  5190. //sxSysConfig palletequip = null;
  5191. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5192. //{
  5193. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5194. // _logger.LogInformation("非控制装箱预锁:埋点4");
  5195. //}
  5196. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5197. //{
  5198. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5199. // _logger.LogInformation("非控制装箱预锁:埋点5");
  5200. //}
  5201. //else
  5202. //{
  5203. // res.ResMsg = "没有空闲的码垛工位";
  5204. // return res;
  5205. //}
  5206. var robotlist = new List<string>() { "Robot1", "Robot2" };
  5207. sxSysConfig palletequip = null;
  5208. foreach (var robot in robotlist)
  5209. {
  5210. //获取下工位的最新状态
  5211. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot).OrderBy(p => p.TaskFlag).ToList();
  5212. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5213. //{
  5214. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5215. //}
  5216. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  5217. //{
  5218. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  5219. //}
  5220. //else
  5221. //{
  5222. // res.ResMsg = "没有空闲的码垛工位";
  5223. // return res;
  5224. //}
  5225. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  5226. {
  5227. 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();
  5228. //码垛工位
  5229. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5230. {
  5231. palletequip = palletequiptemp;
  5232. break;
  5233. }
  5234. //缓存工位1
  5235. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5236. {
  5237. palletequip = palletequiptemp;
  5238. break;
  5239. }
  5240. //缓存工位2
  5241. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  5242. {
  5243. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  5244. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  5245. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  5246. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  5247. {
  5248. palletequip = palletequiptemp;
  5249. break;
  5250. }
  5251. }
  5252. }
  5253. }
  5254. if (palletequip == null)
  5255. {
  5256. res.ResMsg = "没有空闲的码垛工位";
  5257. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5258. return res;
  5259. }
  5260. int acttype = 0;
  5261. //判断是缓存工位锁定库存还是码垛工位直接下任务
  5262. if (string.IsNullOrEmpty(palletequip.Default1))
  5263. {
  5264. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5265. {
  5266. acttype = 1;//直接执行下任务
  5267. }
  5268. else
  5269. {
  5270. //等待下一轮循环,往math表插数据放在前面
  5271. res.ResMsg = "等待下一轮循环";
  5272. return res;
  5273. }
  5274. }
  5275. else
  5276. {
  5277. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5278. {
  5279. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  5280. if (!string.IsNullOrEmpty(palletequip.Default3))
  5281. {
  5282. res.ResMsg = "等待下一轮循环";
  5283. return res;
  5284. }
  5285. else
  5286. {
  5287. acttype = 2;//预锁库存
  5288. }
  5289. }
  5290. else
  5291. {
  5292. //判断缓存工位2(缓存工位1的托盘要到位之后)
  5293. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  5294. {
  5295. //使用缓存2工位
  5296. acttype = 3;
  5297. }
  5298. else
  5299. {
  5300. res.ResMsg = "没有空闲的码垛工位";
  5301. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5302. return res;
  5303. }
  5304. }
  5305. }
  5306. #region 托盘任务验证
  5307. var TrayportageCheck = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  5308. var responseCheck = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTaskCheck", JsonConvert.SerializeObject(TrayportageCheck));
  5309. var trayresCheck = JsonConvert.DeserializeObject<SRes>(responseCheck);
  5310. if (trayresCheck.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5311. {
  5312. res.ResCode = trayresCheck.ResCode;
  5313. res.ResMsg = trayresCheck.ResMsg;
  5314. _logger.LogInformation("托盘输送任务验证报错" + trayresCheck.ResMsg);
  5315. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务验证报错:" + trayresCheck.ResMsg, Time = DateTime.Now });
  5316. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "托盘输送任务验证报错" + trayresCheck.ResMsg);
  5317. return res;
  5318. }
  5319. #endregion
  5320. #region Mes箱号校验
  5321. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  5322. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  5323. var reqids = Guid.NewGuid().ToString();
  5324. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  5325. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  5326. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  5327. if (mesresponse.success == false)
  5328. {
  5329. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5330. {
  5331. ZXStateCode = 2,
  5332. EditTime = DateTime.Now,
  5333. Memo = mesresponse.message
  5334. }, p => p.Id == rule.Id);
  5335. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  5336. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5337. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  5338. _logger.LogInformation(res.ResMsg);
  5339. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  5340. continue;
  5341. }
  5342. #endregion
  5343. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  5344. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  5345. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  5346. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5347. {
  5348. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  5349. res.ResCode = trayres.ResCode;
  5350. res.ResMsg = trayres.ResMsg;
  5351. return res;
  5352. }
  5353. if (acttype == 1)
  5354. {
  5355. //码垛信息校验
  5356. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  5357. {
  5358. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5359. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  5360. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  5361. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  5362. return res;
  5363. }
  5364. var root = "";
  5365. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  5366. {
  5367. root = "Robot1";
  5368. }
  5369. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  5370. {
  5371. root = "Robot2";
  5372. }
  5373. var pallet = new Palletizing()
  5374. {
  5375. PalletMax = rule.FullCountQty,
  5376. PalletizState = 0,
  5377. Equip = palletequip.Code,
  5378. Finish = 0,
  5379. AddWho = "",
  5380. EditWho = "",
  5381. BoxRule = rule.PackRule,
  5382. BoxRuleId = rule.Id,
  5383. IsControlpanel = false,
  5384. TaskNum = int.Parse(trayres.Memo1),
  5385. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  5386. Robot = root
  5387. };
  5388. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  5389. if (pallects.Id == 0)
  5390. {
  5391. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5392. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  5393. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  5394. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  5395. return res;
  5396. }
  5397. var palletizId = pallects.Id;
  5398. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5399. {
  5400. ZXStateCode = 1
  5401. }, p => p.Id == rule.Id);
  5402. List<PalletLayerMath> math = new List<PalletLayerMath>();
  5403. foreach (var invs in invlist2)
  5404. {
  5405. var palletlayer = new PalletLayerMath()
  5406. {
  5407. PalletizingId = palletizId,
  5408. ContGrpId = (long)invs.ContGrpId,
  5409. ContBarCode = invs.ContGrpBarCode,
  5410. Layer = 0,
  5411. SkuCode = rule.SkuCode,
  5412. Finish = 0,
  5413. PboxruleId = rule.Id,
  5414. Istask = 0,
  5415. Palletequip = palletequip.Code,
  5416. IsBlack = invs.IsBlack,
  5417. Depth = invs.Depth,
  5418. SolderCount = invs.SolderCount,
  5419. BoxCode = rule.PBoxCode,
  5420. StockDonse = invs.InDocsNo,
  5421. Wbgroup = invs.WbGroupCode,
  5422. BoxDonse = rule.DocsNo
  5423. };
  5424. math.Add(palletlayer);
  5425. }
  5426. _palletlayerMathrepository.InsertRange(math);
  5427. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5428. {
  5429. PreStock = "1"
  5430. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  5431. #region 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  5432. //invlist2 = invlist2.OrderBy(p => p.Depth).Take(72);
  5433. //foreach (var code in invlist2)
  5434. //{
  5435. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  5436. // if (cell == null)
  5437. // {
  5438. // continue;
  5439. // }
  5440. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5441. // if (invs == null)
  5442. // {
  5443. // continue;
  5444. // }
  5445. // //先判断二升位是否能出库
  5446. // if (code.Depth == 2)
  5447. // {
  5448. // var respon = MoveTask(code.Code);
  5449. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5450. // {
  5451. // continue;
  5452. // }
  5453. // }
  5454. // var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  5455. // {
  5456. // Code = code.ContGrpBarCode,
  5457. // Equip = pallects.Equip,
  5458. // Mater = code.MatCode,
  5459. // Srm = code.SCRel,
  5460. // PalletLayer = 1,
  5461. // Grade = code.Grade,
  5462. // Tunnel = code.Tunnel.ToString(),
  5463. // CellCode = code.Code,
  5464. // SkuCode = rule.SkuCode,
  5465. // ProductMachCode = code.ProductMachCode,
  5466. // Floor = code.Floor,
  5467. // PalletizingId = palletizId,
  5468. // Robot = root,
  5469. // GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  5470. // });
  5471. // if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5472. // {
  5473. // continue;
  5474. // }
  5475. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5476. // {
  5477. // Istask = 1,
  5478. // Layer = 1
  5479. // }, p => p.ContBarCode == code.ContGrpBarCode);
  5480. //}
  5481. ////下完任务后将标识值加1
  5482. //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);
  5483. //taskflag = taskflag + 1;
  5484. //_sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + pallects.Equip + "'");
  5485. #endregion
  5486. res.ResCode = 200;
  5487. res.ResMsg = "成功";
  5488. return res;
  5489. }
  5490. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  5491. {
  5492. var codes = new List<string>();
  5493. codes.AddRange(finstocks.Select(p => p.ContGrpBarCode));
  5494. if (codes.Any())
  5495. {
  5496. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5497. {
  5498. PreStock = "1",
  5499. BomMatCode = trayres.Memo1,//预锁托盘任务id
  5500. BomMatName = rule.PBoxCode, //预锁的箱号
  5501. BomSetId = 0 //代表非控制箱标识
  5502. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5503. //锁定缓存工位
  5504. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  5505. }
  5506. res.ResCode = 200;
  5507. res.ResMsg = "成功";
  5508. return res;
  5509. }
  5510. }
  5511. }
  5512. }
  5513. return res;
  5514. }
  5515. /// <summary>
  5516. /// 码垛SPC非控制装箱(缓存托盘)
  5517. /// </summary>
  5518. /// <param name="request"></param>
  5519. /// <returns></returns>
  5520. public SRes PalletizingSpcNotPackStockOut3(PalletizingPackStockOutRequest request)
  5521. {
  5522. var res = new SRes();
  5523. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  5524. if (palletlist.Any())
  5525. {
  5526. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  5527. if (maxtaskStemp.Any())
  5528. {
  5529. var maxtaskcount = (from tas in maxtaskStemp
  5530. select new TunnelCountTemp()
  5531. {
  5532. Tunnel = tas.Key,
  5533. Count = tas.Count()
  5534. }).ToList();
  5535. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  5536. }
  5537. //箱之间状态卡控限制标识
  5538. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  5539. //某个机械手最大下发的限制状态任务数量
  5540. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  5541. foreach (var item in palletlist)
  5542. {
  5543. //判断任务数量
  5544. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  5545. {
  5546. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  5547. continue;
  5548. }
  5549. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  5550. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  5551. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  5552. {
  5553. //判断是不是第3箱
  5554. //判断是否是第三箱
  5555. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  5556. {
  5557. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  5558. if (item.Id == thirdbox)//第3箱子
  5559. {
  5560. 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())
  5561. {
  5562. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5563. continue;
  5564. }
  5565. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  5566. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  5567. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  5568. {
  5569. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  5570. continue;
  5571. }
  5572. }
  5573. else if (item.Id > thirdbox)
  5574. {
  5575. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  5576. continue;
  5577. }
  5578. }
  5579. //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())
  5580. //{
  5581. // _logger.LogInformation("同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5582. // continue;
  5583. //}
  5584. }
  5585. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  5586. if (equips == null)
  5587. {
  5588. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  5589. continue;
  5590. }
  5591. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  5592. if (!palletMach.Any())
  5593. {
  5594. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  5595. continue;
  5596. }
  5597. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  5598. var curdocid = maxdocid + 1;
  5599. if (palletMach.Any())
  5600. {
  5601. var pid = palletMach.First().PalletizingId;
  5602. 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)
  5603. {
  5604. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  5605. }
  5606. }
  5607. foreach (var pallets in palletMach)
  5608. {
  5609. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  5610. if (cell == null)
  5611. {
  5612. continue;
  5613. }
  5614. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5615. if (invs == null)
  5616. {
  5617. continue;
  5618. }
  5619. var root = "";
  5620. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  5621. {
  5622. root = "Robot1";
  5623. }
  5624. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  5625. {
  5626. root = "Robot2";
  5627. }
  5628. //先判断二升位是否能出库
  5629. if (cell.Depth == 2)
  5630. {
  5631. var respon = MoveTask(cell.Code);
  5632. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5633. {
  5634. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  5635. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  5636. continue;
  5637. }
  5638. }
  5639. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  5640. {
  5641. Code = pallets.ContBarCode,
  5642. CellCode = cell.Code,
  5643. Srm = cell.SCRel,
  5644. Tunnel = cell.Tunnel.ToString(),
  5645. Floor = cell.Floor,
  5646. Grade = invs.Grade,
  5647. Mater = invs.MatCode,
  5648. SkuCode = pallets.SkuCode,
  5649. PalletLayer = 0,
  5650. ProductMachCode = invs.ProductMachCode,
  5651. Equip = item.Equip,
  5652. PalletizingId = item.Id,
  5653. Robot = root,
  5654. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  5655. DocId = curdocid
  5656. });
  5657. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5658. {
  5659. continue;
  5660. }
  5661. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5662. {
  5663. Istask = 1,
  5664. Layer = 0
  5665. }, p => p.ContBarCode == invs.ContGrpBarCode);
  5666. }
  5667. //下完任务后将标识值加1
  5668. 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);
  5669. taskflag = taskflag + 1;
  5670. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  5671. }
  5672. }
  5673. //待码垛箱任务下发
  5674. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  5675. if (palletlisttobe.Any())
  5676. {
  5677. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  5678. {
  5679. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  5680. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  5681. {
  5682. _palletizrepository.AsUpdateable()
  5683. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  5684. .Where(p => p.Id == item.Id)
  5685. .ExecuteCommand();
  5686. }
  5687. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  5688. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  5689. {
  5690. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  5691. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  5692. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  5693. {
  5694. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  5695. continue;
  5696. }
  5697. //箱之间状态卡控限制标识
  5698. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  5699. //判断任务数量
  5700. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  5701. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  5702. {
  5703. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  5704. continue;
  5705. }
  5706. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  5707. 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()
  5708. {
  5709. //判断是否是第三箱
  5710. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  5711. {
  5712. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  5713. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  5714. if (item.Id == thirdbox)//第3箱子
  5715. {
  5716. 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())
  5717. {
  5718. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  5719. continue;
  5720. }
  5721. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  5722. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  5723. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  5724. {
  5725. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  5726. continue;
  5727. }
  5728. }
  5729. else if (item.Id > thirdbox)
  5730. {
  5731. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  5732. continue;
  5733. }
  5734. }
  5735. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  5736. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  5737. {
  5738. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  5739. if (!palletMach.Any())
  5740. {
  5741. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  5742. continue;
  5743. }
  5744. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  5745. var curdocid = maxdocid + 1;
  5746. if (palletMach.Any())
  5747. {
  5748. var pid = palletMach.First().PalletizingId;
  5749. 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)
  5750. {
  5751. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  5752. }
  5753. }
  5754. foreach (var pallets in palletMach)
  5755. {
  5756. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  5757. if (cell == null)
  5758. {
  5759. continue;
  5760. }
  5761. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5762. if (invs == null)
  5763. {
  5764. continue;
  5765. }
  5766. var root = "";
  5767. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  5768. {
  5769. root = "Robot1";
  5770. }
  5771. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  5772. {
  5773. root = "Robot2";
  5774. }
  5775. //先判断二升位是否能出库
  5776. if (cell.Depth == 2)
  5777. {
  5778. var respon = MoveTask(cell.Code);
  5779. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  5780. {
  5781. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  5782. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  5783. continue;
  5784. }
  5785. }
  5786. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  5787. {
  5788. Code = pallets.ContBarCode,
  5789. CellCode = cell.Code,
  5790. Srm = cell.SCRel,
  5791. Tunnel = cell.Tunnel.ToString(),
  5792. Floor = cell.Floor,
  5793. Grade = invs.Grade,
  5794. Mater = invs.MatCode,
  5795. SkuCode = pallets.SkuCode,
  5796. PalletLayer = 0,
  5797. ProductMachCode = invs.ProductMachCode,
  5798. Equip = item.Equip,
  5799. PalletizingId = item.Id,
  5800. Robot = root,
  5801. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  5802. DocId = curdocid
  5803. });
  5804. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5805. {
  5806. continue;
  5807. }
  5808. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  5809. {
  5810. Istask = 1,
  5811. Layer = 0
  5812. }, p => p.ContBarCode == invs.ContGrpBarCode);
  5813. }
  5814. //下完任务后将标识值加1
  5815. 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);
  5816. taskflag = taskflag + 1;
  5817. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  5818. }
  5819. }
  5820. }
  5821. else
  5822. {
  5823. _palletizrepository.AsUpdateable()
  5824. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  5825. .Where(p => p.Id == item.Id)
  5826. .ExecuteCommand();
  5827. }
  5828. }
  5829. }
  5830. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  5831. var iscontinue = false;
  5832. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  5833. {
  5834. if (string.IsNullOrEmpty(palletequip.Default1))
  5835. {
  5836. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  5837. {
  5838. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  5839. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5840. if (preinvlist.Any())
  5841. {
  5842. //机械手交叉下任务需求
  5843. //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)
  5844. //{
  5845. // 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();
  5846. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5847. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5848. // {
  5849. // }
  5850. // else
  5851. // {
  5852. // iscontinue = false;
  5853. // continue;
  5854. // }
  5855. //}
  5856. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  5857. 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)
  5858. {
  5859. //如果较小的工位已经没有任务那么,则继续下该工位任务
  5860. 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();
  5861. if (minequ != null)
  5862. {
  5863. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5864. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5865. {
  5866. }
  5867. else
  5868. {
  5869. iscontinue = false;
  5870. continue;
  5871. }
  5872. }
  5873. }
  5874. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  5875. {
  5876. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5877. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  5878. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  5879. return res;
  5880. }
  5881. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  5882. //码垛信息校验
  5883. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  5884. {
  5885. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5886. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  5887. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  5888. return res;
  5889. }
  5890. var root = "";
  5891. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  5892. {
  5893. root = "Robot1";
  5894. }
  5895. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  5896. {
  5897. root = "Robot2";
  5898. }
  5899. var pallet = new Palletizing()
  5900. {
  5901. PalletMax = rule.FullCountQty,
  5902. PalletizState = 0,
  5903. Equip = palletequip.Code,
  5904. Finish = 0,
  5905. AddWho = "",
  5906. EditWho = "",
  5907. BoxRule = rule.PackRule,
  5908. BoxRuleId = rule.Id,
  5909. IsControlpanel = false,
  5910. TaskNum = int.Parse(palletequip.Default3),
  5911. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  5912. Robot = root
  5913. };
  5914. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  5915. if (pallects.Id == 0)
  5916. {
  5917. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5918. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  5919. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  5920. return res;
  5921. }
  5922. var palletizId = pallects.Id;
  5923. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5924. {
  5925. ZXStateCode = 1
  5926. }, p => p.Id == rule.Id);
  5927. List<PalletLayerMath> math = new List<PalletLayerMath>();
  5928. foreach (var invs in preinvlist)
  5929. {
  5930. var palletlayer = new PalletLayerMath()
  5931. {
  5932. PalletizingId = palletizId,
  5933. ContGrpId = (long)invs.ContGrpId,
  5934. ContBarCode = invs.ContGrpBarCode,
  5935. Layer = 0,
  5936. SkuCode = rule.SkuCode,
  5937. Finish = 0,
  5938. PboxruleId = rule.Id,
  5939. Istask = 0,
  5940. Palletequip = palletequip.Code,
  5941. Depth = invs.Depth,
  5942. IsBlack = invs.IsBlack,
  5943. SolderCount = invs.SolderCount,
  5944. BoxCode = rule.PBoxCode,
  5945. Wbgroup = invs.WbGroupCode,
  5946. StockDonse = invs.InDocsNo,
  5947. BoxDonse = rule.DocsNo
  5948. };
  5949. math.Add(palletlayer);
  5950. }
  5951. _palletlayerMathrepository.InsertRange(math);
  5952. //把库存预锁标志更新掉
  5953. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5954. {
  5955. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  5956. BomMatCode = "",
  5957. PreStock = "1"
  5958. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  5959. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  5960. res.ResMsg = "非控制捞取预锁库存处理成功";
  5961. return res;
  5962. }
  5963. else
  5964. {
  5965. iscontinue = false;
  5966. continue;
  5967. }
  5968. }
  5969. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5970. {
  5971. iscontinue = true;
  5972. break;
  5973. }
  5974. else
  5975. {
  5976. iscontinue = false;
  5977. continue;
  5978. }
  5979. }
  5980. else
  5981. {
  5982. if (!string.IsNullOrEmpty(palletequip.Default3))
  5983. {
  5984. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  5985. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5986. if (preinvlist.Any())
  5987. {
  5988. //机械手交叉下任务需求
  5989. //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)
  5990. //{
  5991. // 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();
  5992. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  5993. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  5994. // {
  5995. // }
  5996. // else
  5997. // {
  5998. // iscontinue = false;
  5999. // continue;
  6000. // }
  6001. //}
  6002. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  6003. 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)
  6004. {
  6005. //如果较小的工位已经没有任务那么,则继续下该工位任务
  6006. 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();
  6007. if (minequ != null)
  6008. {
  6009. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  6010. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  6011. {
  6012. }
  6013. else
  6014. {
  6015. iscontinue = false;
  6016. continue;
  6017. }
  6018. }
  6019. }
  6020. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  6021. {
  6022. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6023. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  6024. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  6025. return res;
  6026. }
  6027. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  6028. //码垛信息校验
  6029. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  6030. {
  6031. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6032. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  6033. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  6034. return res;
  6035. }
  6036. var root = "";
  6037. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  6038. {
  6039. root = "Robot1";
  6040. }
  6041. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  6042. {
  6043. root = "Robot2";
  6044. }
  6045. var pallet = new Palletizing()
  6046. {
  6047. PalletMax = rule.FullCountQty,
  6048. PalletizState = 2,
  6049. Equip = palletequip.Code,
  6050. Finish = 0,
  6051. AddWho = "",
  6052. EditWho = "",
  6053. BoxRule = rule.PackRule,
  6054. BoxRuleId = rule.Id,
  6055. IsControlpanel = false,
  6056. TaskNum = int.Parse(palletequip.Default3),
  6057. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  6058. Robot = root
  6059. };
  6060. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  6061. if (pallects.Id == 0)
  6062. {
  6063. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6064. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  6065. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  6066. return res;
  6067. }
  6068. var palletizId = pallects.Id;
  6069. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6070. {
  6071. ZXStateCode = 1
  6072. }, p => p.Id == rule.Id);
  6073. List<PalletLayerMath> math = new List<PalletLayerMath>();
  6074. foreach (var invs in preinvlist)
  6075. {
  6076. var palletlayer = new PalletLayerMath()
  6077. {
  6078. PalletizingId = palletizId,
  6079. ContGrpId = (long)invs.ContGrpId,
  6080. ContBarCode = invs.ContGrpBarCode,
  6081. Layer = 0,
  6082. SkuCode = rule.SkuCode,
  6083. Finish = 0,
  6084. PboxruleId = rule.Id,
  6085. Istask = 0,
  6086. Palletequip = palletequip.Code,
  6087. Depth = invs.Depth,
  6088. IsBlack = invs.IsBlack,
  6089. SolderCount = invs.SolderCount,
  6090. BoxCode = rule.PBoxCode,
  6091. Wbgroup = invs.WbGroupCode,
  6092. StockDonse = invs.InDocsNo,
  6093. BoxDonse = rule.DocsNo
  6094. };
  6095. math.Add(palletlayer);
  6096. }
  6097. _palletlayerMathrepository.InsertRange(math);
  6098. //把库存预锁标志更新掉
  6099. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6100. {
  6101. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  6102. BomMatCode = "",
  6103. PreStock = "1"
  6104. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  6105. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  6106. res.ResMsg = "非控制捞取预锁库存处理成功";
  6107. return res;
  6108. }
  6109. else
  6110. {
  6111. iscontinue = false;
  6112. continue;
  6113. }
  6114. }
  6115. else
  6116. {
  6117. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  6118. {
  6119. iscontinue = true;
  6120. break;
  6121. }
  6122. else
  6123. {
  6124. iscontinue = false;
  6125. continue;
  6126. }
  6127. }
  6128. }
  6129. }
  6130. if (!iscontinue)
  6131. {
  6132. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  6133. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  6134. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  6135. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  6136. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  6137. {
  6138. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  6139. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6140. res.ResMsg = "没有空闲的码垛工位";
  6141. return res;
  6142. }
  6143. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  6144. {
  6145. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  6146. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6147. res.ResMsg = "没有空闲的码垛工位";
  6148. return res;
  6149. }
  6150. }
  6151. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  6152. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  6153. if (!devices.Where(p => p.pH_STATUS == true).Any())
  6154. {
  6155. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  6156. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6157. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  6158. return res;
  6159. }
  6160. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  6161. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 4 && p.PackRule == "SPC").OrderBy(p => p.EditTime);
  6162. if (prerules != null && prerules.Any())
  6163. {
  6164. foreach (var rule in prerules)
  6165. {
  6166. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  6167. List<string> equips = new List<string>();
  6168. foreach (var pp in sys)
  6169. {
  6170. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  6171. {
  6172. equips.Add(pp.Code);
  6173. }
  6174. }
  6175. if (!equips.Any())
  6176. {
  6177. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  6178. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  6179. //自动更新子托盘配置
  6180. foreach (var item1 in sys)
  6181. {
  6182. if (!item1.SContent.Contains(rule.TrayCode))
  6183. {
  6184. string con = item1.SContent + "," + rule.TrayCode;
  6185. _sysconfigrepository.AsUpdateable()
  6186. .SetColumns(p => new sxSysConfig() { SContent = con })
  6187. .Where(p => p.Id == item1.Id)
  6188. .ExecuteCommand();
  6189. }
  6190. }
  6191. }
  6192. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  6193. if (!invlist2.Any())
  6194. {
  6195. _logger.LogInformation(rule.Id + "规则表预占数据没有查到对应库存信息");
  6196. continue;
  6197. }
  6198. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  6199. if (!dev.Any())
  6200. {
  6201. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  6202. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  6203. continue;
  6204. }
  6205. var robotlist = new List<string>() { "Robot1", "Robot2" };
  6206. sxSysConfig palletequip = null;
  6207. foreach (var robot in robotlist)
  6208. {
  6209. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  6210. {
  6211. 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();
  6212. //码垛工位
  6213. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  6214. {
  6215. palletequip = palletequiptemp;
  6216. break;
  6217. }
  6218. //缓存工位1
  6219. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  6220. {
  6221. palletequip = palletequiptemp;
  6222. break;
  6223. }
  6224. //缓存工位2
  6225. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  6226. {
  6227. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  6228. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  6229. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  6230. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  6231. {
  6232. palletequip = palletequiptemp;
  6233. break;
  6234. }
  6235. }
  6236. }
  6237. }
  6238. if (palletequip == null)
  6239. {
  6240. res.ResMsg = "没有空闲的码垛工位";
  6241. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  6242. return res;
  6243. }
  6244. int acttype = 0;
  6245. //判断是缓存工位锁定库存还是码垛工位直接下任务
  6246. if (string.IsNullOrEmpty(palletequip.Default1))
  6247. {
  6248. if (string.IsNullOrEmpty(palletequip.Cache1State))
  6249. {
  6250. acttype = 1;//直接执行下任务
  6251. }
  6252. else
  6253. {
  6254. //等待下一轮循环,往math表插数据放在前面
  6255. res.ResMsg = "等待下一轮循环";
  6256. return res;
  6257. }
  6258. }
  6259. else
  6260. {
  6261. if (string.IsNullOrEmpty(palletequip.Cache1State))
  6262. {
  6263. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  6264. if (!string.IsNullOrEmpty(palletequip.Default3))
  6265. {
  6266. res.ResMsg = "等待下一轮循环";
  6267. return res;
  6268. }
  6269. else
  6270. {
  6271. acttype = 2;//预锁库存
  6272. }
  6273. }
  6274. else
  6275. {
  6276. //判断缓存工位2(缓存工位1的托盘要到位之后)
  6277. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  6278. {
  6279. //使用缓存2工位
  6280. acttype = 3;
  6281. }
  6282. else
  6283. {
  6284. res.ResMsg = "没有空闲的码垛工位";
  6285. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  6286. return res;
  6287. }
  6288. }
  6289. }
  6290. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode ,ActType = acttype };
  6291. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  6292. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  6293. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  6294. {
  6295. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  6296. res.ResCode = trayres.ResCode;
  6297. res.ResMsg = trayres.ResMsg;
  6298. return res;
  6299. }
  6300. if (acttype == 1)
  6301. {
  6302. //码垛信息校验
  6303. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  6304. {
  6305. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6306. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  6307. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  6308. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  6309. return res;
  6310. }
  6311. var root = "";
  6312. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  6313. {
  6314. root = "Robot1";
  6315. }
  6316. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  6317. {
  6318. root = "Robot2";
  6319. }
  6320. var pallet = new Palletizing()
  6321. {
  6322. PalletMax = rule.FullCountQty,
  6323. PalletizState = 0,
  6324. Equip = palletequip.Code,
  6325. Finish = 0,
  6326. AddWho = "",
  6327. EditWho = "",
  6328. BoxRule = rule.PackRule,
  6329. BoxRuleId = rule.Id,
  6330. IsControlpanel = false,
  6331. TaskNum = int.Parse(trayres.Memo1),
  6332. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  6333. Robot = root
  6334. };
  6335. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  6336. if (pallects.Id == 0)
  6337. {
  6338. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6339. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  6340. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  6341. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  6342. return res;
  6343. }
  6344. var palletizId = pallects.Id;
  6345. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6346. {
  6347. ZXStateCode = 1
  6348. }, p => p.Id == rule.Id);
  6349. List<PalletLayerMath> math = new List<PalletLayerMath>();
  6350. foreach (var invs in invlist2)
  6351. {
  6352. var palletlayer = new PalletLayerMath()
  6353. {
  6354. PalletizingId = palletizId,
  6355. ContGrpId = (long)invs.ContGrpId,
  6356. ContBarCode = invs.ContGrpBarCode,
  6357. Layer = 0,
  6358. SkuCode = rule.SkuCode,
  6359. Finish = 0,
  6360. PboxruleId = rule.Id,
  6361. Istask = 0,
  6362. Palletequip = palletequip.Code,
  6363. IsBlack = invs.IsBlack,
  6364. Depth = invs.Depth,
  6365. SolderCount = invs.SolderCount,
  6366. BoxCode = rule.PBoxCode,
  6367. StockDonse = invs.InDocsNo,
  6368. Wbgroup = invs.WbGroupCode,
  6369. BoxDonse = rule.DocsNo
  6370. };
  6371. math.Add(palletlayer);
  6372. }
  6373. _palletlayerMathrepository.InsertRange(math);
  6374. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6375. {
  6376. PreStock = "1"
  6377. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  6378. res.ResCode = 200;
  6379. res.ResMsg = "成功";
  6380. return res;
  6381. }
  6382. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  6383. {
  6384. var codes = new List<string>();
  6385. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  6386. if (codes.Any())
  6387. {
  6388. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6389. {
  6390. PreStock = "1",
  6391. BomMatCode = trayres.Memo1,//预锁托盘任务id
  6392. BomMatName = rule.PBoxCode, //预锁的箱号
  6393. BomSetId = 0 //代表非控制箱标识
  6394. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  6395. //锁定缓存工位
  6396. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  6397. }
  6398. res.ResCode = 200;
  6399. res.ResMsg = "成功";
  6400. return res;
  6401. }
  6402. }
  6403. }
  6404. else
  6405. {
  6406. res.ResMsg = "没有预占状态的规则数据";
  6407. }
  6408. return res;
  6409. }
  6410. /// <summary>
  6411. /// 码垛SPC非控制装箱计算预占箱号
  6412. /// </summary>
  6413. /// <param name="request"></param>
  6414. /// <returns></returns>
  6415. public SRes PalletizingSpcNotPackRulePre(PalletizingPackStockOutRequest request)
  6416. {
  6417. var res = new SRes();
  6418. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  6419. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  6420. {
  6421. res.ResMsg = "预占箱数已经大于设置值";
  6422. return res;
  6423. }
  6424. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  6425. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6426. 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
  6427. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  6428. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6429. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  6430. on stock.InDocsNo equals rule1.DocsNo
  6431. select new StockTemp
  6432. {
  6433. MatCode = stock.MatCode,
  6434. InvBarCode = stock.InvBarCode,
  6435. Grade = stock.Grade,
  6436. InvStateCode = stock.InvStateCode,
  6437. ProductTime = stock.ProductTime,
  6438. WbGroupCode = stock.WbGroupCode,
  6439. IsTorsChk = stock.IsTorsChk,
  6440. TorsChkQty = stock.TorsChkQty,
  6441. TorsChkValue = stock.TorsChkValue,
  6442. HoldTime = stock.HoldTime,
  6443. ProductMachCode = stock.ProductMachCode,
  6444. IsControlpanel = stock.IsControlpanel,
  6445. HWTypeCode = stock.HWTypeCode,
  6446. SolderCount = stock.SolderCount,
  6447. IsRework = stock.IsRework,
  6448. IsBlack = stock.IsBlack,
  6449. Col = loc.Col,
  6450. Layer = loc.Layer,
  6451. Shelf = loc.Shelf,
  6452. Depth = loc.Depth,
  6453. Code = loc.Code,
  6454. Tunnel = loc.Tunnel,
  6455. SCRel = loc.SCRel,
  6456. Floor = loc.Floor,
  6457. WarehouseCode = loc.WarehouseCode,
  6458. ContGrpBarCode = loc.ContGrpBarCode,
  6459. ContGrpId = loc.ContGrpId,
  6460. Id = loc.Id,
  6461. StateNum = loc.StateNum,
  6462. SkuCode = rule1.SkuCode,
  6463. Wind = stock.Wind,
  6464. InDocsNo = stock.InDocsNo,
  6465. BatchNo = stock.BatchNo
  6466. };
  6467. var wbConf = _sysconfigrepository.GetFirst(p => p.Code == "WbGroupConf").SContent.Split(',').ToList();//允许装到普通箱的检测箱机器组,多个机器组之间用英文格式逗号分隔
  6468. //查找满足时效但是没有全部检测完成的盘所在的机器组
  6469. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6470. 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)
  6471. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours && wbConf.Contains(p.WbGroupCode))
  6472. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6473. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  6474. on stock.InDocsNo equals rule1.DocsNo
  6475. select new StockTemp
  6476. {
  6477. MatCode = stock.MatCode,
  6478. InvBarCode = stock.InvBarCode,
  6479. Grade = stock.Grade,
  6480. InvStateCode = stock.InvStateCode,
  6481. ProductTime = stock.ProductTime,
  6482. WbGroupCode = stock.WbGroupCode,
  6483. IsTorsChk = stock.IsTorsChk,
  6484. TorsChkQty = stock.TorsChkQty,
  6485. TorsChkValue = stock.TorsChkValue,
  6486. HoldTime = stock.HoldTime,
  6487. ProductMachCode = stock.ProductMachCode,
  6488. IsControlpanel = stock.IsControlpanel,
  6489. HWTypeCode = stock.HWTypeCode,
  6490. SolderCount = stock.SolderCount,
  6491. IsRework = stock.IsRework,
  6492. IsBlack = stock.IsBlack,
  6493. Col = loc.Col,
  6494. Layer = loc.Layer,
  6495. Shelf = loc.Shelf,
  6496. Depth = loc.Depth,
  6497. Code = loc.Code,
  6498. Tunnel = loc.Tunnel,
  6499. SCRel = loc.SCRel,
  6500. Floor = loc.Floor,
  6501. WarehouseCode = loc.WarehouseCode,
  6502. ContGrpBarCode = loc.ContGrpBarCode,
  6503. ContGrpId = loc.ContGrpId,
  6504. Id = loc.Id,
  6505. StateNum = loc.StateNum,
  6506. SkuCode = rule1.SkuCode,
  6507. Wind = stock.Wind,
  6508. InDocsNo = stock.InDocsNo,
  6509. BatchNo = stock.BatchNo
  6510. };
  6511. invlist = invlist.Union(invlistTors);
  6512. if (!invlist.Any())
  6513. {
  6514. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  6515. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6516. res.ResMsg = "库存不足";
  6517. return res;
  6518. }
  6519. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  6520. invlist = invlist.Distinct(new CompareStock());
  6521. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  6522. if (tunlist.Any())
  6523. {
  6524. if (tunlist.Where(p => p.Default2 == "1").Any())
  6525. {
  6526. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6527. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6528. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  6529. }
  6530. if (tunlist.Where(p => p.Default2 == "2").Any())
  6531. {
  6532. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6533. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6534. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  6535. }
  6536. if (tunlist.Where(p => p.Default2 == "3").Any())
  6537. {
  6538. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6539. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  6540. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  6541. }
  6542. }
  6543. if (!invlist.Any())
  6544. {
  6545. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  6546. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6547. res.ResMsg = "禁用巷道后 | 库存不足";
  6548. return res;
  6549. }
  6550. var invlist2 = invlist;
  6551. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  6552. if (!sku.Any())
  6553. {
  6554. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  6555. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6556. res.ResMsg = "库中没有SKU或SKU不能为空";
  6557. return res;
  6558. }
  6559. var batchlist = invlist.Where(p => p.IsBlack == true).Select(p => p.BatchNo).Distinct().ToList();
  6560. //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));
  6561. 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));
  6562. if (!rulelist.Any())
  6563. {
  6564. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  6565. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  6566. _logger.LogInformation("非控制不满足装箱:" + msg);
  6567. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  6568. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  6569. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  6570. return res;
  6571. }
  6572. foreach (var item in sku)
  6573. {
  6574. //找库存中存在的批次
  6575. var batchlisttemp = invlist.Where(p => p.IsBlack == true && p.SkuCode == item.Key).Select(p => p.BatchNo).Distinct().ToList();
  6576. if (!batchlisttemp.Any())
  6577. {
  6578. string msg = "SKU:" + item.Key + ",没有黑盘";
  6579. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  6580. _logger.LogInformation("非控制不满足装箱:" + msg);
  6581. res.ResMsg = msg;
  6582. WreTimeOutRecord(invlist.Where(p => p.SkuCode == item.Key).Select(p => p.ContGrpBarCode).ToList(), "没有黑盘,SKU:" + item.Key);
  6583. continue;
  6584. }
  6585. 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);
  6586. if (!rules.Any())
  6587. {
  6588. string msg = "SKU:" + item.Key + "批次:" + JsonConvert.SerializeObject(batchlisttemp) + ",没有可用箱号";
  6589. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  6590. _logger.LogInformation("非控制不满足装箱:" + msg);
  6591. res.ResMsg = msg;
  6592. 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()));
  6593. continue;
  6594. }
  6595. var rulegroup = rules.GroupBy(p => new
  6596. {
  6597. p.Wind,
  6598. p.SpoolType,
  6599. p.FullCountQty,
  6600. p.DocsNo,
  6601. p.BatchNo
  6602. }).ToList();
  6603. foreach (var rulestem in rulegroup)
  6604. {
  6605. //先判断该单号下是否有黑盘,如果没有则直接跳过
  6606. if (!invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).Any())
  6607. {
  6608. WreTimeOutRecord(invlist.Where(p => p.IsBlack == false && p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), "该单号批次下没有黑盘" + rulestem.Key.DocsNo + ",批次:" + rulestem.Key.BatchNo);
  6609. continue;
  6610. }
  6611. var blackcounttemp = invlist.Where(p => p.SkuCode == item.Key && p.IsBlack == true && p.InDocsNo == rulestem.Key.DocsNo && p.BatchNo == rulestem.Key.BatchNo).Count();
  6612. if (rulestem.Key.SpoolType == "BS40" || rulestem.Key.SpoolType == "BS60")
  6613. {
  6614. if (blackcounttemp < 2)
  6615. {
  6616. 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);
  6617. continue;
  6618. }
  6619. }
  6620. //else
  6621. //{
  6622. //}
  6623. 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();
  6624. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  6625. List<string> equips = new List<string>();
  6626. foreach (var pp in sys)
  6627. {
  6628. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  6629. {
  6630. equips.Add(pp.Code);
  6631. }
  6632. }
  6633. if (!equips.Any())
  6634. {
  6635. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  6636. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  6637. //自动更新子托盘配置
  6638. foreach (var item1 in sys)
  6639. {
  6640. if (!item1.SContent.Contains(rule.TrayCode))
  6641. {
  6642. string con = item1.SContent + "," + rule.TrayCode;
  6643. _sysconfigrepository.AsUpdateable()
  6644. .SetColumns(p => new sxSysConfig() { SContent = con })
  6645. .Where(p => p.Id == item1.Id)
  6646. .ExecuteCommand();
  6647. }
  6648. }
  6649. continue;
  6650. }
  6651. //var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  6652. //if (!dev.Any())
  6653. //{
  6654. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key, Time = DateTime.Now });
  6655. // _logger.LogInformation(rule.TrayCode + "没有可用拆盘机" + "SKU:" + item.Key);
  6656. // WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestem.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  6657. // continue;
  6658. //}
  6659. //只有黑盘的机器组
  6660. 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();
  6661. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode && blackgrouplist.Contains(p.WbGroupCode)).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  6662. if (!wbgrouplist.Any())
  6663. {
  6664. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  6665. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  6666. continue;
  6667. }
  6668. ; //找到重绕盘,拼接进去,重绕盘不需要扭转
  6669. var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  6670. 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
  6671. && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  6672. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6673. where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  6674. select new StockTemp
  6675. {
  6676. MatCode = stock.MatCode,
  6677. InvBarCode = stock.InvBarCode,
  6678. Grade = stock.Grade,
  6679. InvStateCode = stock.InvStateCode,
  6680. ProductTime = stock.ProductTime,
  6681. WbGroupCode = stock.WbGroupCode,
  6682. IsTorsChk = stock.IsTorsChk,
  6683. TorsChkQty = stock.TorsChkQty,
  6684. TorsChkValue = stock.TorsChkValue,
  6685. HoldTime = stock.HoldTime,
  6686. InDocsNo = stock.InDocsNo,
  6687. ProductMachCode = stock.ProductMachCode,
  6688. IsControlpanel = stock.IsControlpanel,
  6689. HWTypeCode = stock.HWTypeCode,
  6690. SolderCount = stock.SolderCount,
  6691. IsRework = stock.IsRework,
  6692. IsBlack = stock.IsBlack,
  6693. Col = loc.Col,
  6694. Layer = loc.Layer,
  6695. Shelf = loc.Shelf,
  6696. Depth = loc.Depth,
  6697. Code = loc.Code,
  6698. Tunnel = loc.Tunnel,
  6699. SCRel = loc.SCRel,
  6700. Floor = loc.Floor,
  6701. WarehouseCode = loc.WarehouseCode,
  6702. ContGrpBarCode = loc.ContGrpBarCode,
  6703. ContGrpId = loc.ContGrpId,
  6704. Id = loc.Id,
  6705. StateNum = loc.StateNum,
  6706. SkuCode = "",
  6707. Wind = stock.Wind
  6708. };
  6709. //过滤重饶盘被禁用的巷道
  6710. invlistchongrao = invlistchongrao.Distinct();
  6711. if (tunlist.Any())
  6712. {
  6713. if (tunlist.Where(p => p.Default2 == "1").Any())
  6714. {
  6715. var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6716. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6717. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  6718. }
  6719. if (tunlist.Where(p => p.Default2 == "2").Any())
  6720. {
  6721. var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6722. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6723. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  6724. }
  6725. if (tunlist.Where(p => p.Default2 == "3").Any())
  6726. {
  6727. var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  6728. var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  6729. invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  6730. }
  6731. }
  6732. //重绕盘数量限制BS80 10个(30%);BS60 21个(30%);BS40 21个(30%)
  6733. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6734. {
  6735. invlistchongrao = invlistchongrao.Take(21);
  6736. }
  6737. else
  6738. {
  6739. invlistchongrao = invlistchongrao.Take(10);
  6740. }
  6741. var tempsign = false;
  6742. foreach (var wbgroup in wbgrouplist)
  6743. {
  6744. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  6745. //invlistchongrao = invlistchongrao.Where(p=>string.IsNullOrEmpty(p.WbGroupCode) || p.WbGroupCode == wbgroup.Key).OrderBy(p => p.ProductTime);
  6746. invlist2 = invlistchongrao.Union(invlist2);
  6747. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty && invlist2.Where(p => p.IsBlack == true).Any())
  6748. {
  6749. //tempsign = true;
  6750. //break;
  6751. }
  6752. else
  6753. {
  6754. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  6755. {
  6756. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有黑盘;SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind+",批次:"+rule.BatchNo);
  6757. }
  6758. else
  6759. {
  6760. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind + ",批次:" + rule.BatchNo);
  6761. }
  6762. continue;
  6763. }
  6764. if (!invlist2.Any())
  6765. {
  6766. string msg = "没有对应单号的库存,单号:" + rule.DocsNo + ",SKU:" + item.Key + ",绕向:" + rule.Wind + ",机器组:" + wbgroup.Key;
  6767. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  6768. _logger.LogInformation("非控制不满足装箱:" + msg);
  6769. res.ResMsg = msg;
  6770. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count());
  6771. continue;
  6772. }
  6773. if (!string.IsNullOrEmpty(rule.SpoolType))
  6774. {
  6775. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  6776. }
  6777. if (!string.IsNullOrEmpty(rule.Wind))
  6778. {
  6779. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  6780. }
  6781. //焊点、返工盘、黑盘一些基本属性筛选
  6782. int pro = 0;
  6783. //不再限制最后一箱黑盘数量,保持统一,BS60两个,BS80一个,2024-5-18
  6784. pro = 0;
  6785. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  6786. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6787. {
  6788. rule.BlackCount = int.Parse(blackcount.Default1);
  6789. }
  6790. else
  6791. {
  6792. rule.BlackCount = int.Parse(blackcount.Default2);
  6793. }
  6794. var blackinvlist = new List<StockTemp>();
  6795. if (pro == 1)
  6796. {
  6797. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo && p.BatchNo == rule.BatchNo).OrderBy(p => p.ProductTime).ToList();
  6798. if (!blackinvlist.Any())
  6799. {
  6800. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",批次:" + rule.BatchNo + "下的黑盘数量为0";
  6801. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  6802. _logger.LogInformation("非控制不满足装箱:" + msg);
  6803. res.ResMsg = msg;
  6804. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6805. continue;
  6806. }
  6807. blackinvlist = blackinvlist.Where(p => p.IsBlack == true).ToList();
  6808. }
  6809. else
  6810. {
  6811. blackinvlist = invlist2.Where(p => p.IsBlack == true && p.InDocsNo == rule.DocsNo && p.BatchNo == rule.BatchNo).OrderBy(p => p.ProductTime).ToList();
  6812. if (!blackinvlist.Any())
  6813. {
  6814. string msg = "SKU:" + rule.SkuCode + ",机器组:" + invlist2.First().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo +",批次:"+ rule.BatchNo + "下的黑盘数量为0";
  6815. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut13", new RedisErrorInfo() { Equip = "NoControlOut13", Con = msg, Time = DateTime.Now });
  6816. _logger.LogInformation("非控制不满足装箱:" + msg);
  6817. res.ResMsg = msg;
  6818. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6819. continue;
  6820. }
  6821. blackinvlist = blackinvlist.Take(rule.BlackCount).ToList();
  6822. }
  6823. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  6824. {
  6825. if (blackinvlist.Count <= 1)
  6826. {
  6827. string msg = "BS60工字轮黑盘数量至少2个,当前黑盘数量" + blackinvlist.Count + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向" + rule.Wind + "SKU:" + rule.SkuCode + ",单号:" + rule.DocsNo;
  6828. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut14", new RedisErrorInfo() { Equip = "NoControlOut14", Con = msg, Time = DateTime.Now });
  6829. _logger.LogInformation("非控制不满足装箱:" + msg);
  6830. res.ResMsg = msg;
  6831. WreTimeOutRecord(invlist2.Where(p => p.IsBlack == false && p.InDocsNo == rule.DocsNo).Select(p => p.ContGrpBarCode).ToList(), msg);
  6832. continue;
  6833. }
  6834. }
  6835. invlist2 = invlist2.Where(p => !blackinvlist.Select(q => q.ContGrpBarCode).Contains(p.ContGrpBarCode) && p.IsBlack == false).ToList();
  6836. var tempoutrecord = invlist2.ToList();
  6837. var solderinvlist = new List<StockTemp>();
  6838. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  6839. {
  6840. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  6841. var solcount = rulemaxcount - blackinvlist.Count;
  6842. if (solcount <= 0)
  6843. {
  6844. solcount = 0;
  6845. };
  6846. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  6847. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  6848. }
  6849. else
  6850. {
  6851. //不允许焊点盘
  6852. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  6853. }
  6854. var returninvlist = new List<StockTemp>();
  6855. if (rule.ReturnCount > 0)
  6856. {
  6857. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  6858. invlist2 = invlist2.Where(p => p.IsRework == false);
  6859. }
  6860. else
  6861. {
  6862. invlist2 = invlist2.Where(p => p.IsRework == false);
  6863. }
  6864. if (!invlist2.Any())
  6865. {
  6866. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  6867. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  6868. _logger.LogInformation("非控制不满足装箱:" + msg);
  6869. res.ResMsg = msg;
  6870. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  6871. continue;
  6872. }
  6873. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count + blackinvlist.Count) < rule.FullCountQty)
  6874. {
  6875. 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;
  6876. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  6877. _logger.LogInformation("非控制不满足装箱:" + msg);
  6878. res.ResMsg = msg;
  6879. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  6880. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6881. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6882. WreTimeOutRecord(blackinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  6883. continue;
  6884. }
  6885. //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;
  6886. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  6887. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 12); //12小时之内的按堆垛机平均分
  6888. #region 按照堆垛机平均分配任务
  6889. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count + blackinvlist.Count);//符合条件的普通盘数量
  6890. var mastinvlist = solderinvlist.Union(returninvlist).Union(blackinvlist);
  6891. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  6892. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  6893. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  6894. select new SrmTaskTmep
  6895. {
  6896. Srm = x.Key,
  6897. TaskCount = x.Count(),
  6898. LocList = x.Select(q => q.Code).ToList()
  6899. };
  6900. var srmtasktobe = new List<SrmTaskTmep>();
  6901. foreach (var srmlistitem in srmlist)
  6902. {
  6903. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  6904. {
  6905. srmtasktobe.Add(new SrmTaskTmep()
  6906. {
  6907. Srm = srmlistitem,
  6908. TaskCount = 0,
  6909. LocList = new List<string>()
  6910. });
  6911. }
  6912. }
  6913. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  6914. var srmtasktobetemplocs = new List<string>();
  6915. for (int i = 0; i < tempcount; i++)
  6916. {
  6917. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  6918. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  6919. foreach (var srmtasktobeitem in srmtasktobe)
  6920. {
  6921. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  6922. {
  6923. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  6924. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  6925. srmtasktobetemplocs.Add(first.Code);
  6926. break;
  6927. }
  6928. }
  6929. }
  6930. #endregion
  6931. var tempbuchong = new List<StockTemp>();
  6932. if (tempcount > srmtasktobetemplocs.Count())
  6933. {
  6934. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  6935. }
  6936. 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));
  6937. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist).Union(blackinvlist);
  6938. invlist2 = invlist2.Union(tempbuchong);
  6939. var finstocks = invlist2.ToList();
  6940. //最后验证数据
  6941. #region 最后验证数据
  6942. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  6943. {
  6944. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6945. continue;
  6946. }
  6947. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  6948. {
  6949. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6950. continue;
  6951. }
  6952. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  6953. {
  6954. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6955. continue;
  6956. }
  6957. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  6958. {
  6959. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", finstocks.Select(p=>p.WbGroupCode).ToList(), invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6960. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  6961. continue;
  6962. }
  6963. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  6964. {
  6965. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6966. continue;
  6967. }
  6968. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  6969. {
  6970. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6971. continue;
  6972. }
  6973. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  6974. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  6975. {
  6976. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  6977. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()) );
  6978. continue;
  6979. }
  6980. #endregion
  6981. #region Mes箱号校验
  6982. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  6983. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  6984. var reqids = Guid.NewGuid().ToString();
  6985. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  6986. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  6987. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  6988. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  6989. if (mesresponse.success == false)
  6990. {
  6991. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  6992. {
  6993. ZXStateCode = 2,
  6994. EditTime = DateTime.Now,
  6995. Memo = mesresponse.message
  6996. }, p => p.Id == rule.Id);
  6997. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  6998. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6999. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  7000. _logger.LogInformation(res.ResMsg);
  7001. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  7002. break;
  7003. }
  7004. else
  7005. {
  7006. try
  7007. {
  7008. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  7009. _db.BeginTran();
  7010. //非控制箱预占状态更新成4
  7011. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  7012. {
  7013. ZXStateCode = 4,
  7014. EditTime = DateTime.Now,
  7015. Memo = mesresponse.message
  7016. }, p => p.Id == rule.Id);
  7017. var presign = rule.Id.ToString();
  7018. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  7019. {
  7020. PreStock = presign,
  7021. EditTime = DateTime.Now,
  7022. Memo = "箱号预占用:" + rule.PBoxCode
  7023. }, p => listid.Contains(p.ContGrpId));
  7024. _db.CommitTran();
  7025. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  7026. }
  7027. catch (Exception ex)
  7028. {
  7029. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  7030. _db.RollbackTran();
  7031. }
  7032. return res;
  7033. }
  7034. #endregion
  7035. }
  7036. }
  7037. }
  7038. return res;
  7039. }
  7040. /// <summary>
  7041. /// 码垛SPC非控制装箱计算预占箱号-去掉黑盘和批次限制
  7042. /// </summary>
  7043. /// <param name="request"></param>
  7044. /// <returns></returns>
  7045. public SRes PalletizingSpcNotPackRulePre2(PalletizingPackStockOutRequest request)
  7046. {
  7047. var res = new SRes();
  7048. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  7049. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  7050. {
  7051. res.ResMsg = "预占箱数已经大于设置值";
  7052. return res;
  7053. }
  7054. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//超时时间配置
  7055. //获取库存列表
  7056. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7057. 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")
  7058. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  7059. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7060. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7061. on stock.InDocsNo equals rule1.DocsNo
  7062. select new StockTemp
  7063. {
  7064. MatCode = stock.MatCode,
  7065. InvBarCode = stock.InvBarCode,
  7066. Grade = stock.Grade,
  7067. InvStateCode = stock.InvStateCode,
  7068. ProductTime = stock.ProductTime,
  7069. WbGroupCode = stock.WbGroupCode,
  7070. IsTorsChk = stock.IsTorsChk,
  7071. TorsChkQty = stock.TorsChkQty,
  7072. TorsChkValue = stock.TorsChkValue,
  7073. HoldTime = stock.HoldTime,
  7074. ProductMachCode = stock.ProductMachCode,
  7075. IsControlpanel = stock.IsControlpanel,
  7076. HWTypeCode = stock.HWTypeCode,
  7077. SolderCount = stock.SolderCount,
  7078. IsRework = stock.IsRework,
  7079. IsBlack = stock.IsBlack,
  7080. Col = loc.Col,
  7081. Layer = loc.Layer,
  7082. Shelf = loc.Shelf,
  7083. Depth = loc.Depth,
  7084. Code = loc.Code,
  7085. Tunnel = loc.Tunnel,
  7086. SCRel = loc.SCRel,
  7087. Floor = loc.Floor,
  7088. WarehouseCode = loc.WarehouseCode,
  7089. ContGrpBarCode = loc.ContGrpBarCode,
  7090. ContGrpId = loc.ContGrpId,
  7091. Id = loc.Id,
  7092. StateNum = loc.StateNum,
  7093. SkuCode = rule1.SkuCode,
  7094. Wind = stock.Wind,
  7095. InDocsNo = stock.InDocsNo,
  7096. BatchNo = stock.BatchNo
  7097. };
  7098. var invlistchognrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7099. 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")
  7100. && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7101. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7102. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7103. on stock.InDocsNo equals rule1.DocsNo
  7104. select new StockTemp
  7105. {
  7106. MatCode = stock.MatCode,
  7107. InvBarCode = stock.InvBarCode,
  7108. Grade = stock.Grade,
  7109. InvStateCode = stock.InvStateCode,
  7110. ProductTime = stock.ProductTime,
  7111. WbGroupCode = stock.WbGroupCode,
  7112. IsTorsChk = stock.IsTorsChk,
  7113. TorsChkQty = stock.TorsChkQty,
  7114. TorsChkValue = stock.TorsChkValue,
  7115. HoldTime = stock.HoldTime,
  7116. ProductMachCode = stock.ProductMachCode,
  7117. IsControlpanel = stock.IsControlpanel,
  7118. HWTypeCode = stock.HWTypeCode,
  7119. SolderCount = stock.SolderCount,
  7120. IsRework = stock.IsRework,
  7121. IsBlack = stock.IsBlack,
  7122. Col = loc.Col,
  7123. Layer = loc.Layer,
  7124. Shelf = loc.Shelf,
  7125. Depth = loc.Depth,
  7126. Code = loc.Code,
  7127. Tunnel = loc.Tunnel,
  7128. SCRel = loc.SCRel,
  7129. Floor = loc.Floor,
  7130. WarehouseCode = loc.WarehouseCode,
  7131. ContGrpBarCode = loc.ContGrpBarCode,
  7132. ContGrpId = loc.ContGrpId,
  7133. Id = loc.Id,
  7134. StateNum = loc.StateNum,
  7135. SkuCode = rule1.SkuCode,
  7136. Wind = stock.Wind,
  7137. InDocsNo = stock.InDocsNo,
  7138. BatchNo = stock.BatchNo
  7139. };
  7140. //查找满足时效但是没有全部检测完成的盘所在的机器组
  7141. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7142. 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")
  7143. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  7144. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7145. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7146. on stock.InDocsNo equals rule1.DocsNo
  7147. select new StockTemp
  7148. {
  7149. MatCode = stock.MatCode,
  7150. InvBarCode = stock.InvBarCode,
  7151. Grade = stock.Grade,
  7152. InvStateCode = stock.InvStateCode,
  7153. ProductTime = stock.ProductTime,
  7154. WbGroupCode = stock.WbGroupCode,
  7155. IsTorsChk = stock.IsTorsChk,
  7156. TorsChkQty = stock.TorsChkQty,
  7157. TorsChkValue = stock.TorsChkValue,
  7158. HoldTime = stock.HoldTime,
  7159. ProductMachCode = stock.ProductMachCode,
  7160. IsControlpanel = stock.IsControlpanel,
  7161. HWTypeCode = stock.HWTypeCode,
  7162. SolderCount = stock.SolderCount,
  7163. IsRework = stock.IsRework,
  7164. IsBlack = stock.IsBlack,
  7165. Col = loc.Col,
  7166. Layer = loc.Layer,
  7167. Shelf = loc.Shelf,
  7168. Depth = loc.Depth,
  7169. Code = loc.Code,
  7170. Tunnel = loc.Tunnel,
  7171. SCRel = loc.SCRel,
  7172. Floor = loc.Floor,
  7173. WarehouseCode = loc.WarehouseCode,
  7174. ContGrpBarCode = loc.ContGrpBarCode,
  7175. ContGrpId = loc.ContGrpId,
  7176. Id = loc.Id,
  7177. StateNum = loc.StateNum,
  7178. SkuCode = rule1.SkuCode,
  7179. Wind = stock.Wind,
  7180. InDocsNo = stock.InDocsNo,
  7181. BatchNo = stock.BatchNo
  7182. };
  7183. var invlistTorschongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7184. 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")
  7185. && p.ContUsageQty <= 0 && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7186. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7187. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  7188. on stock.InDocsNo equals rule1.DocsNo
  7189. select new StockTemp
  7190. {
  7191. MatCode = stock.MatCode,
  7192. InvBarCode = stock.InvBarCode,
  7193. Grade = stock.Grade,
  7194. InvStateCode = stock.InvStateCode,
  7195. ProductTime = stock.ProductTime,
  7196. WbGroupCode = stock.WbGroupCode,
  7197. IsTorsChk = stock.IsTorsChk,
  7198. TorsChkQty = stock.TorsChkQty,
  7199. TorsChkValue = stock.TorsChkValue,
  7200. HoldTime = stock.HoldTime,
  7201. ProductMachCode = stock.ProductMachCode,
  7202. IsControlpanel = stock.IsControlpanel,
  7203. HWTypeCode = stock.HWTypeCode,
  7204. SolderCount = stock.SolderCount,
  7205. IsRework = stock.IsRework,
  7206. IsBlack = stock.IsBlack,
  7207. Col = loc.Col,
  7208. Layer = loc.Layer,
  7209. Shelf = loc.Shelf,
  7210. Depth = loc.Depth,
  7211. Code = loc.Code,
  7212. Tunnel = loc.Tunnel,
  7213. SCRel = loc.SCRel,
  7214. Floor = loc.Floor,
  7215. WarehouseCode = loc.WarehouseCode,
  7216. ContGrpBarCode = loc.ContGrpBarCode,
  7217. ContGrpId = loc.ContGrpId,
  7218. Id = loc.Id,
  7219. StateNum = loc.StateNum,
  7220. SkuCode = rule1.SkuCode,
  7221. Wind = stock.Wind,
  7222. InDocsNo = stock.InDocsNo,
  7223. BatchNo = stock.BatchNo
  7224. };
  7225. invlist = invlist.Union(invlistchognrao);
  7226. invlist = invlist.Union(invlistTors);
  7227. invlist = invlist.Union(invlistTorschongrao);
  7228. if (!invlist.Any())
  7229. {
  7230. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  7231. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7232. res.ResMsg = "库存不足";
  7233. return res;
  7234. }
  7235. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  7236. invlist = invlist.Distinct(new CompareStock());
  7237. //禁用巷道过滤
  7238. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  7239. if (tunlist.Any())
  7240. {
  7241. if (tunlist.Where(p => p.Default2 == "1").Any())
  7242. {
  7243. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7244. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7245. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  7246. }
  7247. if (tunlist.Where(p => p.Default2 == "2").Any())
  7248. {
  7249. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7250. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7251. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  7252. }
  7253. if (tunlist.Where(p => p.Default2 == "3").Any())
  7254. {
  7255. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7256. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  7257. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  7258. }
  7259. }
  7260. if (!invlist.Any())
  7261. {
  7262. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  7263. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7264. res.ResMsg = "禁用巷道后 | 库存不足";
  7265. return res;
  7266. }
  7267. var invlist2 = invlist;
  7268. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  7269. if (!sku.Any())
  7270. {
  7271. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  7272. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7273. res.ResMsg = "库中没有SKU或SKU不能为空";
  7274. return res;
  7275. }
  7276. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36));
  7277. if (!rulelist.Any())
  7278. {
  7279. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  7280. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  7281. _logger.LogInformation("非控制不满足装箱:" + msg);
  7282. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  7283. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  7284. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  7285. return res;
  7286. }
  7287. //SKU循环
  7288. foreach (var item in sku)
  7289. {
  7290. //满足sku下的箱号列表
  7291. 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);
  7292. if (!rules.Any())
  7293. {
  7294. string msg = "SKU:" + item.Key + ",没有可用箱号";
  7295. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  7296. _logger.LogInformation("非控制不满足装箱:" + msg);
  7297. res.ResMsg = msg;
  7298. 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()));
  7299. continue;
  7300. }
  7301. var rulegroup = rules.GroupBy(p => new
  7302. {
  7303. p.Wind,
  7304. p.SpoolType,
  7305. p.FullCountQty
  7306. }).ToList();
  7307. //绕向、工字轮循环
  7308. foreach (var rulestem in rulegroup)
  7309. {
  7310. // 满足sku、绕向、工字轮规格、满箱个数的箱号列表
  7311. 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();
  7312. //拆盘机配置,可用于禁用拆盘机
  7313. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  7314. List<string> equips = new List<string>();
  7315. foreach (var pp in sys)
  7316. {
  7317. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  7318. {
  7319. equips.Add(pp.Code);
  7320. }
  7321. }
  7322. if (!equips.Any())
  7323. {
  7324. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  7325. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  7326. //自动更新子托盘配置,不需要手动配置
  7327. foreach (var item1 in sys)
  7328. {
  7329. if (!item1.SContent.Contains(rule.TrayCode))
  7330. {
  7331. string con = item1.SContent + "," + rule.TrayCode;
  7332. _sysconfigrepository.AsUpdateable()
  7333. .SetColumns(p => new sxSysConfig() { SContent = con })
  7334. .Where(p => p.Id == item1.Id)
  7335. .ExecuteCommand();
  7336. }
  7337. }
  7338. continue;
  7339. }
  7340. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  7341. if (!wbgrouplist.Any())
  7342. {
  7343. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  7344. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  7345. continue;
  7346. }
  7347. #region 重绕盘老规则
  7348. //找到重绕盘,拼接进去,重绕盘不需要扭转
  7349. //var invlistchongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7350. // 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
  7351. // && item.Key.StartsWith(p.MatCode) && p.Wind == rule.Wind && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  7352. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7353. // where rule.SkuCode.StartsWith(stock.MatCode) && stock.HWTypeCode == rule.SpoolType
  7354. // select new StockTemp
  7355. // {
  7356. // MatCode = stock.MatCode,
  7357. // InvBarCode = stock.InvBarCode,
  7358. // Grade = stock.Grade,
  7359. // InvStateCode = stock.InvStateCode,
  7360. // ProductTime = stock.ProductTime,
  7361. // WbGroupCode = stock.WbGroupCode,
  7362. // IsTorsChk = stock.IsTorsChk,
  7363. // TorsChkQty = stock.TorsChkQty,
  7364. // TorsChkValue = stock.TorsChkValue,
  7365. // HoldTime = stock.HoldTime,
  7366. // InDocsNo = stock.InDocsNo,
  7367. // ProductMachCode = stock.ProductMachCode,
  7368. // IsControlpanel = stock.IsControlpanel,
  7369. // HWTypeCode = stock.HWTypeCode,
  7370. // SolderCount = stock.SolderCount,
  7371. // IsRework = stock.IsRework,
  7372. // IsBlack = stock.IsBlack,
  7373. // Col = loc.Col,
  7374. // Layer = loc.Layer,
  7375. // Shelf = loc.Shelf,
  7376. // Depth = loc.Depth,
  7377. // Code = loc.Code,
  7378. // Tunnel = loc.Tunnel,
  7379. // SCRel = loc.SCRel,
  7380. // Floor = loc.Floor,
  7381. // WarehouseCode = loc.WarehouseCode,
  7382. // ContGrpBarCode = loc.ContGrpBarCode,
  7383. // ContGrpId = loc.ContGrpId,
  7384. // Id = loc.Id,
  7385. // StateNum = loc.StateNum,
  7386. // SkuCode = "",
  7387. // Wind = stock.Wind
  7388. // };
  7389. //过滤重饶盘被禁用的巷道
  7390. //invlistchongrao = invlistchongrao.Distinct();
  7391. //if (tunlist.Any())
  7392. //{
  7393. // if (tunlist.Where(p => p.Default2 == "1").Any())
  7394. // {
  7395. // var inv1 = invlistchongrao.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7396. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7397. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  7398. // }
  7399. // if (tunlist.Where(p => p.Default2 == "2").Any())
  7400. // {
  7401. // var inv1 = invlistchongrao.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7402. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7403. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  7404. // }
  7405. // if (tunlist.Where(p => p.Default2 == "3").Any())
  7406. // {
  7407. // var inv1 = invlistchongrao.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  7408. // var inv2 = inv1.Select(p => p.ContGrpBarCode).ToList();
  7409. // invlistchongrao = invlistchongrao.Where(p => !inv2.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  7410. // }
  7411. //}
  7412. //重绕盘数量限制BS80 10个(30%);BS60 21个(30%);BS40 21个(30%)
  7413. //if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  7414. //{
  7415. // invlistchongrao = invlistchongrao.Take(21);
  7416. //}
  7417. //else
  7418. //{
  7419. // invlistchongrao = invlistchongrao.Take(10);
  7420. //}
  7421. #endregion
  7422. ;
  7423. //机器组循环
  7424. foreach (var wbgroup in wbgrouplist)
  7425. {
  7426. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  7427. //invlist2 = invlistchongrao.Union(invlist2);
  7428. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty )
  7429. {
  7430. }
  7431. else
  7432. {
  7433. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  7434. continue;
  7435. }
  7436. if (!string.IsNullOrEmpty(rule.SpoolType))
  7437. {
  7438. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  7439. }
  7440. if (!string.IsNullOrEmpty(rule.Wind))
  7441. {
  7442. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  7443. }
  7444. //焊点属性筛选
  7445. var tempoutrecord = invlist2.ToList();
  7446. var solderinvlist = new List<StockTemp>();
  7447. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  7448. {
  7449. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  7450. var solcount = rulemaxcount;
  7451. if (solcount <= 0)
  7452. {
  7453. solcount = 0;
  7454. };
  7455. solderinvlist = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(solcount).ToList();
  7456. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  7457. }
  7458. else
  7459. {
  7460. //不允许焊点盘
  7461. invlist2 = invlist2.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  7462. }
  7463. var returninvlist = new List<StockTemp>();
  7464. if (rule.ReturnCount > 0)
  7465. {
  7466. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  7467. invlist2 = invlist2.Where(p => p.IsRework == false);
  7468. }
  7469. else
  7470. {
  7471. invlist2 = invlist2.Where(p => p.IsRework == false);
  7472. }
  7473. if (!invlist2.Any())
  7474. {
  7475. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  7476. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  7477. _logger.LogInformation("非控制不满足装箱:" + msg);
  7478. res.ResMsg = msg;
  7479. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  7480. continue;
  7481. }
  7482. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count) < rule.FullCountQty)
  7483. {
  7484. 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;
  7485. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  7486. _logger.LogInformation("非控制不满足装箱:" + msg);
  7487. res.ResMsg = msg;
  7488. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  7489. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  7490. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  7491. continue;
  7492. }
  7493. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  7494. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 72); //72小时之内的按堆垛机平均分
  7495. #region 按照堆垛机平均分配任务,6小时之内
  7496. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count);//符合条件的普通盘数量
  7497. var mastinvlist = solderinvlist.Union(returninvlist);
  7498. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  7499. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  7500. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  7501. select new SrmTaskTmep
  7502. {
  7503. Srm = x.Key,
  7504. TaskCount = x.Count(),
  7505. LocList = x.Select(q => q.Code).ToList()
  7506. };
  7507. var srmtasktobe = new List<SrmTaskTmep>();
  7508. foreach (var srmlistitem in srmlist)
  7509. {
  7510. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  7511. {
  7512. srmtasktobe.Add(new SrmTaskTmep()
  7513. {
  7514. Srm = srmlistitem,
  7515. TaskCount = 0,
  7516. LocList = new List<string>()
  7517. });
  7518. }
  7519. }
  7520. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  7521. var srmtasktobetemplocs = new List<string>();
  7522. for (int i = 0; i < tempcount; i++)
  7523. {
  7524. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  7525. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  7526. foreach (var srmtasktobeitem in srmtasktobe)
  7527. {
  7528. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  7529. {
  7530. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  7531. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  7532. srmtasktobetemplocs.Add(first.Code);
  7533. break;
  7534. }
  7535. }
  7536. }
  7537. #endregion
  7538. var tempbuchong = new List<StockTemp>();
  7539. if (tempcount > srmtasktobetemplocs.Count())
  7540. {
  7541. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  7542. }
  7543. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count));
  7544. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist);
  7545. invlist2 = invlist2.Union(tempbuchong);
  7546. var finstocks = invlist2.ToList();
  7547. //最后验证数据
  7548. #region 最后验证数据
  7549. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  7550. {
  7551. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7552. continue;
  7553. }
  7554. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  7555. {
  7556. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7557. continue;
  7558. }
  7559. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  7560. {
  7561. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7562. continue;
  7563. }
  7564. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  7565. {
  7566. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7567. continue;
  7568. }
  7569. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  7570. {
  7571. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7572. continue;
  7573. }
  7574. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  7575. {
  7576. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7577. continue;
  7578. }
  7579. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  7580. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  7581. {
  7582. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  7583. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  7584. continue;
  7585. }
  7586. #endregion
  7587. #region Mes箱号校验
  7588. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  7589. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  7590. var reqids = Guid.NewGuid().ToString();
  7591. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  7592. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  7593. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  7594. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  7595. if (mesresponse.success == false)
  7596. {
  7597. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  7598. {
  7599. ZXStateCode = 2,
  7600. EditTime = DateTime.Now,
  7601. Memo = mesresponse.message
  7602. }, p => p.Id == rule.Id);
  7603. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  7604. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  7605. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  7606. _logger.LogInformation(res.ResMsg);
  7607. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  7608. break;
  7609. }
  7610. else
  7611. {
  7612. try
  7613. {
  7614. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  7615. _db.BeginTran();
  7616. //非控制箱预占状态更新成4
  7617. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  7618. {
  7619. ZXStateCode = 4,
  7620. EditTime = DateTime.Now,
  7621. Memo = mesresponse.message
  7622. }, p => p.Id == rule.Id);
  7623. var presign = rule.Id.ToString();
  7624. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  7625. {
  7626. PreStock = presign,
  7627. EditTime = DateTime.Now,
  7628. Memo = "箱号预占用:" + rule.PBoxCode
  7629. }, p => listid.Contains(p.ContGrpId));
  7630. _db.CommitTran();
  7631. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  7632. }
  7633. catch (Exception ex)
  7634. {
  7635. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  7636. _db.RollbackTran();
  7637. }
  7638. return res;
  7639. }
  7640. #endregion
  7641. }
  7642. }
  7643. }
  7644. return res;
  7645. }
  7646. /// <summary>
  7647. /// 码垛SPC控制装箱(缓存底托)
  7648. /// </summary>
  7649. /// <param name="request"></param>
  7650. /// <returns></returns>
  7651. public SRes PalletizingSpcPackStockOut2(PalletizingPackStockOutRequest request)
  7652. {
  7653. var res = new SRes();
  7654. var timesign = IdFactory.NewId();
  7655. _logger.LogInformation("控制计时埋点1" + timesign);
  7656. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  7657. if (palletlist.Any())
  7658. {
  7659. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  7660. if (maxtaskStemp.Any())
  7661. {
  7662. var maxtaskcount = (from tas in maxtaskStemp
  7663. select new TunnelCountTemp()
  7664. {
  7665. Tunnel = tas.Key,
  7666. Count = tas.Count()
  7667. }).ToList();
  7668. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  7669. }
  7670. //箱之间状态卡控限制标识
  7671. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  7672. //某个机械手最大下发的限制状态任务数量
  7673. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  7674. foreach (var item in palletlist)
  7675. {
  7676. //判断任务数量
  7677. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  7678. {
  7679. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  7680. continue;
  7681. }
  7682. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  7683. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  7684. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  7685. {
  7686. //判断是否是第三箱
  7687. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  7688. {
  7689. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  7690. if (item.Id == thirdbox)//第3箱子
  7691. {
  7692. 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())
  7693. {
  7694. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  7695. continue;
  7696. }
  7697. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  7698. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  7699. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  7700. {
  7701. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  7702. continue;
  7703. }
  7704. }
  7705. else if (item.Id > thirdbox)
  7706. {
  7707. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:"+ item.Id);
  7708. continue;
  7709. }
  7710. }
  7711. }
  7712. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  7713. if (equips == null)
  7714. {
  7715. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut2", new RedisErrorInfo() { Equip = "ControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  7716. continue;
  7717. }
  7718. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  7719. if (!palletMach.Any())
  7720. {
  7721. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut3", new RedisErrorInfo() { Equip = "ControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  7722. continue;
  7723. }
  7724. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  7725. var curdocid = maxdocid + 1;
  7726. if (palletMach.Any())
  7727. {
  7728. var pid = palletMach.First().PalletizingId;
  7729. 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)
  7730. {
  7731. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  7732. }
  7733. }
  7734. foreach (var pallets in palletMach)
  7735. {
  7736. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7737. if (cell == null)
  7738. {
  7739. continue;
  7740. }
  7741. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7742. if (invs == null)
  7743. {
  7744. continue;
  7745. }
  7746. var root = "";
  7747. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  7748. {
  7749. root = "Robot1";
  7750. }
  7751. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  7752. {
  7753. root = "Robot2";
  7754. }
  7755. //先判断二升位是否能出库
  7756. if (cell.Depth == 2)
  7757. {
  7758. var respon = MoveTask(cell.Code);
  7759. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7760. {
  7761. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7762. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态," + respon.ResMsg);
  7763. continue;
  7764. }
  7765. }
  7766. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7767. {
  7768. Code = pallets.ContBarCode,
  7769. CellCode = cell.Code,
  7770. Srm = cell.SCRel,
  7771. Tunnel = cell.Tunnel.ToString(),
  7772. Floor = cell.Floor,
  7773. Grade = invs.Grade,
  7774. Mater = invs.MatCode,
  7775. SkuCode = pallets.SkuCode,
  7776. PalletLayer = 0,
  7777. ProductMachCode = invs.ProductMachCode,
  7778. Equip = item.Equip,
  7779. PalletizingId = item.Id,
  7780. Robot = root,
  7781. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  7782. DocId = curdocid
  7783. });
  7784. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7785. {
  7786. _logger.LogInformation(cell.Code + "下发装箱任务失败," + taskresponse.ResMsg);
  7787. continue;
  7788. }
  7789. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7790. {
  7791. Istask = 1,
  7792. Layer = 0
  7793. }, p => p.ContBarCode == invs.ContGrpBarCode);
  7794. }
  7795. //下完任务后将标识值加1
  7796. 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);
  7797. taskflag = taskflag + 1;
  7798. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  7799. #region 分层下任务暂时不用
  7800. //if (tasklayer != 12 && tasklayer < 12)
  7801. //{
  7802. // palletMach = palletMach.Take(12 - tasklayer);
  7803. // foreach (var pallets in palletMach)
  7804. // {
  7805. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7806. // if (cell == null)
  7807. // {
  7808. // continue;
  7809. // }
  7810. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7811. // if (invs == null)
  7812. // {
  7813. // continue;
  7814. // }
  7815. // var root = "";
  7816. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  7817. // {
  7818. // root = "Robot1";
  7819. // }
  7820. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  7821. // {
  7822. // root = "Robot2";
  7823. // }
  7824. // //先判断二升位是否能出库
  7825. // if (cell.Depth == 2)
  7826. // {
  7827. // var respon = MoveTask(cell.Code);
  7828. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7829. // {
  7830. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7831. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  7832. // continue;
  7833. // }
  7834. // }
  7835. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7836. // {
  7837. // Code = pallets.ContBarCode,
  7838. // CellCode = cell.Code,
  7839. // Srm = cell.SCRel,
  7840. // Tunnel = cell.Tunnel.ToString(),
  7841. // Floor = cell.Floor,
  7842. // Grade = invs.Grade,
  7843. // Mater = invs.MatCode,
  7844. // SkuCode = pallets.SkuCode,
  7845. // PalletLayer = curlayer,
  7846. // ProductMachCode = invs.ProductMachCode,
  7847. // Equip = item.Equip,
  7848. // PalletizingId = item.Id,
  7849. // Robot = root,
  7850. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  7851. // });
  7852. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7853. // {
  7854. // continue;
  7855. // }
  7856. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7857. // {
  7858. // Istask = 1,
  7859. // Layer = curlayer
  7860. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  7861. // }
  7862. // //return res;
  7863. //}
  7864. //else
  7865. //{
  7866. // foreach (var pallets in palletMach)
  7867. // {
  7868. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  7869. // if (cell == null)
  7870. // {
  7871. // continue;
  7872. // }
  7873. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7874. // if (invs == null)
  7875. // {
  7876. // continue;
  7877. // }
  7878. // var root = "";
  7879. // if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  7880. // {
  7881. // root = "Robot1";
  7882. // }
  7883. // else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  7884. // {
  7885. // root = "Robot2";
  7886. // }
  7887. // //先判断二升位是否能出库
  7888. // if (cell.Depth == 2)
  7889. // {
  7890. // var respon = MoveTask(cell.Code);
  7891. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7892. // {
  7893. // RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  7894. // _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  7895. // continue;
  7896. // }
  7897. // }
  7898. // var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  7899. // {
  7900. // Code = pallets.ContBarCode,
  7901. // CellCode = cell.Code,
  7902. // Srm = cell.SCRel,
  7903. // Tunnel = cell.Tunnel.ToString(),
  7904. // Floor = cell.Floor,
  7905. // Grade = invs.Grade,
  7906. // Mater = invs.MatCode,
  7907. // SkuCode = pallets.SkuCode,
  7908. // PalletLayer = curlayer + 1,
  7909. // ProductMachCode = invs.ProductMachCode,
  7910. // Equip = item.Equip,
  7911. // PalletizingId = item.Id,
  7912. // Robot = root,
  7913. // GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  7914. // });
  7915. // if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  7916. // {
  7917. // continue;
  7918. // }
  7919. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  7920. // {
  7921. // Istask = 1,
  7922. // Layer = curlayer + 1
  7923. // }, p => p.ContBarCode == invs.ContGrpBarCode);
  7924. // }
  7925. // //return res;
  7926. //}
  7927. #endregion
  7928. }
  7929. }
  7930. _logger.LogInformation("控制计时埋点2" + timesign);
  7931. //待码垛箱任务下发
  7932. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  7933. if (palletlisttobe.Any())
  7934. {
  7935. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  7936. {
  7937. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  7938. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  7939. {
  7940. _palletizrepository.AsUpdateable()
  7941. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  7942. .Where(p => p.Id == item.Id)
  7943. .ExecuteCommand();
  7944. }
  7945. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  7946. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  7947. {
  7948. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  7949. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  7950. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  7951. {
  7952. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  7953. continue;
  7954. }
  7955. //箱之间状态卡控限制标识
  7956. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  7957. //判断任务数量
  7958. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  7959. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  7960. {
  7961. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  7962. continue;
  7963. }
  7964. 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()
  7965. {
  7966. //判断是否是第三箱
  7967. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  7968. {
  7969. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  7970. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  7971. if (item.Id == thirdbox)//第3箱子
  7972. {
  7973. 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())
  7974. {
  7975. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  7976. continue;
  7977. }
  7978. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  7979. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  7980. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  7981. {
  7982. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  7983. continue;
  7984. }
  7985. }
  7986. else if (item.Id > thirdbox)
  7987. {
  7988. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  7989. continue;
  7990. }
  7991. }
  7992. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  7993. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)//先控制只多下发一层1个任务
  7994. {
  7995. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  7996. if (!palletMach.Any())
  7997. {
  7998. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  7999. continue;
  8000. }
  8001. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  8002. var curdocid = maxdocid + 1;
  8003. if (palletMach.Any())
  8004. {
  8005. var pid = palletMach.First().PalletizingId;
  8006. 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)
  8007. {
  8008. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  8009. }
  8010. }
  8011. foreach (var pallets in palletMach)
  8012. {
  8013. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  8014. if (cell == null)
  8015. {
  8016. continue;
  8017. }
  8018. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8019. if (invs == null)
  8020. {
  8021. continue;
  8022. }
  8023. var root = "";
  8024. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  8025. {
  8026. root = "Robot1";
  8027. }
  8028. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  8029. {
  8030. root = "Robot2";
  8031. }
  8032. //先判断二升位是否能出库
  8033. if (cell.Depth == 2)
  8034. {
  8035. var respon = MoveTask(cell.Code);
  8036. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  8037. {
  8038. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  8039. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  8040. continue;
  8041. }
  8042. }
  8043. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  8044. {
  8045. Code = pallets.ContBarCode,
  8046. CellCode = cell.Code,
  8047. Srm = cell.SCRel,
  8048. Tunnel = cell.Tunnel.ToString(),
  8049. Floor = cell.Floor,
  8050. Grade = invs.Grade,
  8051. Mater = invs.MatCode,
  8052. SkuCode = pallets.SkuCode,
  8053. PalletLayer = 0,
  8054. ProductMachCode = invs.ProductMachCode,
  8055. Equip = item.Equip,
  8056. PalletizingId = item.Id,
  8057. Robot = root,
  8058. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  8059. DocId = curdocid
  8060. });
  8061. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8062. {
  8063. continue;
  8064. }
  8065. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8066. {
  8067. Istask = 1,
  8068. Layer = 0
  8069. }, p => p.ContBarCode == invs.ContGrpBarCode);
  8070. }
  8071. //下完任务后将标识值加1
  8072. 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);
  8073. taskflag = taskflag + 1;
  8074. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  8075. }
  8076. }
  8077. }
  8078. else
  8079. {
  8080. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  8081. //{
  8082. // PalletizState = 0
  8083. //}, p => p.Id == item.Id);
  8084. _palletizrepository.AsUpdateable()
  8085. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  8086. .Where(p => p.Id == item.Id)
  8087. .ExecuteCommand();
  8088. }
  8089. }
  8090. }
  8091. _logger.LogInformation("控制计时埋点3" + timesign);
  8092. //取视图码垛设备号
  8093. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  8094. var iscontinue = false;
  8095. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))//一个码垛位只能有一个进行中搬运任务,Memo标识
  8096. {
  8097. if (string.IsNullOrEmpty(palletequip.Default1))
  8098. {
  8099. if (!string.IsNullOrEmpty(palletequip.Default3))
  8100. {
  8101. //机械手交叉下任务需求
  8102. //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)
  8103. //{
  8104. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  8105. // 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();
  8106. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8107. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8108. // {
  8109. // }
  8110. // else
  8111. // {
  8112. // iscontinue = false;
  8113. // continue;
  8114. // }
  8115. //}
  8116. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  8117. 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)
  8118. {
  8119. //如果较小的工位已经没有任务那么,则继续下该工位任务
  8120. 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();
  8121. if (minequ != null)
  8122. {
  8123. if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8124. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8125. {
  8126. }
  8127. else
  8128. {
  8129. iscontinue = false;
  8130. continue;
  8131. }
  8132. }
  8133. }
  8134. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  8135. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8136. if (preinvlist.Any())
  8137. {
  8138. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  8139. {
  8140. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8141. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  8142. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  8143. return res;
  8144. }
  8145. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  8146. //码垛信息校验
  8147. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  8148. {
  8149. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8150. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  8151. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  8152. return res;
  8153. }
  8154. var root = "";
  8155. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  8156. {
  8157. root = "Robot1";
  8158. }
  8159. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  8160. {
  8161. root = "Robot2";
  8162. }
  8163. var pallet = new Palletizing()
  8164. {
  8165. PalletMax = rule.FullCountQty,
  8166. PalletizState = 0,
  8167. Equip = palletequip.Code,
  8168. Finish = 0,
  8169. AddWho = "",
  8170. EditWho = "",
  8171. BoxRule = rule.PackRule,
  8172. BoxRuleId = rule.Id,
  8173. IsControlpanel = true,
  8174. TaskNum = int.Parse(palletequip.Default3),
  8175. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  8176. Robot = root
  8177. };
  8178. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8179. if (pallects.Id == 0)
  8180. {
  8181. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8182. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  8183. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  8184. return res;
  8185. }
  8186. var palletizId = pallects.Id;
  8187. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  8188. {
  8189. ZXStateCode = 1
  8190. }, p => p.Id == rule.Id);
  8191. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8192. foreach (var invs in preinvlist)
  8193. {
  8194. var palletlayer = new PalletLayerMath()
  8195. {
  8196. PalletizingId = palletizId,
  8197. ContGrpId = (long)invs.ContGrpId,
  8198. ContBarCode = invs.ContGrpBarCode,
  8199. Layer = 0,
  8200. SkuCode = rule.SkuCode,
  8201. Finish = 0,
  8202. PboxruleId = rule.Id,
  8203. Istask = 0,
  8204. Palletequip = palletequip.Code,
  8205. Depth = invs.Depth,
  8206. IsBlack = invs.IsBlack,
  8207. SolderCount = invs.SolderCount,
  8208. BoxCode = rule.PBoxCode,
  8209. Wbgroup = invs.WbGroupCode,
  8210. StockDonse = invs.InDocsNo,
  8211. BoxDonse = rule.DocsNo
  8212. };
  8213. math.Add(palletlayer);
  8214. }
  8215. _palletlayerMathrepository.InsertRange(math);
  8216. //把库存预锁标志更新掉
  8217. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8218. {
  8219. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  8220. BomMatCode = "",
  8221. PreStock = "1"
  8222. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  8223. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  8224. res.ResMsg = "控制捞取预锁库存处理成功";
  8225. return res;
  8226. }
  8227. else
  8228. {
  8229. iscontinue = false;
  8230. continue;
  8231. }
  8232. }
  8233. if (string.IsNullOrEmpty(palletequip.Cache1State))
  8234. {
  8235. iscontinue = true;
  8236. break;
  8237. }
  8238. else
  8239. {
  8240. iscontinue = false;
  8241. continue;
  8242. }
  8243. }
  8244. else
  8245. {
  8246. if (!string.IsNullOrEmpty(palletequip.Default3))
  8247. {
  8248. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  8249. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8250. if (preinvlist.Any())
  8251. {
  8252. //机械手交叉下任务需求
  8253. //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)
  8254. //{
  8255. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  8256. // 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();
  8257. // if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8258. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8259. // {
  8260. // }
  8261. // else
  8262. // {
  8263. // iscontinue = false;
  8264. // continue;
  8265. // }
  8266. //}
  8267. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  8268. 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)
  8269. {
  8270. //如果较小的工位已经没有任务那么,则继续下该工位任务
  8271. 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();
  8272. if (minequ != null)
  8273. {
  8274. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  8275. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  8276. {
  8277. }
  8278. else
  8279. {
  8280. iscontinue = false;
  8281. continue;
  8282. }
  8283. }
  8284. }
  8285. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  8286. {
  8287. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8288. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  8289. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  8290. return res;
  8291. }
  8292. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  8293. //码垛信息校验
  8294. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  8295. {
  8296. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8297. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  8298. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  8299. return res;
  8300. }
  8301. var root = "";
  8302. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  8303. {
  8304. root = "Robot1";
  8305. }
  8306. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  8307. {
  8308. root = "Robot2";
  8309. }
  8310. var pallet = new Palletizing()
  8311. {
  8312. PalletMax = rule.FullCountQty,
  8313. PalletizState = 2,
  8314. Equip = palletequip.Code,
  8315. Finish = 0,
  8316. AddWho = "",
  8317. EditWho = "",
  8318. BoxRule = rule.PackRule,
  8319. BoxRuleId = rule.Id,
  8320. IsControlpanel = true,
  8321. TaskNum = int.Parse(palletequip.Default3),
  8322. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  8323. Robot = root
  8324. };
  8325. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8326. if (pallects.Id == 0)
  8327. {
  8328. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8329. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  8330. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  8331. return res;
  8332. }
  8333. var palletizId = pallects.Id;
  8334. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  8335. {
  8336. ZXStateCode = 1
  8337. }, p => p.Id == rule.Id);
  8338. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8339. foreach (var invs in preinvlist)
  8340. {
  8341. var palletlayer = new PalletLayerMath()
  8342. {
  8343. PalletizingId = palletizId,
  8344. ContGrpId = (long)invs.ContGrpId,
  8345. ContBarCode = invs.ContGrpBarCode,
  8346. Layer = 0,
  8347. SkuCode = rule.SkuCode,
  8348. Finish = 0,
  8349. PboxruleId = rule.Id,
  8350. Istask = 0,
  8351. Palletequip = palletequip.Code,
  8352. Depth = invs.Depth,
  8353. IsBlack = invs.IsBlack,
  8354. SolderCount = invs.SolderCount,
  8355. BoxCode = rule.PBoxCode,
  8356. Wbgroup = invs.WbGroupCode,
  8357. StockDonse = invs.InDocsNo,
  8358. BoxDonse = rule.DocsNo
  8359. };
  8360. math.Add(palletlayer);
  8361. }
  8362. _palletlayerMathrepository.InsertRange(math);
  8363. //把库存预锁标志更新掉
  8364. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8365. {
  8366. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  8367. BomMatCode = "",
  8368. PreStock = "1"
  8369. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  8370. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  8371. res.ResMsg = "非控制捞取预锁库存处理成功";
  8372. return res;
  8373. }
  8374. else
  8375. {
  8376. iscontinue = false;
  8377. continue;
  8378. }
  8379. }
  8380. else
  8381. {
  8382. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  8383. {
  8384. iscontinue = true;
  8385. break;
  8386. }
  8387. else
  8388. {
  8389. iscontinue = false;
  8390. continue;
  8391. }
  8392. }
  8393. }
  8394. }
  8395. _logger.LogInformation("控制计时埋点4" + timesign);
  8396. if (!iscontinue)
  8397. {
  8398. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  8399. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  8400. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  8401. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  8402. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  8403. {
  8404. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  8405. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8406. res.ResMsg = "没有空闲的码垛工位";
  8407. return res;
  8408. }
  8409. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  8410. {
  8411. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  8412. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8413. res.ResMsg = "没有空闲的码垛工位";
  8414. return res;
  8415. }
  8416. }
  8417. _logger.LogInformation("控制计时埋点5" + timesign);
  8418. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  8419. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  8420. if (!devices.Where(p => p.pH_STATUS == true).Any())
  8421. {
  8422. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut5", new RedisErrorInfo() { Equip = "ControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  8423. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8424. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  8425. return res;
  8426. }
  8427. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  8428. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//过期时间
  8429. var time1 = decimal.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TorsChkDateCount").SContent);//扭转检测时效允许时间间隔(小时)
  8430. _logger.LogInformation("控制计时埋点6" + timesign);
  8431. //查找满足时效但是没有全部检测完成的盘所在的机器组
  8432. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8433. 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)
  8434. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8435. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8436. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8437. on stock.InDocsNo equals rule1.DocsNo
  8438. select new
  8439. {
  8440. stock.MatCode,
  8441. stock.InvBarCode,
  8442. stock.Grade,
  8443. stock.InvStateCode,
  8444. stock.ProductTime,
  8445. stock.WbGroupCode,
  8446. stock.IsTorsChk,
  8447. stock.TorsChkQty,
  8448. stock.TorsChkValue,
  8449. stock.TorsChkChord,
  8450. stock.TorsChkFlatness,
  8451. stock.HoldTime,
  8452. stock.ProductMachCode,
  8453. stock.IsControlpanel,
  8454. stock.HWTypeCode,
  8455. stock.IsBlack,
  8456. stock.SolderCount,
  8457. stock.IsRework,
  8458. loc.Col,
  8459. loc.Layer,
  8460. loc.Shelf,
  8461. loc.Depth,
  8462. loc.Code,
  8463. loc.Tunnel,
  8464. loc.SCRel,
  8465. loc.Floor,
  8466. loc.WarehouseCode,
  8467. loc.ContGrpBarCode,
  8468. loc.ContGrpId,
  8469. loc.Id,
  8470. loc.StateNum,
  8471. rule1.SkuCode,
  8472. stock.Wind,
  8473. stock.InDocsNo
  8474. };
  8475. //if (templist.Any())
  8476. //{
  8477. // invlist = invlist.Where(p => !templist.Distinct().Contains(p.WbGroupCode));
  8478. //}
  8479. //invlist = invlist.Where(p => p.WbGroupCode == "C15" && p.Wind == "L" && p.SkuCode == "6210010401");
  8480. if (!invlist.Any())
  8481. {
  8482. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "控制盘出库装箱库存不足", Time = DateTime.Now });
  8483. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8484. res.ResMsg = "控制盘出库装箱库存不足";
  8485. return res;
  8486. }
  8487. //var date1 = DateTime.Parse("2024-3-25");
  8488. //var date2 = DateTime.Parse("2024-3-26");
  8489. _logger.LogInformation("控制计时埋点7" + timesign);
  8490. invlist = invlist.Distinct();
  8491. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  8492. if (tunlist.Any())
  8493. {
  8494. if (tunlist.Where(p => p.Default2 == "1").Any())
  8495. {
  8496. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8497. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  8498. }
  8499. if (tunlist.Where(p => p.Default2 == "2").Any())
  8500. {
  8501. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8502. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  8503. }
  8504. if (tunlist.Where(p => p.Default2 == "3").Any())
  8505. {
  8506. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8507. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  8508. }
  8509. }
  8510. if (!invlist.Any())
  8511. {
  8512. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "出库巷道被禁用,不满足控制盘出库装箱数量", Time = DateTime.Now });
  8513. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8514. res.ResMsg = "出库巷道被禁用,不满足控制盘出库装箱数量";
  8515. return res;
  8516. }
  8517. //invlist = invlist.Where(p => p.WbGroupCode == "C14" && p.ProductTime > date1 && p.ProductTime < date2);
  8518. var invlist2 = invlist;
  8519. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  8520. if (!sku.Any())
  8521. {
  8522. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut7", new RedisErrorInfo() { Equip = "ControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  8523. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8524. res.ResMsg = "库中没有SKU或SKU不能为空";
  8525. return res;
  8526. }
  8527. 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));
  8528. if (!rulelist.Any())
  8529. {
  8530. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:"+JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p=>p.Key).Distinct()));
  8531. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut8", new RedisErrorInfo() { Equip = "ControlOut8", Con = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription(), Time = DateTime.Now });
  8532. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  8533. res.ResMsg = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  8534. return res;
  8535. }
  8536. _logger.LogInformation("控制计时埋点8" + timesign);
  8537. foreach (var item in sku)
  8538. {
  8539. 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);
  8540. if (!rules.Any())
  8541. {
  8542. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut9", new RedisErrorInfo() { Equip = "ControlOut9", Con = "SKU:" + item.Key + ",没有可用箱号", Time = DateTime.Now });
  8543. 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()));
  8544. continue;
  8545. }
  8546. var rulegroup = rules.GroupBy(p => new
  8547. {
  8548. p.Wind,
  8549. p.SpoolType,
  8550. p.FullCountQty,
  8551. p.DocsNo
  8552. }).ToList();
  8553. foreach (var rulestemp in rulegroup)
  8554. {
  8555. 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();
  8556. //var syslist = _sysconfigrepository.GetList(p => p.SContent == rule.TrayCode);
  8557. //if (!syslist.Any())
  8558. //{
  8559. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  8560. // _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  8561. // continue;
  8562. //}
  8563. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  8564. List<string> equips = new List<string>();
  8565. foreach (var pp in sys)
  8566. {
  8567. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  8568. {
  8569. equips.Add(pp.Code);
  8570. }
  8571. }
  8572. if (!equips.Any())
  8573. {
  8574. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key, Time = DateTime.Now });
  8575. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key);
  8576. //自动更新子托盘配置
  8577. foreach (var item1 in sys)
  8578. {
  8579. if (!item1.SContent.Contains(rule.TrayCode))
  8580. {
  8581. string con = item1.SContent + "," + rule.TrayCode;
  8582. _sysconfigrepository.AsUpdateable()
  8583. .SetColumns(p => new sxSysConfig() { SContent = con })
  8584. .Where(p => p.Id == item1.Id)
  8585. .ExecuteCommand();
  8586. }
  8587. }
  8588. continue;
  8589. }
  8590. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  8591. if (!dev.Any())
  8592. {
  8593. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  8594. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  8595. WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestemp.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  8596. continue;
  8597. }
  8598. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  8599. if (!wbgrouplist.Any())
  8600. {
  8601. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut12", new RedisErrorInfo() { Equip = "ControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  8602. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  8603. continue;
  8604. }
  8605. _logger.LogInformation("控制计时埋点9" + timesign);
  8606. List<string> codes = new List<string>();
  8607. foreach (var wbgroup in wbgrouplist)
  8608. {
  8609. codes.Clear();
  8610. 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);
  8611. //invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind).OrderBy(p => p.ProductTime);
  8612. if (!invlist2.Any())
  8613. {
  8614. 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 });
  8615. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "SPC控制箱数量不足 ,SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind);
  8616. continue;
  8617. }
  8618. //计算同一天的 当天13:00到第二天8点是一个组,可以装一箱
  8619. var currentTime = invlist2.FirstOrDefault().ProductTime;
  8620. var startTime = currentTime.Date.AddHours(13);
  8621. var endTime = currentTime.Date.AddDays(1).AddHours(8);
  8622. invlist2 = invlist2.Where(p => p.ProductTime >= startTime && p.ProductTime <= endTime);
  8623. var tempoutrecord = invlist2.ToList();
  8624. //焊点、返工盘、黑盘一些基本属性筛选
  8625. if (!string.IsNullOrEmpty(rule.SpoolType))
  8626. {
  8627. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  8628. }
  8629. if (!string.IsNullOrEmpty(rule.Wind))
  8630. {
  8631. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  8632. }
  8633. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  8634. {
  8635. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  8636. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  8637. }
  8638. else
  8639. {
  8640. //不允许焊点盘
  8641. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  8642. }
  8643. if (rule.ReturnCount > 0)
  8644. {
  8645. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  8646. invlist2 = tt.Union(invlist2);
  8647. }
  8648. else
  8649. {
  8650. invlist2 = invlist2.Where(p => p.IsRework == false);
  8651. }
  8652. if (!invlist2.Any())
  8653. {
  8654. 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 });
  8655. res.ResMsg = "不满足装箱条件";
  8656. if(tempoutrecord != null && tempoutrecord.Any())
  8657. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  8658. continue;
  8659. }
  8660. _logger.LogInformation("控制计时埋点10" + timesign);
  8661. var currentTimes = invlist2.OrderBy(p => p.ProductTime).FirstOrDefault().ProductTime;
  8662. 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 &&
  8663. (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)
  8664. && p.MatCode == invlist2.FirstOrDefault().MatCode && string.IsNullOrEmpty(p.PreStock) && p.Grade == "A" && p.InDocsNo == rule.DocsNo).ToList();
  8665. if (invnows.Where(p => p.TorsChkQty == 0).Any())
  8666. {
  8667. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  8668. var timehold = double.Parse((invnows.First().HoldTime + decimal.Parse(TorschkDate.SContent)).ToString());
  8669. var temp = invnows.Where(p => p.TorsChkQty == 0 && (DateTime.Now - p.ProductTime).TotalHours >= timehold).Select(p => p.ContGrpBarCode);
  8670. invnows = invnows.Where(p => !temp.Contains(p.ContGrpBarCode)).ToList();
  8671. }
  8672. if (invlist2.Count() != invnows.Count && invlist2.Count() < rule.FullCountQty)
  8673. {
  8674. if (invnows.Count == invnows.Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.TorsChkQty > 0).Count())
  8675. {
  8676. //已经全部检测完,并且数量小于满数量,则继续执行
  8677. }
  8678. else
  8679. {
  8680. 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 });
  8681. res.ResMsg = "不满足装箱条件,该批次检测盘没有全部检测完";
  8682. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱,该批次检测盘没有全部检测完," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind+",型号:"+ rule.SpoolType);
  8683. continue;
  8684. }
  8685. }
  8686. _logger.LogInformation("控制计时埋点11" + timesign);
  8687. if (invlist2.Count() < rule.FullCountQty)
  8688. {
  8689. //非控制盘
  8690. var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8691. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == false && p.IsTorsChk == false
  8692. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  8693. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8694. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8695. //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  8696. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8697. on stock.InDocsNo equals rule1.DocsNo
  8698. select new
  8699. {
  8700. stock.MatCode,
  8701. stock.InvBarCode,
  8702. stock.Grade,
  8703. stock.InvStateCode,
  8704. stock.ProductTime,
  8705. stock.WbGroupCode,
  8706. stock.IsTorsChk,
  8707. stock.TorsChkQty,
  8708. stock.TorsChkValue,
  8709. stock.HoldTime,
  8710. stock.ProductMachCode,
  8711. stock.IsControlpanel,
  8712. stock.HWTypeCode,
  8713. stock.IsBlack,
  8714. stock.SolderCount,
  8715. stock.IsRework,
  8716. stock.InDocsNo,
  8717. stock.Ovced,
  8718. loc.Col,
  8719. loc.Layer,
  8720. loc.Shelf,
  8721. loc.Depth,
  8722. loc.Code,
  8723. loc.Tunnel,
  8724. loc.SCRel,
  8725. loc.Floor,
  8726. loc.WarehouseCode,
  8727. loc.ContGrpBarCode,
  8728. loc.ContGrpId,
  8729. loc.Id,
  8730. loc.StateNum,
  8731. rule1.SkuCode,
  8732. rule1.DocsNo
  8733. };
  8734. //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  8735. var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8736. 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
  8737. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  8738. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8739. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8740. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8741. on stock.InDocsNo equals rule1.DocsNo
  8742. select new
  8743. {
  8744. stock.MatCode,
  8745. stock.InvBarCode,
  8746. stock.Grade,
  8747. stock.InvStateCode,
  8748. stock.ProductTime,
  8749. stock.WbGroupCode,
  8750. stock.IsTorsChk,
  8751. stock.TorsChkQty,
  8752. stock.TorsChkValue,
  8753. stock.HoldTime,
  8754. stock.ProductMachCode,
  8755. stock.IsControlpanel,
  8756. stock.HWTypeCode,
  8757. stock.IsBlack,
  8758. stock.SolderCount,
  8759. stock.IsRework,
  8760. stock.InDocsNo,
  8761. stock.Ovced,
  8762. loc.Col,
  8763. loc.Layer,
  8764. loc.Shelf,
  8765. loc.Depth,
  8766. loc.Code,
  8767. loc.Tunnel,
  8768. loc.SCRel,
  8769. loc.Floor,
  8770. loc.WarehouseCode,
  8771. loc.ContGrpBarCode,
  8772. loc.ContGrpId,
  8773. loc.Id,
  8774. loc.StateNum,
  8775. rule1.SkuCode,
  8776. rule1.DocsNo
  8777. };
  8778. _logger.LogInformation("控制计时埋点12" + timesign);
  8779. if (tunlist.Any())
  8780. {
  8781. if (tunlist.Where(p => p.Default2 == "1").Any())
  8782. {
  8783. var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8784. list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  8785. var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8786. list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  8787. }
  8788. if (tunlist.Where(p => p.Default2 == "2").Any())
  8789. {
  8790. var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8791. list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  8792. var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8793. list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  8794. }
  8795. if (tunlist.Where(p => p.Default2 == "3").Any())
  8796. {
  8797. var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8798. list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  8799. var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8800. list2 = list2.Except(www).Distinct(); //过滤3层被禁用的出库巷道
  8801. }
  8802. }
  8803. list = list.Where(p => p.SkuCode == item.Key).Distinct();
  8804. list2 = list2.Where(p => p.SkuCode == item.Key).Distinct();
  8805. if (list2.Any())
  8806. {
  8807. list = list.Union(list2);
  8808. }
  8809. if (list.Count() < rule.FullCountQty - invlist2.Count())
  8810. {
  8811. string msg = "检测盘不满足装箱数量,数量"+ (invlist2.Count() + list.Count()) + ",SKU:"+ rule.SkuCode + ",绕向" + rule.Wind + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",型号:" + rule.SpoolType;
  8812. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut14", new RedisErrorInfo() { Equip = "ControlOut14", Con = msg, Time = DateTime.Now });
  8813. res.ResMsg = "不满足装箱条件,"+ msg;
  8814. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  8815. WreTimeOutRecord(list.Select(p => p.ContGrpBarCode).ToList(), msg);
  8816. continue;
  8817. }
  8818. #region 黑盘逻辑去掉
  8819. //if (!invlist2.Where(p => p.IsBlack == true).Any())
  8820. //{
  8821. // var black = list.Where(p => p.IsBlack == true && p.SolderCount == 0 && p.InDocsNo == rule.DocsNo).OrderBy(p => p.ProductTime).Take(2);
  8822. // if (!black.Any())
  8823. // {
  8824. // string msg = "补的非控制盘中没有当前单号下的黑盘,当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + "单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8825. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut15", new RedisErrorInfo() { Equip = "ControlOut15", Con = msg, Time = DateTime.Now });
  8826. // res.ResMsg = "不满足装箱条件,"+ msg;
  8827. // continue;
  8828. // }
  8829. // else
  8830. // {
  8831. // if (rule.SpoolType == "BS60")
  8832. // {
  8833. // if (black.Count() <= 1)
  8834. // {
  8835. // string msg = "非控制盘中BS60类型工字轮黑盘数量最少2个,实际数量:" + list.Where(p => p.IsBlack == true).Count() + ",当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  8836. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut17", new RedisErrorInfo() { Equip = "ControlOut17", Con = msg, Time = DateTime.Now });
  8837. // res.ResMsg = "不满足装箱条件," + msg;
  8838. // continue;
  8839. // }
  8840. // else
  8841. // {
  8842. // codes.AddRange(black.Select(p => p.ContGrpBarCode));
  8843. // 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));
  8844. // }
  8845. // }
  8846. // else
  8847. // {
  8848. // codes.AddRange(black.Select(p => p.ContGrpBarCode));
  8849. // 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));
  8850. // }
  8851. // }
  8852. //}
  8853. //else
  8854. //{
  8855. // list = list.Where(p => p.IsBlack == false && p.SolderCount == 0).OrderBy(p => p.ProductTime);
  8856. // codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  8857. //}
  8858. #endregion
  8859. list = list.Where(p => (p.IsBlack == false && p.Ovced == 0) || p.Ovced == 1).OrderBy(p => p.ProductTime);
  8860. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  8861. {
  8862. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  8863. var templist = list.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(rulemaxcount).ToList();
  8864. list = list.Where(p => p.SolderCount == 0).Union(templist);
  8865. }
  8866. else
  8867. {
  8868. //不允许焊点盘
  8869. list = list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  8870. }
  8871. codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  8872. _logger.LogInformation("控制计时埋点13" + timesign);
  8873. }
  8874. else
  8875. {
  8876. #region 黑盘逻辑去掉
  8877. //if (!invlist2.Where(p => p.IsBlack == true).Any() && invlist2.Count() >= rule.FullCountQty && invnows.Any(p => p.IsBlack == true))
  8878. //{
  8879. // string msg = "满足装箱数量,存在同一批次的黑盘,但还未扭转入库,优先装同一批次黑盘";
  8880. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut21", new RedisErrorInfo() { Equip = "ControlOut21", Con = msg, Time = DateTime.Now });
  8881. // res.ResMsg = "不满足装箱条件,"+ msg;
  8882. // continue;
  8883. //}
  8884. //if (!invlist2.Where(p => p.IsBlack == true).Any() && invlist2.Count() >= rule.FullCountQty)
  8885. //{
  8886. // var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8887. // join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && p.IsControlpanel == false && p.IsTorsChk == false
  8888. // && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind && p.IsBlack == true
  8889. // && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8890. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8891. // join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8892. // on stock.InDocsNo equals rule1.DocsNo
  8893. // select new
  8894. // {
  8895. // stock.MatCode,
  8896. // stock.InvBarCode,
  8897. // stock.Grade,
  8898. // stock.InvStateCode,
  8899. // stock.ProductTime,
  8900. // stock.WbGroupCode,
  8901. // stock.IsTorsChk,
  8902. // stock.TorsChkQty,
  8903. // stock.TorsChkValue,
  8904. // stock.HoldTime,
  8905. // stock.ProductMachCode,
  8906. // stock.IsControlpanel,
  8907. // stock.HWTypeCode,
  8908. // stock.IsBlack,
  8909. // stock.SolderCount,
  8910. // stock.IsRework,
  8911. // stock.InDocsNo,
  8912. // loc.Col,
  8913. // loc.Layer,
  8914. // loc.Shelf,
  8915. // loc.Depth,
  8916. // loc.Code,
  8917. // loc.Tunnel,
  8918. // loc.SCRel,
  8919. // loc.Floor,
  8920. // loc.WarehouseCode,
  8921. // loc.ContGrpBarCode,
  8922. // loc.ContGrpId,
  8923. // loc.Id,
  8924. // loc.StateNum,
  8925. // rule1.SkuCode,
  8926. // rule1.DocsNo
  8927. // };
  8928. // //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  8929. // var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8930. // 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
  8931. // && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind && p.IsBlack == true
  8932. // && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  8933. // on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8934. // //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  8935. // join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  8936. // on stock.InDocsNo equals rule1.DocsNo
  8937. // select new
  8938. // {
  8939. // stock.MatCode,
  8940. // stock.InvBarCode,
  8941. // stock.Grade,
  8942. // stock.InvStateCode,
  8943. // stock.ProductTime,
  8944. // stock.WbGroupCode,
  8945. // stock.IsTorsChk,
  8946. // stock.TorsChkQty,
  8947. // stock.TorsChkValue,
  8948. // stock.HoldTime,
  8949. // stock.ProductMachCode,
  8950. // stock.IsControlpanel,
  8951. // stock.HWTypeCode,
  8952. // stock.IsBlack,
  8953. // stock.SolderCount,
  8954. // stock.IsRework,
  8955. // stock.InDocsNo,
  8956. // loc.Col,
  8957. // loc.Layer,
  8958. // loc.Shelf,
  8959. // loc.Depth,
  8960. // loc.Code,
  8961. // loc.Tunnel,
  8962. // loc.SCRel,
  8963. // loc.Floor,
  8964. // loc.WarehouseCode,
  8965. // loc.ContGrpBarCode,
  8966. // loc.ContGrpId,
  8967. // loc.Id,
  8968. // loc.StateNum,
  8969. // rule1.SkuCode,
  8970. // rule1.DocsNo
  8971. // };
  8972. // if (tunlist.Any())
  8973. // {
  8974. // if (tunlist.Where(p => p.Default2 == "1").Any())
  8975. // {
  8976. // var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8977. // list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  8978. // var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8979. // list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  8980. // }
  8981. // if (tunlist.Where(p => p.Default2 == "2").Any())
  8982. // {
  8983. // var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8984. // list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  8985. // var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8986. // list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  8987. // }
  8988. // if (tunlist.Where(p => p.Default2 == "3").Any())
  8989. // {
  8990. // var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8991. // list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  8992. // var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8993. // list2 = list2.Except(www).Distinct();//过滤3层被禁用的出库巷道
  8994. // }
  8995. // }
  8996. // list2 = list2.Where(p => p.SkuCode == item.Key && p.InDocsNo == rule.DocsNo && p.SolderCount == 0).Distinct();
  8997. // list = list.Where(p => p.SkuCode == item.Key && p.InDocsNo == rule.DocsNo && p.SolderCount == 0).Distinct();
  8998. // if (list2.Any())
  8999. // {
  9000. // list = list.Union(list2);
  9001. // }
  9002. // if (!list.Any())
  9003. // {
  9004. // string msg = "数量已满足装箱,但补的非控制盘中没有当前单号下的黑盘并且黑盘存在焊点,当前检测盘不允许装箱,机器组" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  9005. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut16", new RedisErrorInfo() { Equip = "ControlOut16", Con = msg, Time = DateTime.Now });
  9006. // res.ResMsg = "不满足装箱条件,"+ msg;
  9007. // continue;
  9008. // }
  9009. // else
  9010. // {
  9011. // if (rule.SpoolType == "BS60")
  9012. // {
  9013. // if (list.Where(p => p.IsBlack == true && p.SolderCount == 0).Count() <= 1)
  9014. // {
  9015. // string msg = "非控制盘中BS60类型工字轮黑盘数量最少2个,实际数量:" + list.Where(p => p.IsBlack == true).Count() + ",当前检测盘不允许装箱,机器组:" + invlist2.FirstOrDefault().WbGroupCode + ",绕向:" + rule.Wind + ",单号:" + rule.DocsNo + ",SKU:" + item.Key;
  9016. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut17", new RedisErrorInfo() { Equip = "ControlOut17", Con = msg, Time = DateTime.Now });
  9017. // res.ResMsg = "不满足装箱条件,"+ msg;
  9018. // continue;
  9019. // }
  9020. // else
  9021. // {
  9022. // codes.AddRange(list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(2).Select(p => p.ContGrpBarCode));
  9023. // }
  9024. // }
  9025. // else
  9026. // {
  9027. // codes.AddRange(list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime).Take(1).Select(p => p.ContGrpBarCode));
  9028. // }
  9029. // invlist2 = invlist2.Take(rule.FullCountQty - codes.Count);
  9030. // }
  9031. //}
  9032. #endregion
  9033. invlist2 = invlist2.Take(rule.FullCountQty);
  9034. }
  9035. if (invlist2.Count() + codes.Count < rule.FullCountQty)
  9036. {
  9037. string msg = "不满足装箱数量,数量:"+(invlist2.Count() + codes.Count) +",当前检测盘不允许装箱;机器组" + invlist2.First().WbGroupCode + ",绕向" + invlist2.First().Wind + ",工字轮类型" + invlist2.First().HWTypeCode + ",下盘时间" + invlist2.First().ProductTime.Date + ",SKU:" + item.Key;
  9038. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut18", new RedisErrorInfo() { Equip = "ControlOut18", Con = msg, Time = DateTime.Now });
  9039. res.ResMsg = "不满足装箱条件,"+ msg;
  9040. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  9041. WreTimeOutRecord(codes.ToList(), msg);
  9042. continue;
  9043. }
  9044. else
  9045. {
  9046. _logger.LogInformation("控制计时埋点14" + timesign);
  9047. //最后验证数据
  9048. var fincodes = invlist2.Select(p => p.ContGrpBarCode).Distinct().ToList();
  9049. fincodes.AddRange(codes);
  9050. var finstocks = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && fincodes.Contains(p.ContGrpBarCode)).ToList();
  9051. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  9052. {
  9053. _logger.LogInformation("控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9054. continue;
  9055. }
  9056. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  9057. {
  9058. _logger.LogInformation("控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9059. continue;
  9060. }
  9061. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  9062. {
  9063. _logger.LogInformation("控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9064. continue;
  9065. }
  9066. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  9067. {
  9068. _logger.LogInformation("控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9069. continue;
  9070. }
  9071. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  9072. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  9073. {
  9074. _logger.LogInformation("控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9075. continue;
  9076. }
  9077. var invlist2temp = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct().Select(p=>p.ContGrpBarCode).ToList();
  9078. invlist2temp.AddRange(codes);
  9079. if (invlist2temp.Distinct().Count() != 36 && invlist2temp.Distinct().Count() != 72)
  9080. {
  9081. _logger.LogInformation("控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  9082. continue;
  9083. }
  9084. _logger.LogInformation("控制装箱预锁:埋点1");
  9085. _logger.LogInformation("控制计时埋点15" + timesign);
  9086. var robotlist = new List<string>() { "Robot1", "Robot2" };
  9087. sxSysConfig palletequip = null;
  9088. foreach (var robot in robotlist)
  9089. {
  9090. //获取下工位的最新状态
  9091. //equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot).OrderBy(p => p.TaskFlag).ToList();
  9092. //if (equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  9093. //{
  9094. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  9095. //}
  9096. //else if (equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).Any())
  9097. //{
  9098. // palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  9099. //}
  9100. //else
  9101. //{
  9102. // res.ResMsg = "没有空闲的码垛工位";
  9103. // return res;
  9104. //}
  9105. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  9106. {
  9107. 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();
  9108. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  9109. {
  9110. palletequip = palletequiptemp;
  9111. break;
  9112. }
  9113. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  9114. {
  9115. palletequip = palletequiptemp;
  9116. break;
  9117. }
  9118. //缓存工位2
  9119. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  9120. {
  9121. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  9122. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  9123. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  9124. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  9125. {
  9126. palletequip = palletequiptemp;
  9127. break;
  9128. }
  9129. }
  9130. }
  9131. }
  9132. if (palletequip == null)
  9133. {
  9134. res.ResMsg = "没有空闲的码垛工位";
  9135. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  9136. return res;
  9137. }
  9138. _logger.LogInformation("控制计时埋点16" + timesign);
  9139. int acttype = 0;
  9140. //判断是缓存工位锁定库存还是码垛工位直接下任务
  9141. if (string.IsNullOrEmpty(palletequip.Default1))
  9142. {
  9143. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9144. {
  9145. acttype = 1;//直接执行下任务
  9146. }
  9147. else
  9148. {
  9149. //等待下一轮循环,往math表插数据放在前面
  9150. res.ResMsg = "等待下一轮循环";
  9151. return res;
  9152. }
  9153. }
  9154. else
  9155. {
  9156. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9157. {
  9158. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  9159. if (!string.IsNullOrEmpty(palletequip.Default3))
  9160. {
  9161. res.ResMsg = "等待下一轮循环";
  9162. return res;
  9163. }
  9164. else
  9165. {
  9166. acttype = 2;//预锁库存
  9167. }
  9168. }
  9169. else
  9170. {
  9171. //判断缓存工位2(缓存工位1的托盘要到位之后)
  9172. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  9173. {
  9174. //使用缓存2工位
  9175. acttype = 3;
  9176. }
  9177. else
  9178. {
  9179. res.ResMsg = "没有空闲的码垛工位";
  9180. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  9181. return res;
  9182. }
  9183. }
  9184. }
  9185. #region 托盘任务验证
  9186. _logger.LogInformation("控制计时埋点17" + timesign);
  9187. var TrayportageCheck = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  9188. var responseCheck = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTaskCheck", JsonConvert.SerializeObject(TrayportageCheck));
  9189. var trayresCheck = JsonConvert.DeserializeObject<SRes>(responseCheck);
  9190. if (trayresCheck.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9191. {
  9192. res.ResCode = trayresCheck.ResCode;
  9193. res.ResMsg = trayresCheck.ResMsg;
  9194. _logger.LogInformation("托盘输送任务验证报错" + trayresCheck.ResMsg);
  9195. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务验证报错:" + trayresCheck.ResMsg, Time = DateTime.Now });
  9196. WreTimeOutRecord(fincodes.ToList(), "托盘输送任务验证报错" + trayresCheck.ResMsg);
  9197. return res;
  9198. }
  9199. _logger.LogInformation("控制计时埋点18" + timesign);
  9200. #endregion
  9201. #region Mes箱号校验
  9202. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  9203. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  9204. var reqids = Guid.NewGuid().ToString();
  9205. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  9206. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  9207. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  9208. if (mesresponse.success == false)
  9209. {
  9210. _logger.LogInformation("控制装箱预锁:埋点2申请箱号mes反回" + mesresponse.message);
  9211. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9212. {
  9213. ZXStateCode = 2,
  9214. EditTime = DateTime.Now,
  9215. Memo = mesresponse.message
  9216. }, p => p.Id == rule.Id);
  9217. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut19", new RedisErrorInfo() { Equip = "ControlOut19", Con = mesresponse.message, Time = DateTime.Now });
  9218. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9219. res.ResMsg = "控制装箱:申请箱号mes返回" + mesresponse.message;
  9220. WreTimeOutRecord(fincodes.ToList(), res.ResMsg);
  9221. _logger.LogInformation(res.ResMsg);
  9222. continue;
  9223. }
  9224. _logger.LogInformation("控制计时埋点19" + timesign);
  9225. #endregion
  9226. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  9227. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  9228. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  9229. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9230. {
  9231. res.ResCode = trayres.ResCode;
  9232. res.ResMsg = trayres.ResMsg;
  9233. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  9234. return res;
  9235. }
  9236. invlist2 = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct();
  9237. _logger.LogInformation("控制计时埋点20" + timesign);
  9238. if (acttype == 1)
  9239. {
  9240. //码垛信息校验
  9241. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  9242. {
  9243. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9244. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  9245. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  9246. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "已经存在未装箱中数据");
  9247. return res;
  9248. }
  9249. var root = "";
  9250. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  9251. {
  9252. root = "Robot1";
  9253. }
  9254. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  9255. {
  9256. root = "Robot2";
  9257. }
  9258. var pallet = new Palletizing()
  9259. {
  9260. PalletMax = rule.FullCountQty,
  9261. PalletizState = 0,
  9262. Equip = palletequip.Code,
  9263. Finish = 0,
  9264. AddWho = "",
  9265. EditWho = "",
  9266. BoxRule = rule.PackRule,
  9267. BoxRuleId = rule.Id,
  9268. IsControlpanel = true,
  9269. TaskNum = int.Parse(trayres.Memo1),
  9270. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9271. Robot = root
  9272. };
  9273. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9274. if (pallects.Id == 0)
  9275. {
  9276. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9277. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9278. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9279. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "装箱主表数据保存失败");
  9280. return res;
  9281. }
  9282. var palletizId = pallects.Id;
  9283. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9284. {
  9285. ZXStateCode = 1
  9286. }, p => p.Id == rule.Id);
  9287. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9288. foreach (var invs in invlist2)
  9289. {
  9290. var palletlayer = new PalletLayerMath()
  9291. {
  9292. PalletizingId = palletizId,
  9293. ContGrpId = (long)invs.ContGrpId,
  9294. ContBarCode = invs.ContGrpBarCode,
  9295. Layer = 0,
  9296. SkuCode = rule.SkuCode,
  9297. Finish = 0,
  9298. PboxruleId = rule.Id,
  9299. Istask = 0,
  9300. Palletequip = palletequip.Code,
  9301. Depth = invs.Depth,
  9302. IsBlack = invs.IsBlack,
  9303. SolderCount = invs.SolderCount,
  9304. BoxCode = rule.PBoxCode,
  9305. Wbgroup = invs.WbGroupCode,
  9306. StockDonse = invs.InDocsNo,
  9307. BoxDonse = rule.DocsNo
  9308. };
  9309. math.Add(palletlayer);
  9310. }
  9311. _palletlayerMathrepository.InsertRange(math);
  9312. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9313. {
  9314. PreStock = "1"
  9315. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  9316. if (codes.Any())
  9317. {
  9318. List<PalletLayerMath> list = new List<PalletLayerMath>();
  9319. foreach (var items in codes)
  9320. {
  9321. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == items && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9322. var cell = _basewarecellrepository.GetFirst(p => p.ContGrpBarCode == stock.ContGrpBarCode && p.Row == stock.PutRow && p.Col == stock.PutCol && p.Layer == stock.PutLayer);
  9323. var layer = new PalletLayerMath()
  9324. {
  9325. ContGrpId = (long)stock.ContGrpId,
  9326. ContBarCode = stock.ContGrpBarCode,
  9327. Layer = 0,
  9328. SkuCode = rule.SkuCode,
  9329. Finish = 0,
  9330. PboxruleId = rule.Id,
  9331. Istask = 0,
  9332. Palletequip = palletequip.Code,
  9333. Depth = cell.Depth,
  9334. IsBlack = stock.IsBlack,
  9335. SolderCount = stock.SolderCount,
  9336. BoxCode = rule.PBoxCode,
  9337. Wbgroup = stock.WbGroupCode,
  9338. StockDonse = stock.InDocsNo,
  9339. BoxDonse = rule.DocsNo,
  9340. PalletizingId = palletizId
  9341. };
  9342. list.Add(layer);
  9343. }
  9344. _palletlayerMathrepository.InsertRange(list);
  9345. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9346. {
  9347. PreStock = "1"
  9348. }, p => list.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  9349. }
  9350. #region 考虑代码的可维护性,不再直接下发任务2024-5-12 zq
  9351. //invlist2 = invlist2.OrderBy(p => p.Depth).Take(72);
  9352. //foreach (var code in invlist2)
  9353. //{
  9354. // var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  9355. // if (cell == null)
  9356. // {
  9357. // continue;
  9358. // }
  9359. // var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9360. // if (invs == null)
  9361. // {
  9362. // continue;
  9363. // }
  9364. // //先判断二升位是否能出库
  9365. // if (code.Depth == 2)
  9366. // {
  9367. // var respon = MoveTask(code.Code);
  9368. // if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9369. // {
  9370. // continue;
  9371. // }
  9372. // }
  9373. // var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  9374. // {
  9375. // Code = code.ContGrpBarCode,
  9376. // Equip = pallects.Equip,
  9377. // Mater = code.MatCode,
  9378. // Srm = code.SCRel,
  9379. // PalletLayer = 1,
  9380. // Grade = code.Grade,
  9381. // Tunnel = code.Tunnel.ToString(),
  9382. // CellCode = code.Code,
  9383. // SkuCode = rule.SkuCode,
  9384. // ProductMachCode = code.ProductMachCode,
  9385. // Floor = code.Floor,
  9386. // PalletizingId = palletizId,
  9387. // Robot = root,
  9388. // GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  9389. // });
  9390. // if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9391. // {
  9392. // continue;
  9393. // }
  9394. // _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9395. // {
  9396. // Istask = 1,
  9397. // Layer = 1
  9398. // }, p => p.ContBarCode == code.ContGrpBarCode);
  9399. //}
  9400. ////下完任务后将标识值加1
  9401. //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);
  9402. //taskflag = taskflag + 1;
  9403. //_sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + pallects.Equip + "'");
  9404. #endregion
  9405. res.ResCode = 200;
  9406. res.ResMsg = "成功";
  9407. }
  9408. else if (acttype == 2 || acttype == 3)
  9409. {
  9410. _logger.LogInformation("控制装箱预锁:埋点9");
  9411. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  9412. if (codes.Any())
  9413. {
  9414. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9415. {
  9416. PreStock = "1",
  9417. BomMatCode = trayres.Memo1,//预锁托盘任务id
  9418. BomMatName = rule.PBoxCode, //预锁的箱号
  9419. BomSetId = 1 //代表控制箱标识
  9420. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9421. //锁定缓存工位
  9422. _logger.LogInformation(string.Format("控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  9423. }
  9424. res.ResCode = 200;
  9425. res.ResMsg = "成功";
  9426. }
  9427. _logger.LogInformation("控制计时埋点21" + timesign);
  9428. return res;
  9429. }
  9430. }
  9431. }
  9432. }
  9433. return res;
  9434. }
  9435. /// <summary>
  9436. /// 码垛SPC控制装箱(缓存底托)
  9437. /// </summary>
  9438. /// <param name="request"></param>
  9439. /// <returns></returns>
  9440. public SRes PalletizingSpcPackStockOut3(PalletizingPackStockOutRequest request)
  9441. {
  9442. var res = new SRes();
  9443. var timesign = IdFactory.NewId();
  9444. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  9445. if (palletlist.Any())
  9446. {
  9447. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  9448. if (maxtaskStemp.Any())
  9449. {
  9450. var maxtaskcount = (from tas in maxtaskStemp
  9451. select new TunnelCountTemp()
  9452. {
  9453. Tunnel = tas.Key,
  9454. Count = tas.Count()
  9455. }).ToList();
  9456. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  9457. }
  9458. //箱之间状态卡控限制标识
  9459. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  9460. //某个机械手最大下发的限制状态任务数量
  9461. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  9462. foreach (var item in palletlist)
  9463. {
  9464. //判断任务数量
  9465. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  9466. {
  9467. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  9468. continue;
  9469. }
  9470. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  9471. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  9472. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  9473. {
  9474. //判断是否是第三箱
  9475. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  9476. {
  9477. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  9478. if (item.Id == thirdbox)//第3箱子
  9479. {
  9480. 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())
  9481. {
  9482. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  9483. continue;
  9484. }
  9485. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  9486. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  9487. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  9488. {
  9489. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  9490. continue;
  9491. }
  9492. }
  9493. else if (item.Id > thirdbox)
  9494. {
  9495. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  9496. continue;
  9497. }
  9498. }
  9499. }
  9500. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  9501. if (equips == null)
  9502. {
  9503. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut2", new RedisErrorInfo() { Equip = "ControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  9504. continue;
  9505. }
  9506. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  9507. if (!palletMach.Any())
  9508. {
  9509. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut3", new RedisErrorInfo() { Equip = "ControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  9510. continue;
  9511. }
  9512. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  9513. var curdocid = maxdocid + 1;
  9514. if (palletMach.Any())
  9515. {
  9516. var pid = palletMach.First().PalletizingId;
  9517. 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)
  9518. {
  9519. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  9520. }
  9521. }
  9522. foreach (var pallets in palletMach)
  9523. {
  9524. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  9525. if (cell == null)
  9526. {
  9527. continue;
  9528. }
  9529. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9530. if (invs == null)
  9531. {
  9532. continue;
  9533. }
  9534. var root = "";
  9535. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  9536. {
  9537. root = "Robot1";
  9538. }
  9539. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  9540. {
  9541. root = "Robot2";
  9542. }
  9543. //先判断二升位是否能出库
  9544. if (cell.Depth == 2)
  9545. {
  9546. var respon = MoveTask(cell.Code);
  9547. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9548. {
  9549. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut24", new RedisErrorInfo() { Equip = "NoControlOut24", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  9550. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态," + respon.ResMsg);
  9551. continue;
  9552. }
  9553. }
  9554. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  9555. {
  9556. Code = pallets.ContBarCode,
  9557. CellCode = cell.Code,
  9558. Srm = cell.SCRel,
  9559. Tunnel = cell.Tunnel.ToString(),
  9560. Floor = cell.Floor,
  9561. Grade = invs.Grade,
  9562. Mater = invs.MatCode,
  9563. SkuCode = pallets.SkuCode,
  9564. PalletLayer = 0,
  9565. ProductMachCode = invs.ProductMachCode,
  9566. Equip = item.Equip,
  9567. PalletizingId = item.Id,
  9568. Robot = root,
  9569. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  9570. DocId = curdocid
  9571. });
  9572. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9573. {
  9574. _logger.LogInformation(cell.Code + "下发装箱任务失败," + taskresponse.ResMsg);
  9575. continue;
  9576. }
  9577. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9578. {
  9579. Istask = 1,
  9580. Layer = 0
  9581. }, p => p.ContBarCode == invs.ContGrpBarCode);
  9582. }
  9583. //下完任务后将标识值加1
  9584. 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);
  9585. taskflag = taskflag + 1;
  9586. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  9587. }
  9588. }
  9589. //待码垛箱任务下发
  9590. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == true);
  9591. if (palletlisttobe.Any())
  9592. {
  9593. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  9594. {
  9595. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  9596. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  9597. {
  9598. _palletizrepository.AsUpdateable()
  9599. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  9600. .Where(p => p.Id == item.Id)
  9601. .ExecuteCommand();
  9602. }
  9603. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  9604. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  9605. {
  9606. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  9607. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  9608. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  9609. {
  9610. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  9611. continue;
  9612. }
  9613. //箱之间状态卡控限制标识
  9614. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  9615. //判断任务数量
  9616. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  9617. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  9618. {
  9619. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  9620. continue;
  9621. }
  9622. 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()
  9623. {
  9624. //判断是否是第三箱
  9625. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  9626. {
  9627. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  9628. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  9629. if (item.Id == thirdbox)//第3箱子
  9630. {
  9631. 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())
  9632. {
  9633. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  9634. continue;
  9635. }
  9636. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  9637. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  9638. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  9639. {
  9640. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  9641. continue;
  9642. }
  9643. }
  9644. else if (item.Id > thirdbox)
  9645. {
  9646. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  9647. continue;
  9648. }
  9649. }
  9650. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  9651. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)//先控制只多下发一层1个任务
  9652. {
  9653. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  9654. if (!palletMach.Any())
  9655. {
  9656. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  9657. continue;
  9658. }
  9659. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  9660. var curdocid = maxdocid + 1;
  9661. if (palletMach.Any())
  9662. {
  9663. var pid = palletMach.First().PalletizingId;
  9664. 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)
  9665. {
  9666. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  9667. }
  9668. }
  9669. foreach (var pallets in palletMach)
  9670. {
  9671. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  9672. if (cell == null)
  9673. {
  9674. continue;
  9675. }
  9676. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9677. if (invs == null)
  9678. {
  9679. continue;
  9680. }
  9681. var root = "";
  9682. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  9683. {
  9684. root = "Robot1";
  9685. }
  9686. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  9687. {
  9688. root = "Robot2";
  9689. }
  9690. //先判断二升位是否能出库
  9691. if (cell.Depth == 2)
  9692. {
  9693. var respon = MoveTask(cell.Code);
  9694. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9695. {
  9696. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  9697. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  9698. continue;
  9699. }
  9700. }
  9701. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  9702. {
  9703. Code = pallets.ContBarCode,
  9704. CellCode = cell.Code,
  9705. Srm = cell.SCRel,
  9706. Tunnel = cell.Tunnel.ToString(),
  9707. Floor = cell.Floor,
  9708. Grade = invs.Grade,
  9709. Mater = invs.MatCode,
  9710. SkuCode = pallets.SkuCode,
  9711. PalletLayer = 0,
  9712. ProductMachCode = invs.ProductMachCode,
  9713. Equip = item.Equip,
  9714. PalletizingId = item.Id,
  9715. Robot = root,
  9716. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  9717. DocId = curdocid
  9718. });
  9719. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9720. {
  9721. continue;
  9722. }
  9723. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9724. {
  9725. Istask = 1,
  9726. Layer = 0
  9727. }, p => p.ContBarCode == invs.ContGrpBarCode);
  9728. }
  9729. //下完任务后将标识值加1
  9730. 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);
  9731. taskflag = taskflag + 1;
  9732. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  9733. }
  9734. }
  9735. }
  9736. else
  9737. {
  9738. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  9739. //{
  9740. // PalletizState = 0
  9741. //}, p => p.Id == item.Id);
  9742. _palletizrepository.AsUpdateable()
  9743. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  9744. .Where(p => p.Id == item.Id)
  9745. .ExecuteCommand();
  9746. }
  9747. }
  9748. }
  9749. //取视图码垛设备号
  9750. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  9751. var iscontinue = false;
  9752. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))//一个码垛位只能有一个进行中搬运任务,Memo标识
  9753. {
  9754. if (string.IsNullOrEmpty(palletequip.Default1))
  9755. {
  9756. if (!string.IsNullOrEmpty(palletequip.Default3))
  9757. {
  9758. //机械手交叉下任务需求
  9759. //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)
  9760. //{
  9761. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  9762. // 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();
  9763. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9764. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9765. // {
  9766. // }
  9767. // else
  9768. // {
  9769. // iscontinue = false;
  9770. // continue;
  9771. // }
  9772. //}
  9773. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  9774. 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)
  9775. {
  9776. //如果较小的工位已经没有任务那么,则继续下该工位任务
  9777. 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();
  9778. if (minequ != null)
  9779. {
  9780. if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9781. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9782. {
  9783. }
  9784. else
  9785. {
  9786. iscontinue = false;
  9787. continue;
  9788. }
  9789. }
  9790. }
  9791. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  9792. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9793. if (preinvlist.Any())
  9794. {
  9795. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  9796. {
  9797. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9798. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  9799. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  9800. return res;
  9801. }
  9802. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  9803. //码垛信息校验
  9804. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  9805. {
  9806. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9807. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  9808. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  9809. return res;
  9810. }
  9811. var root = "";
  9812. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  9813. {
  9814. root = "Robot1";
  9815. }
  9816. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  9817. {
  9818. root = "Robot2";
  9819. }
  9820. var pallet = new Palletizing()
  9821. {
  9822. PalletMax = rule.FullCountQty,
  9823. PalletizState = 0,
  9824. Equip = palletequip.Code,
  9825. Finish = 0,
  9826. AddWho = "",
  9827. EditWho = "",
  9828. BoxRule = rule.PackRule,
  9829. BoxRuleId = rule.Id,
  9830. IsControlpanel = true,
  9831. TaskNum = int.Parse(palletequip.Default3),
  9832. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9833. Robot = root
  9834. };
  9835. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9836. if (pallects.Id == 0)
  9837. {
  9838. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9839. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9840. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9841. return res;
  9842. }
  9843. var palletizId = pallects.Id;
  9844. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9845. {
  9846. ZXStateCode = 1
  9847. }, p => p.Id == rule.Id);
  9848. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9849. foreach (var invs in preinvlist)
  9850. {
  9851. var palletlayer = new PalletLayerMath()
  9852. {
  9853. PalletizingId = palletizId,
  9854. ContGrpId = (long)invs.ContGrpId,
  9855. ContBarCode = invs.ContGrpBarCode,
  9856. Layer = 0,
  9857. SkuCode = rule.SkuCode,
  9858. Finish = 0,
  9859. PboxruleId = rule.Id,
  9860. Istask = 0,
  9861. Palletequip = palletequip.Code,
  9862. Depth = invs.Depth,
  9863. IsBlack = invs.IsBlack,
  9864. SolderCount = invs.SolderCount,
  9865. BoxCode = rule.PBoxCode,
  9866. Wbgroup = invs.WbGroupCode,
  9867. StockDonse = invs.InDocsNo,
  9868. BoxDonse = rule.DocsNo
  9869. };
  9870. math.Add(palletlayer);
  9871. }
  9872. _palletlayerMathrepository.InsertRange(math);
  9873. //把库存预锁标志更新掉
  9874. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9875. {
  9876. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  9877. BomMatCode = "",
  9878. PreStock = "1"
  9879. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  9880. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  9881. res.ResMsg = "非控制捞取预锁库存处理成功";
  9882. return res;
  9883. }
  9884. else
  9885. {
  9886. iscontinue = false;
  9887. continue;
  9888. }
  9889. }
  9890. if (string.IsNullOrEmpty(palletequip.Cache1State))
  9891. {
  9892. iscontinue = true;
  9893. break;
  9894. }
  9895. else
  9896. {
  9897. iscontinue = false;
  9898. continue;
  9899. }
  9900. }
  9901. else
  9902. {
  9903. if (!string.IsNullOrEmpty(palletequip.Default3))
  9904. {
  9905. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  9906. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 1 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9907. if (preinvlist.Any())
  9908. {
  9909. //机械手交叉下任务需求
  9910. //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)
  9911. //{
  9912. // //如果较小的工位已经没有任务那么,则继续下该工位任务
  9913. // 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();
  9914. // if (minequ != null && string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9915. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9916. // {
  9917. // }
  9918. // else
  9919. // {
  9920. // iscontinue = false;
  9921. // continue;
  9922. // }
  9923. //}
  9924. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  9925. 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)
  9926. {
  9927. //如果较小的工位已经没有任务那么,则继续下该工位任务
  9928. 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();
  9929. if (minequ != null)
  9930. {
  9931. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  9932. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  9933. {
  9934. }
  9935. else
  9936. {
  9937. iscontinue = false;
  9938. continue;
  9939. }
  9940. }
  9941. }
  9942. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  9943. {
  9944. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9945. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  9946. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  9947. return res;
  9948. }
  9949. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  9950. //码垛信息校验
  9951. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  9952. {
  9953. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9954. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  9955. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  9956. return res;
  9957. }
  9958. var root = "";
  9959. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  9960. {
  9961. root = "Robot1";
  9962. }
  9963. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  9964. {
  9965. root = "Robot2";
  9966. }
  9967. var pallet = new Palletizing()
  9968. {
  9969. PalletMax = rule.FullCountQty,
  9970. PalletizState = 2,
  9971. Equip = palletequip.Code,
  9972. Finish = 0,
  9973. AddWho = "",
  9974. EditWho = "",
  9975. BoxRule = rule.PackRule,
  9976. BoxRuleId = rule.Id,
  9977. IsControlpanel = true,
  9978. TaskNum = int.Parse(palletequip.Default3),
  9979. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  9980. Robot = root
  9981. };
  9982. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  9983. if (pallects.Id == 0)
  9984. {
  9985. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9986. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  9987. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  9988. return res;
  9989. }
  9990. var palletizId = pallects.Id;
  9991. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  9992. {
  9993. ZXStateCode = 1
  9994. }, p => p.Id == rule.Id);
  9995. List<PalletLayerMath> math = new List<PalletLayerMath>();
  9996. foreach (var invs in preinvlist)
  9997. {
  9998. var palletlayer = new PalletLayerMath()
  9999. {
  10000. PalletizingId = palletizId,
  10001. ContGrpId = (long)invs.ContGrpId,
  10002. ContBarCode = invs.ContGrpBarCode,
  10003. Layer = 0,
  10004. SkuCode = rule.SkuCode,
  10005. Finish = 0,
  10006. PboxruleId = rule.Id,
  10007. Istask = 0,
  10008. Palletequip = palletequip.Code,
  10009. Depth = invs.Depth,
  10010. IsBlack = invs.IsBlack,
  10011. SolderCount = invs.SolderCount,
  10012. BoxCode = rule.PBoxCode,
  10013. Wbgroup = invs.WbGroupCode,
  10014. StockDonse = invs.InDocsNo,
  10015. BoxDonse = rule.DocsNo
  10016. };
  10017. math.Add(palletlayer);
  10018. }
  10019. _palletlayerMathrepository.InsertRange(math);
  10020. //把库存预锁标志更新掉
  10021. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10022. {
  10023. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  10024. BomMatCode = "",
  10025. PreStock = "1"
  10026. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  10027. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  10028. res.ResMsg = "非控制捞取预锁库存处理成功";
  10029. return res;
  10030. }
  10031. else
  10032. {
  10033. iscontinue = false;
  10034. continue;
  10035. }
  10036. }
  10037. else
  10038. {
  10039. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  10040. {
  10041. iscontinue = true;
  10042. break;
  10043. }
  10044. else
  10045. {
  10046. iscontinue = false;
  10047. continue;
  10048. }
  10049. }
  10050. }
  10051. }
  10052. if (!iscontinue)
  10053. {
  10054. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  10055. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  10056. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  10057. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097" };
  10058. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  10059. {
  10060. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  10061. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10062. res.ResMsg = "没有空闲的码垛工位";
  10063. return res;
  10064. }
  10065. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  10066. {
  10067. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  10068. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10069. res.ResMsg = "没有空闲的码垛工位";
  10070. return res;
  10071. }
  10072. }
  10073. //判断是否启用手动拆盘
  10074. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  10075. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  10076. if (!devices.Where(p => p.pH_STATUS == true).Any())
  10077. {
  10078. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut5", new RedisErrorInfo() { Equip = "ControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  10079. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10080. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  10081. return res;
  10082. }
  10083. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  10084. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 3 && p.PackRule == "SPC").OrderBy(p => p.BatchNo).ThenBy(p => p.PBoxCode);
  10085. foreach (var rule in prerules)
  10086. {
  10087. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  10088. List<string> equips = new List<string>();
  10089. foreach (var pp in sys)
  10090. {
  10091. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  10092. {
  10093. equips.Add(pp.Code);
  10094. }
  10095. }
  10096. if (!equips.Any())
  10097. {
  10098. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码,", Time = DateTime.Now });
  10099. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  10100. //自动更新子托盘配置
  10101. foreach (var item1 in sys)
  10102. {
  10103. if (!item1.SContent.Contains(rule.TrayCode))
  10104. {
  10105. string con = item1.SContent + "," + rule.TrayCode;
  10106. _sysconfigrepository.AsUpdateable()
  10107. .SetColumns(p => new sxSysConfig() { SContent = con })
  10108. .Where(p => p.Id == item1.Id)
  10109. .ExecuteCommand();
  10110. }
  10111. }
  10112. continue;
  10113. }
  10114. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  10115. if (!invlist2.Any())
  10116. {
  10117. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10118. res.ResMsg = rule.Id + "控制盘预占用规则表没有查到库存数据";
  10119. return res;
  10120. }
  10121. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  10122. if (!dev.Any())
  10123. {
  10124. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  10125. _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  10126. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  10127. continue;
  10128. }
  10129. var fincodes = invlist2.Select(p => p.ContGrpBarCode).ToList();
  10130. var robotlist = new List<string>() { "Robot1", "Robot2" };
  10131. sxSysConfig palletequip = null;
  10132. foreach (var robot in robotlist)
  10133. {
  10134. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  10135. {
  10136. 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();
  10137. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  10138. {
  10139. palletequip = palletequiptemp;
  10140. break;
  10141. }
  10142. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  10143. {
  10144. palletequip = palletequiptemp;
  10145. break;
  10146. }
  10147. //缓存工位2
  10148. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  10149. {
  10150. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  10151. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  10152. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  10153. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  10154. {
  10155. palletequip = palletequiptemp;
  10156. break;
  10157. }
  10158. }
  10159. }
  10160. }
  10161. if (palletequip == null)
  10162. {
  10163. res.ResMsg = "没有空闲的码垛工位";
  10164. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  10165. return res;
  10166. }
  10167. int acttype = 0;
  10168. //判断是缓存工位锁定库存还是码垛工位直接下任务
  10169. if (string.IsNullOrEmpty(palletequip.Default1))
  10170. {
  10171. if (string.IsNullOrEmpty(palletequip.Cache1State))
  10172. {
  10173. acttype = 1;//直接执行下任务
  10174. }
  10175. else
  10176. {
  10177. //等待下一轮循环,往math表插数据放在前面
  10178. res.ResMsg = "等待下一轮循环";
  10179. return res;
  10180. }
  10181. }
  10182. else
  10183. {
  10184. if (string.IsNullOrEmpty(palletequip.Cache1State))
  10185. {
  10186. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  10187. if (!string.IsNullOrEmpty(palletequip.Default3))
  10188. {
  10189. res.ResMsg = "等待下一轮循环";
  10190. return res;
  10191. }
  10192. else
  10193. {
  10194. acttype = 2;//预锁库存
  10195. }
  10196. }
  10197. else
  10198. {
  10199. //判断缓存工位2(缓存工位1的托盘要到位之后)
  10200. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  10201. {
  10202. //使用缓存2工位
  10203. acttype = 3;
  10204. }
  10205. else
  10206. {
  10207. res.ResMsg = "没有空闲的码垛工位";
  10208. WreTimeOutRecord(fincodes.ToList(), "没有空闲的码垛工位");
  10209. return res;
  10210. }
  10211. }
  10212. }
  10213. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode, ActType = acttype };
  10214. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  10215. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  10216. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10217. {
  10218. res.ResCode = trayres.ResCode;
  10219. res.ResMsg = trayres.ResMsg;
  10220. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut20", new RedisErrorInfo() { Equip = "ControlOut20", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  10221. return res;
  10222. }
  10223. if (acttype == 1)
  10224. {
  10225. //码垛信息校验
  10226. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  10227. {
  10228. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10229. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  10230. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  10231. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "已经存在未装箱中数据");
  10232. return res;
  10233. }
  10234. var root = "";
  10235. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  10236. {
  10237. root = "Robot1";
  10238. }
  10239. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  10240. {
  10241. root = "Robot2";
  10242. }
  10243. var pallet = new Palletizing()
  10244. {
  10245. PalletMax = rule.FullCountQty,
  10246. PalletizState = 0,
  10247. Equip = palletequip.Code,
  10248. Finish = 0,
  10249. AddWho = "",
  10250. EditWho = "",
  10251. BoxRule = rule.PackRule,
  10252. BoxRuleId = rule.Id,
  10253. IsControlpanel = true,
  10254. TaskNum = int.Parse(trayres.Memo1),
  10255. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  10256. Robot = root
  10257. };
  10258. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  10259. if (pallects.Id == 0)
  10260. {
  10261. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10262. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  10263. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  10264. WreTimeOutRecord(fincodes.ToList(), palletequip.Code + "装箱主表数据保存失败");
  10265. return res;
  10266. }
  10267. var palletizId = pallects.Id;
  10268. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10269. {
  10270. ZXStateCode = 1
  10271. }, p => p.Id == rule.Id);
  10272. List<PalletLayerMath> math = new List<PalletLayerMath>();
  10273. foreach (var invs in invlist2)
  10274. {
  10275. var palletlayer = new PalletLayerMath()
  10276. {
  10277. PalletizingId = palletizId,
  10278. ContGrpId = (long)invs.ContGrpId,
  10279. ContBarCode = invs.ContGrpBarCode,
  10280. Layer = 0,
  10281. SkuCode = rule.SkuCode,
  10282. Finish = 0,
  10283. PboxruleId = rule.Id,
  10284. Istask = 0,
  10285. Palletequip = palletequip.Code,
  10286. Depth = invs.Depth,
  10287. IsBlack = invs.IsBlack,
  10288. SolderCount = invs.SolderCount,
  10289. BoxCode = rule.PBoxCode,
  10290. Wbgroup = invs.WbGroupCode,
  10291. StockDonse = invs.InDocsNo,
  10292. BoxDonse = rule.DocsNo
  10293. };
  10294. math.Add(palletlayer);
  10295. }
  10296. _palletlayerMathrepository.InsertRange(math);
  10297. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10298. {
  10299. PreStock = "1"
  10300. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  10301. res.ResCode = 200;
  10302. res.ResMsg = "成功";
  10303. return res;
  10304. }
  10305. else if (acttype == 2 || acttype == 3)
  10306. {
  10307. if (fincodes.Any())
  10308. {
  10309. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10310. {
  10311. PreStock = "1",
  10312. BomMatCode = trayres.Memo1,//预锁托盘任务id
  10313. BomMatName = rule.PBoxCode, //预锁的箱号
  10314. BomSetId = 1 //代表控制箱标识
  10315. }, p => fincodes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10316. //锁定缓存工位
  10317. _logger.LogInformation(string.Format("控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(fincodes)));
  10318. }
  10319. res.ResCode = 200;
  10320. res.ResMsg = "成功";
  10321. return res;
  10322. }
  10323. return res;
  10324. }
  10325. return res;
  10326. }
  10327. /// <summary>
  10328. /// 码垛SPC控制装箱计算预占箱号
  10329. /// </summary>
  10330. /// <param name="request"></param>
  10331. /// <returns></returns>
  10332. public SRes PalletizingSpcPackRulePre(PalletizingPackStockOutRequest request)
  10333. {
  10334. var res = new SRes();
  10335. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  10336. if (_boxrulerepository.Count(p => p.ZXStateCode > 2) > precount)
  10337. {
  10338. res.ResMsg = "预占箱数已经大于设置值";
  10339. return res;
  10340. }
  10341. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//过期时间
  10342. var time1 = decimal.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TorsChkDateCount").SContent);//扭转检测时效允许时间间隔(小时)
  10343. var wbConf = _sysconfigrepository.GetFirst(p => p.Code == "WbGroupConf").SContent.Split(',').ToList();//允许装到普通箱的检测箱机器组,多个机器组之间用英文格式逗号分隔
  10344. //查找满足时效但是没有全部检测完成的盘所在的机器组
  10345. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10346. 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)
  10347. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours && !wbConf.Contains(p.WbGroupCode))
  10348. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10349. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10350. on stock.InDocsNo equals rule1.DocsNo
  10351. select new
  10352. {
  10353. stock.MatCode,
  10354. stock.InvBarCode,
  10355. stock.Grade,
  10356. stock.InvStateCode,
  10357. stock.ProductTime,
  10358. stock.WbGroupCode,
  10359. stock.IsTorsChk,
  10360. stock.TorsChkQty,
  10361. stock.TorsChkValue,
  10362. stock.TorsChkChord,
  10363. stock.TorsChkFlatness,
  10364. stock.HoldTime,
  10365. stock.ProductMachCode,
  10366. stock.IsControlpanel,
  10367. stock.HWTypeCode,
  10368. stock.IsBlack,
  10369. stock.SolderCount,
  10370. stock.IsRework,
  10371. loc.Col,
  10372. loc.Layer,
  10373. loc.Shelf,
  10374. loc.Depth,
  10375. loc.Code,
  10376. loc.Tunnel,
  10377. loc.SCRel,
  10378. loc.Floor,
  10379. loc.WarehouseCode,
  10380. loc.ContGrpBarCode,
  10381. loc.ContGrpId,
  10382. loc.Id,
  10383. loc.StateNum,
  10384. rule1.SkuCode,
  10385. stock.Wind,
  10386. stock.InDocsNo
  10387. };
  10388. //if (templist.Any())
  10389. //{
  10390. // invlist = invlist.Where(p => !templist.Distinct().Contains(p.WbGroupCode));
  10391. //}
  10392. //invlist = invlist.Where(p => p.WbGroupCode == "C15" && p.Wind == "L" && p.SkuCode == "6210010401");
  10393. if (!invlist.Any())
  10394. {
  10395. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "控制盘出库装箱库存不足", Time = DateTime.Now });
  10396. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10397. res.ResMsg = "控制盘出库装箱库存不足";
  10398. return res;
  10399. }
  10400. //var date1 = DateTime.Parse("2024-6-30");
  10401. //var date2 = DateTime.Parse("2024-7-1");
  10402. invlist = invlist.Distinct();
  10403. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  10404. if (tunlist.Any())
  10405. {
  10406. if (tunlist.Where(p => p.Default2 == "1").Any())
  10407. {
  10408. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10409. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  10410. }
  10411. if (tunlist.Where(p => p.Default2 == "2").Any())
  10412. {
  10413. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10414. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  10415. }
  10416. if (tunlist.Where(p => p.Default2 == "3").Any())
  10417. {
  10418. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10419. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  10420. }
  10421. }
  10422. if (!invlist.Any())
  10423. {
  10424. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut6", new RedisErrorInfo() { Equip = "ControlOut6", Con = "出库巷道被禁用,不满足控制盘出库装箱数量", Time = DateTime.Now });
  10425. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10426. res.ResMsg = "出库巷道被禁用,不满足控制盘出库装箱数量";
  10427. return res;
  10428. }
  10429. //invlist = invlist.Where(p => p.SkuCode == "6210120101" && p.ProductTime > date1 && p.ProductTime < date2);
  10430. var invlist2 = invlist;
  10431. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  10432. if (!sku.Any())
  10433. {
  10434. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut7", new RedisErrorInfo() { Equip = "ControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  10435. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10436. res.ResMsg = "库中没有SKU或SKU不能为空";
  10437. return res;
  10438. }
  10439. //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));
  10440. 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));
  10441. if (!rulelist.Any())
  10442. {
  10443. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct()));
  10444. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut8", new RedisErrorInfo() { Equip = "ControlOut8", Con = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription(), Time = DateTime.Now });
  10445. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  10446. res.ResMsg = "SPC控制箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  10447. return res;
  10448. }
  10449. foreach (var item in sku)
  10450. {
  10451. 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);
  10452. if (!rules.Any())
  10453. {
  10454. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut9", new RedisErrorInfo() { Equip = "ControlOut9", Con = "SKU:" + item.Key + ",没有可用箱号", Time = DateTime.Now });
  10455. 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()));
  10456. continue;
  10457. }
  10458. var rulegroup = rules.GroupBy(p => new
  10459. {
  10460. p.Wind,
  10461. p.SpoolType,
  10462. p.FullCountQty,
  10463. p.DocsNo
  10464. }).ToList();
  10465. foreach (var rulestemp in rulegroup)
  10466. {
  10467. 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();
  10468. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  10469. List<string> equips = new List<string>();
  10470. foreach (var pp in sys)
  10471. {
  10472. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  10473. {
  10474. equips.Add(pp.Code);
  10475. }
  10476. }
  10477. if (!equips.Any())
  10478. {
  10479. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut10", new RedisErrorInfo() { Equip = "ControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key, Time = DateTime.Now });
  10480. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码," + "SKU:" + item.Key);
  10481. //自动更新子托盘配置
  10482. foreach (var item1 in sys)
  10483. {
  10484. if (!item1.SContent.Contains(rule.TrayCode))
  10485. {
  10486. string con = item1.SContent + "," + rule.TrayCode;
  10487. _sysconfigrepository.AsUpdateable()
  10488. .SetColumns(p => new sxSysConfig() { SContent = con })
  10489. .Where(p => p.Id == item1.Id)
  10490. .ExecuteCommand();
  10491. }
  10492. }
  10493. continue;
  10494. }
  10495. //var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  10496. //if (!dev.Any())
  10497. //{
  10498. // RedisHelper.Set("Sx:WMSErrorInfo:ControlOut11", new RedisErrorInfo() { Equip = "ControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  10499. // _logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  10500. // WreTimeOutRecord(invlist.Where(p => p.InDocsNo == rulestemp.Key.DocsNo).Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;" + "SKU:" + item.Key);
  10501. // continue;
  10502. //}
  10503. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  10504. if (!wbgrouplist.Any())
  10505. {
  10506. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut12", new RedisErrorInfo() { Equip = "ControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  10507. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  10508. continue;
  10509. }
  10510. List<string> codes = new List<string>();
  10511. foreach (var wbgroup in wbgrouplist)
  10512. {
  10513. codes.Clear();
  10514. 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);
  10515. if (!invlist2.Any())
  10516. {
  10517. 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 });
  10518. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "SPC控制箱数量不足 ,SKU:" + item.Key + ",机器组:" + wbgroup.Key + ",绕向:" + rule.Wind);
  10519. continue;
  10520. }
  10521. //计算同一天的 当天13:00到第二天8点是一个组,可以装一箱
  10522. var currentTime = invlist2.FirstOrDefault().ProductTime;
  10523. var startTime = currentTime.Hour >= 13 ? currentTime.Date.AddHours(13) : currentTime.Date.AddDays(-1).AddHours(13);
  10524. var endTime = currentTime.Hour >= 13 ? currentTime.Date.AddDays(1).AddHours(8) : currentTime.Date.AddHours(8);
  10525. //var startTime = currentTime.Date.AddHours(13);
  10526. //var endTime = currentTime.Date.AddDays(1).AddHours(8);
  10527. invlist2 = invlist2.Where(p => p.ProductTime >= startTime && p.ProductTime <= endTime);
  10528. var tempoutrecord = invlist2.ToList();
  10529. //焊点、返工盘、黑盘一些基本属性筛选
  10530. if (!string.IsNullOrEmpty(rule.SpoolType))
  10531. {
  10532. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  10533. }
  10534. if (!string.IsNullOrEmpty(rule.Wind))
  10535. {
  10536. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  10537. }
  10538. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  10539. {
  10540. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  10541. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  10542. }
  10543. else
  10544. {
  10545. //不允许焊点盘
  10546. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  10547. }
  10548. if (rule.ReturnCount > 0)
  10549. {
  10550. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  10551. invlist2 = tt.Union(invlist2);
  10552. }
  10553. else
  10554. {
  10555. invlist2 = invlist2.Where(p => p.IsRework == false);
  10556. }
  10557. if (!invlist2.Any())
  10558. {
  10559. 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 });
  10560. res.ResMsg = "不满足装箱条件";
  10561. if (tempoutrecord != null && tempoutrecord.Any())
  10562. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  10563. continue;
  10564. }
  10565. var currentTimes = invlist2.OrderBy(p => p.ProductTime).FirstOrDefault().ProductTime;
  10566. 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 &&
  10567. (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)
  10568. && p.MatCode == invlist2.FirstOrDefault().MatCode && string.IsNullOrEmpty(p.PreStock) && p.Grade == "A" && p.InDocsNo == rule.DocsNo).ToList();
  10569. if (invnows.Where(p => p.TorsChkQty == 0).Any())
  10570. {
  10571. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  10572. var timehold = double.Parse((invnows.First().HoldTime + decimal.Parse(TorschkDate.SContent)).ToString());
  10573. var temp = invnows.Where(p => p.TorsChkQty == 0 && (DateTime.Now - p.ProductTime).TotalHours >= timehold).Select(p => p.ContGrpBarCode);
  10574. invnows = invnows.Where(p => !temp.Contains(p.ContGrpBarCode)).ToList();
  10575. }
  10576. if (invlist2.Count() != invnows.Count && invlist2.Count() < rule.FullCountQty)
  10577. {
  10578. if (invnows.Count == invnows.Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.TorsChkQty > 0).Count())
  10579. {
  10580. //已经全部检测完,并且数量小于满数量,则继续执行
  10581. }
  10582. else
  10583. {
  10584. 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 });
  10585. res.ResMsg = "不满足装箱条件,该批次检测盘没有全部检测完";
  10586. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱,该批次检测盘没有全部检测完," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind + ",型号:" + rule.SpoolType);
  10587. continue;
  10588. }
  10589. }
  10590. if (invlist2.Count() < rule.FullCountQty)
  10591. {
  10592. //非控制盘
  10593. var list = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10594. 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
  10595. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  10596. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  10597. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10598. //join rule1 in _boxrulerepository.GetList(p => p.PackRule == "SPC")
  10599. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10600. on stock.InDocsNo equals rule1.DocsNo
  10601. select new
  10602. {
  10603. stock.MatCode,
  10604. stock.InvBarCode,
  10605. stock.Grade,
  10606. stock.InvStateCode,
  10607. stock.ProductTime,
  10608. stock.WbGroupCode,
  10609. stock.IsTorsChk,
  10610. stock.TorsChkQty,
  10611. stock.TorsChkValue,
  10612. stock.HoldTime,
  10613. stock.ProductMachCode,
  10614. stock.IsControlpanel,
  10615. stock.HWTypeCode,
  10616. stock.IsBlack,
  10617. stock.SolderCount,
  10618. stock.IsRework,
  10619. stock.InDocsNo,
  10620. stock.Ovced,
  10621. loc.Col,
  10622. loc.Layer,
  10623. loc.Shelf,
  10624. loc.Depth,
  10625. loc.Code,
  10626. loc.Tunnel,
  10627. loc.SCRel,
  10628. loc.Floor,
  10629. loc.WarehouseCode,
  10630. loc.ContGrpBarCode,
  10631. loc.ContGrpId,
  10632. loc.Id,
  10633. loc.StateNum,
  10634. rule1.SkuCode,
  10635. rule1.DocsNo
  10636. };
  10637. //上线后带扭转值的盘,可以直接装箱,字段Ovced == 1
  10638. var list2 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10639. 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
  10640. && p.WbGroupCode == invlist2.First().WbGroupCode && p.HWTypeCode == rule.SpoolType && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0 && p.Wind == rule.Wind
  10641. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  10642. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10643. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10644. on stock.InDocsNo equals rule1.DocsNo
  10645. select new
  10646. {
  10647. stock.MatCode,
  10648. stock.InvBarCode,
  10649. stock.Grade,
  10650. stock.InvStateCode,
  10651. stock.ProductTime,
  10652. stock.WbGroupCode,
  10653. stock.IsTorsChk,
  10654. stock.TorsChkQty,
  10655. stock.TorsChkValue,
  10656. stock.HoldTime,
  10657. stock.ProductMachCode,
  10658. stock.IsControlpanel,
  10659. stock.HWTypeCode,
  10660. stock.IsBlack,
  10661. stock.SolderCount,
  10662. stock.IsRework,
  10663. stock.InDocsNo,
  10664. stock.Ovced,
  10665. loc.Col,
  10666. loc.Layer,
  10667. loc.Shelf,
  10668. loc.Depth,
  10669. loc.Code,
  10670. loc.Tunnel,
  10671. loc.SCRel,
  10672. loc.Floor,
  10673. loc.WarehouseCode,
  10674. loc.ContGrpBarCode,
  10675. loc.ContGrpId,
  10676. loc.Id,
  10677. loc.StateNum,
  10678. rule1.SkuCode,
  10679. rule1.DocsNo
  10680. };
  10681. if (tunlist.Any())
  10682. {
  10683. if (tunlist.Where(p => p.Default2 == "1").Any())
  10684. {
  10685. var ww = list.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10686. list = list.Except(ww).Distinct(); //过滤1层被禁用的出库巷道
  10687. var www = list2.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10688. list2 = list2.Except(www).Distinct(); //过滤1层被禁用的出库巷道
  10689. }
  10690. if (tunlist.Where(p => p.Default2 == "2").Any())
  10691. {
  10692. var ww = list.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10693. list = list.Except(ww).Distinct(); //过滤2层被禁用的出库巷道
  10694. var www = list2.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10695. list2 = list2.Except(www).Distinct(); //过滤2层被禁用的出库巷道
  10696. }
  10697. if (tunlist.Where(p => p.Default2 == "3").Any())
  10698. {
  10699. var ww = list.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10700. list = list.Except(ww).Distinct(); //过滤3层被禁用的出库巷道
  10701. var www = list2.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10702. list2 = list2.Except(www).Distinct(); //过滤3层被禁用的出库巷道
  10703. }
  10704. }
  10705. list = list.Where(p => p.SkuCode == item.Key).Distinct();
  10706. list2 = list2.Where(p => p.SkuCode == item.Key).Distinct();
  10707. if (list2.Any())
  10708. {
  10709. list = list.Union(list2);
  10710. }
  10711. if (list.Count() < rule.FullCountQty - invlist2.Count())
  10712. {
  10713. string msg = "检测盘不满足装箱数量,数量" + (invlist2.Count() + list.Count()) + ",SKU:" + rule.SkuCode + ",绕向" + rule.Wind + ",机器组" + invlist2.FirstOrDefault().WbGroupCode + ",型号:" + rule.SpoolType;
  10714. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut14", new RedisErrorInfo() { Equip = "ControlOut14", Con = msg, Time = DateTime.Now });
  10715. res.ResMsg = "不满足装箱条件," + msg;
  10716. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  10717. WreTimeOutRecord(list.Select(p => p.ContGrpBarCode).ToList(), msg);
  10718. continue;
  10719. }
  10720. list = list.Where(p => (p.IsBlack == false && p.Ovced == 0) || p.Ovced == 1).OrderBy(p => p.ProductTime);
  10721. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  10722. {
  10723. int rulemaxcount = rule.FullCountQty / ((rule.SpoolType == "BS60" || rule.SpoolType == "BS40") ? 72 : 36) * rule.SolderMaxCount;
  10724. //要减去扭转盘invlist2焊点盘的个数
  10725. rulemaxcount = rulemaxcount - invlist2.Where(p => p.SolderCount > 0).Count();
  10726. if (rulemaxcount < 0) rulemaxcount = 0;
  10727. var templist = list.Where(p => p.SolderCount <= rule.PerSolderMaxCount && p.SolderCount > 0).OrderBy(p => p.ProductTime).ThenByDescending(p => p.SolderCount).Take(rulemaxcount).ToList();
  10728. list = list.Where(p => p.SolderCount == 0).Union(templist);
  10729. }
  10730. else
  10731. {
  10732. //不允许焊点盘
  10733. list = list.Where(p => p.SolderCount == 0).OrderBy(p => p.ProductTime);
  10734. }
  10735. codes.AddRange(list.OrderBy(p => p.ProductTime).Take(rule.FullCountQty - invlist2.Count()).Select(p => p.ContGrpBarCode));
  10736. }
  10737. else
  10738. {
  10739. invlist2 = invlist2.Take(rule.FullCountQty);
  10740. }
  10741. if (invlist2.Count() + codes.Count < rule.FullCountQty)
  10742. {
  10743. string msg = "不满足装箱数量,数量:" + (invlist2.Count() + codes.Count) + ",当前检测盘不允许装箱;机器组" + invlist2.First().WbGroupCode + ",绕向" + invlist2.First().Wind + ",工字轮类型" + invlist2.First().HWTypeCode + ",下盘时间" + invlist2.First().ProductTime.Date + ",SKU:" + item.Key;
  10744. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut18", new RedisErrorInfo() { Equip = "ControlOut18", Con = msg, Time = DateTime.Now });
  10745. res.ResMsg = "不满足装箱条件," + msg;
  10746. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  10747. WreTimeOutRecord(codes.ToList(), msg);
  10748. continue;
  10749. }
  10750. else
  10751. {
  10752. //最后验证数据
  10753. var fincodes = invlist2.Select(p => p.ContGrpBarCode).Distinct().ToList();
  10754. fincodes.AddRange(codes);
  10755. var finstocks = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && fincodes.Contains(p.ContGrpBarCode)).ToList();
  10756. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  10757. {
  10758. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10759. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpBarCode" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  10760. continue;
  10761. }
  10762. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  10763. {
  10764. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10765. _logger.LogInformation("控制盘最终检查装箱数量不配置ContGrpId" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()) );
  10766. continue;
  10767. }
  10768. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  10769. {
  10770. _logger.LogInformation("控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10771. continue;
  10772. }
  10773. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode)).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  10774. {
  10775. _logger.LogInformation("控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10776. continue;
  10777. }
  10778. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  10779. {
  10780. _logger.LogInformation("控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10781. continue;
  10782. }
  10783. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  10784. {
  10785. _logger.LogInformation("控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10786. continue;
  10787. }
  10788. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  10789. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  10790. {
  10791. _logger.LogInformation("控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10792. continue;
  10793. }
  10794. var invlist2temp = invlist2.OrderByDescending(p => p.IsBlack).ThenByDescending(p => p.SolderCount).ThenBy(p => p.ProductTime).Take(rule.FullCountQty).Distinct().Select(p => p.ContGrpBarCode).ToList();
  10795. invlist2temp.AddRange(codes);
  10796. if (invlist2temp.Distinct().Count() != 36 && invlist2temp.Distinct().Count() != 72)
  10797. {
  10798. _logger.LogInformation("控制盘最终检查装箱数量不配置" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  10799. continue;
  10800. }
  10801. #region Mes箱号校验
  10802. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  10803. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  10804. var reqids = Guid.NewGuid().ToString();
  10805. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  10806. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  10807. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  10808. if (mesresponse.success == false)
  10809. {
  10810. _logger.LogInformation("控制装箱预锁:埋点2申请箱号mes反回" + mesresponse.message);
  10811. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10812. {
  10813. ZXStateCode = 2,
  10814. EditTime = DateTime.Now,
  10815. Memo = mesresponse.message
  10816. }, p => p.Id == rule.Id);
  10817. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut19", new RedisErrorInfo() { Equip = "ControlOut19", Con = mesresponse.message, Time = DateTime.Now });
  10818. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10819. res.ResMsg = "控制装箱:申请箱号mes返回" + mesresponse.message;
  10820. WreTimeOutRecord(fincodes.ToList(), res.ResMsg);
  10821. _logger.LogInformation(res.ResMsg);
  10822. break;
  10823. }
  10824. else
  10825. {
  10826. try
  10827. {
  10828. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  10829. _db.BeginTran();
  10830. //控制箱预占状态更新成3
  10831. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  10832. {
  10833. ZXStateCode = 3,
  10834. EditTime = DateTime.Now,
  10835. Memo = mesresponse.message
  10836. }, p => p.Id == rule.Id);
  10837. var presign = rule.Id.ToString();
  10838. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10839. {
  10840. PreStock = presign,
  10841. EditTime = DateTime.Now,
  10842. Memo = "箱号预占用:" + rule.PBoxCode
  10843. }, p => listid.Contains(p.ContGrpId));
  10844. _db.CommitTran();
  10845. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  10846. }
  10847. catch (Exception ex)
  10848. {
  10849. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  10850. _db.RollbackTran();
  10851. }
  10852. return res;
  10853. }
  10854. #endregion
  10855. }
  10856. }
  10857. }
  10858. }
  10859. return res;
  10860. }
  10861. private SRes PalletizingPackTask(PalletizingPackTaskRequest request)
  10862. {
  10863. lock (lockerPalletizingPackTask)
  10864. {
  10865. var res = new SRes();
  10866. //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())
  10867. //{
  10868. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10869. // res.ResMsg = request.Equip + "存在上一箱未完成的任务,不允许下发新的任务";
  10870. // return res;
  10871. //}
  10872. try
  10873. {
  10874. var wcs = new WCS_TaskInfo()
  10875. {
  10876. Status = TaskStatus.NewBuild,
  10877. Type = TaskType.OutDepot,
  10878. Priority = 0,
  10879. Device = request.Srm,
  10880. SrmStation = request.Srm,
  10881. AddrFrom = request.CellCode,
  10882. BarCode = request.Code,
  10883. AddWho = "wms",
  10884. EditWho = "wms",
  10885. WarehouseCode = "sxhouse",
  10886. AddrTo = request.Equip,
  10887. FullQty = 1,
  10888. AgvTaskID = request.PalletLayer, //层配层数
  10889. Tunnel = request.Tunnel,
  10890. MaterialCode = request.Mater,
  10891. MatCode = request.Mater,
  10892. OutType = OutTypeEnum.自动出库任务,
  10893. BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
  10894. Floor = request.Floor,
  10895. Grade = request.Grade,
  10896. WorkBench = request.ProductMachCode,
  10897. PalletizingId = request.PalletizingId,
  10898. Robot = request.Robot,
  10899. GoodsType = request.GoodsType,
  10900. ManualRemarks = request.Memo,
  10901. DocID = request.DocId
  10902. };
  10903. _db.BeginTran();
  10904. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10905. {
  10906. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  10907. EditTime = DateTime.Now
  10908. }, p => p.ContGrpBarCode == request.Code);
  10909. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  10910. {
  10911. StateNum = LocationState.LocationState_StockOut,
  10912. EditTime = DateTime.Now
  10913. }, p => p.Code == request.CellCode);
  10914. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  10915. var flow = _mapper.Map<BillInvflow>(stock);
  10916. flow.Id = GetId();
  10917. flow.AddTime = DateTime.Now;
  10918. flow.EditTime = DateTime.Now;
  10919. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  10920. flow.Memo = "装箱码垛出库";
  10921. _billInvflow.Insert(flow);
  10922. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  10923. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  10924. var wcsdtl = new WCS_TaskDtl()
  10925. {
  10926. ID = Guid.NewGuid(),
  10927. CurPoint = request.Code,
  10928. AddTime = DateTime.Now,
  10929. AddWho = "wms",
  10930. Enabled = true,
  10931. ParentTaskCode = wcstask.ID,
  10932. Desc = wcstask.BusType
  10933. };
  10934. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  10935. _db.CommitTran();
  10936. }
  10937. catch (Exception ex)
  10938. {
  10939. _db.RollbackTran();
  10940. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10941. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  10942. return res;
  10943. }
  10944. return res;
  10945. }
  10946. }
  10947. public SRes CancelTaskVerify(CancelTaskRequest request)
  10948. {
  10949. var res = new SRes();
  10950. if (!request.TaskNo.Any())
  10951. {
  10952. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  10953. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  10954. return res;
  10955. }
  10956. foreach (var item in request.TaskNo)
  10957. {
  10958. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == item && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  10959. if (task == null)
  10960. {
  10961. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  10962. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  10963. return res;
  10964. }
  10965. if (task.Type == TaskType.EnterDepot)
  10966. {
  10967. //验证组盘状态
  10968. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  10969. if (stock == null)
  10970. {
  10971. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  10972. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  10973. return res;
  10974. }
  10975. if (request.State == HandleTaskTypeEnum.完成任务)
  10976. {
  10977. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  10978. {
  10979. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  10980. res.ResMsg = stock.ContGrpBarCode + "不是已组盘状态,不允许完成";
  10981. return res;
  10982. }
  10983. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  10984. {
  10985. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10986. res.ResMsg = stock.ContGrpBarCode + "组盘信息是已入库,请确认是否重复";
  10987. return res;
  10988. }
  10989. }
  10990. else if (request.State == HandleTaskTypeEnum.取消任务)
  10991. {
  10992. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  10993. {
  10994. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  10995. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription();
  10996. return res;
  10997. }
  10998. }
  10999. }
  11000. else if (task.Type == TaskType.OutDepot)
  11001. {
  11002. //验证组盘状态
  11003. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11004. if (stock == null)
  11005. {
  11006. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11007. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11008. return res;
  11009. }
  11010. if (request.State == HandleTaskTypeEnum.完成任务)
  11011. {
  11012. if (stock.InvStateCode != InvState.InvEcecState_OutGoing.ToString())
  11013. {
  11014. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  11015. res.ResMsg = stock.ContGrpBarCode + "当前的组盘状态不是出库中,不允许完成";
  11016. return res;
  11017. }
  11018. }
  11019. else if (request.State == HandleTaskTypeEnum.取消任务)
  11020. {
  11021. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  11022. if (cell == null)
  11023. {
  11024. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11025. res.ResMsg = stock + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不支持取消";
  11026. return res;
  11027. }
  11028. if (stock.InvStateCode == InvState.InvEcecState_Out.ToString())
  11029. {
  11030. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  11031. res.ResMsg = ResponseStatusCodeEnum.StockStateFail.GetDescription();
  11032. return res;
  11033. }
  11034. }
  11035. }
  11036. else if (task.Type == TaskType.TransferDepot)
  11037. {
  11038. //验证组盘状态
  11039. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11040. if (stock == null)
  11041. {
  11042. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11043. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11044. return res;
  11045. }
  11046. if (request.State == HandleTaskTypeEnum.完成任务)
  11047. {
  11048. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  11049. {
  11050. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  11051. res.ResMsg = stock.ContGrpBarCode + "移库任务组盘信息不是已入库,不允许完成";
  11052. return res;
  11053. }
  11054. }
  11055. else if (request.State == HandleTaskTypeEnum.取消任务)
  11056. {
  11057. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  11058. res.ResMsg = stock.ContGrpBarCode + "移库任务不允许取消";
  11059. return res;
  11060. }
  11061. }
  11062. }
  11063. return res;
  11064. }
  11065. public SRes CarryTaskInfo(CancelTaskRequest request)
  11066. {
  11067. var res = new SRes();
  11068. if (!request.TaskNo.Any())
  11069. {
  11070. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  11071. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  11072. return res;
  11073. }
  11074. foreach (var item in request.TaskNo)
  11075. {
  11076. if (request.State == HandleTaskTypeEnum.完成任务)
  11077. {
  11078. var con = SrmCompleted(new SxCompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动完成任务", Memo1 = "", Memo2 = "" });
  11079. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11080. {
  11081. return res = con;
  11082. }
  11083. }
  11084. if (request.State == HandleTaskTypeEnum.取消任务)
  11085. {
  11086. var con = CancelTask(new CompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动取消任务", Memo1 = "", Memo2 = "" });
  11087. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11088. {
  11089. return res = con;
  11090. }
  11091. }
  11092. }
  11093. return res;
  11094. }
  11095. public SRes CancelTask(CompleteTaskRequest request)
  11096. {
  11097. var res = new SRes();
  11098. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  11099. if (task == null)
  11100. {
  11101. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11102. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11103. return res;
  11104. }
  11105. try
  11106. {
  11107. if (task.Type == TaskType.EnterDepot)
  11108. {
  11109. //验证组盘状态
  11110. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11111. if (stock == null)
  11112. {
  11113. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11114. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11115. return res;
  11116. }
  11117. var flow = _mapper.Map<BillInvflow>(stock);
  11118. flow.Id = GetId();
  11119. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11120. flow.Memo = "客户端取消入库任务";
  11121. flow.AddTime = DateTime.Now;
  11122. flow.EditTime = DateTime.Now;
  11123. _db.BeginTran();
  11124. _billInvnowrepository.DeleteById(stock.Id);
  11125. _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  11126. _billInvflow.Insert(flow);
  11127. _db.CommitTran();
  11128. }
  11129. else if (task.Type == TaskType.OutDepot)
  11130. {
  11131. //验证组盘状态
  11132. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11133. if (stock == null)
  11134. {
  11135. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11136. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11137. return res;
  11138. }
  11139. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11140. if (cell == null)
  11141. {
  11142. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11143. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不允许取消";
  11144. return res;
  11145. }
  11146. var flow = _mapper.Map<BillInvflow>(stock);
  11147. flow.Id = GetId();
  11148. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  11149. flow.Memo = "客户端取消出库任务";
  11150. flow.AddTime = DateTime.Now;
  11151. flow.EditTime = DateTime.Now;
  11152. _db.BeginTran();
  11153. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  11154. {
  11155. StateNum = LocationState.LocationState_Full,
  11156. EditTime = DateTime.Now
  11157. }, p => p.ContGrpBarCode == task.BarCode);
  11158. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11159. {
  11160. InvStateCode = InvState.InvEcecState_In.ToString(),
  11161. PutRow = cell.Row,
  11162. PutCol = cell.Col,
  11163. PutLayer = cell.Layer,
  11164. EditTime = DateTime.Now,
  11165. PreStock = ""//把预锁的标记去掉
  11166. }, p => p.ContGrpBarCode == task.BarCode);
  11167. //取消任务把响应的码垛信息表业删除
  11168. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  11169. _billInvflow.Insert(flow);
  11170. _db.CommitTran();
  11171. }
  11172. else
  11173. {
  11174. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11175. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消";
  11176. return res;
  11177. }
  11178. }
  11179. catch (Exception ex)
  11180. {
  11181. _db.RollbackTran();
  11182. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11183. res.ResMsg = task.Id + ResponseStatusCodeEnum.Fail.GetDescription();
  11184. _logger.LogInformation("任务取消失败,任务号:" + task.Id + ex.Message);
  11185. return res;
  11186. }
  11187. return res;
  11188. }
  11189. public List<BillPushinfo> GetPushDatelistAuto(PushDate request)
  11190. {
  11191. var list = _billPushinforepository.GetList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == request.Type).OrderBy(p => p.AddTime).Take(request.Count).ToList();
  11192. return list;
  11193. }
  11194. public bool UpdatePushModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  11195. {
  11196. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  11197. }
  11198. public SRes StockChange(SxStockChangeRequest reqDto)
  11199. {
  11200. var res = new StockChangeResponse();
  11201. if (!reqDto.ListInfo.Any())
  11202. {
  11203. res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
  11204. res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
  11205. return res;
  11206. }
  11207. List<BillInvnow> stocklist = new List<BillInvnow>();
  11208. List<BillInvflow> flowlist = new List<BillInvflow>();
  11209. foreach (var item in reqDto.ListInfo)
  11210. {
  11211. var stock = _billInvnowrepository.GetSingle(p => p.InvBarCode == item.MatBarCode && p.ContGrpBarCode == item.SpoolCode);
  11212. if (stock != null)
  11213. {
  11214. var flow = _mapper.Map<BillInvflow>(stock);
  11215. switch (item.State)
  11216. {
  11217. case "Lock":
  11218. stock.ExecStateCode = InvLockState.InvState_Lock.ToString();
  11219. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  11220. break;
  11221. case "Normal":
  11222. stock.ExecStateCode = InvLockState.InvState_Normal.ToString();
  11223. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  11224. break;
  11225. default:
  11226. break;
  11227. }
  11228. if (!string.IsNullOrEmpty(item.Grade))
  11229. {
  11230. stock.Grade = item.Grade;
  11231. flow.Memo = flow.Memo + "|执行改判等级" + item.Grade;
  11232. }
  11233. if (!string.IsNullOrEmpty(item.Reason))
  11234. {
  11235. stock.Memo = item.Reason;
  11236. flow.Memo = flow.Memo + "|执行改判原因" + item.Grade;
  11237. }
  11238. if (!string.IsNullOrEmpty(item.NewTorsValue))
  11239. {
  11240. flow.Memo = flow.Memo + "|执行改判扭转值新值" + item.NewTorsValue + ",原来值" + stock.TorsChkValue;
  11241. stock.TorsChkValue = decimal.Parse(item.NewTorsValue);
  11242. stock.TorsChkQty = 1;
  11243. }
  11244. stock.EditTime = DateTime.Now;
  11245. flow.AddTime = DateTime.Now;
  11246. flow.Id = IdFactory.NewId();
  11247. if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  11248. {
  11249. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  11250. res.ResMsg = stock.InvBarCode + "出库中不允许改判";
  11251. return res;
  11252. }
  11253. else
  11254. {
  11255. stocklist.Add(stock);
  11256. }
  11257. flowlist.Add(flow);
  11258. }
  11259. else
  11260. {
  11261. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  11262. res.ResMsg = item.MatBarCode + "库存不存在";
  11263. return res;
  11264. }
  11265. }
  11266. try
  11267. {
  11268. _db.BeginTran();
  11269. _billInvflow.InsertRange(flowlist);
  11270. _billInvnowrepository.UpdateRange(stocklist);
  11271. _db.CommitTran();
  11272. }
  11273. catch (Exception ex)
  11274. {
  11275. _db.RollbackTran();
  11276. _logger.LogInformation("改判异常" + ex.ToString());
  11277. }
  11278. return res;
  11279. }
  11280. public SRes InitWareCell(int row, int col, int deot, int rowcount, int tun)
  11281. {
  11282. var res = new SRes();
  11283. var ware = _basewarehouserepository.GetFirst(p => p.IsStop == 0);
  11284. for (int i = 0; i < row; i++)
  11285. {
  11286. string shlf = tun.ToString();
  11287. if (row == 2)
  11288. {
  11289. if (i == 0)
  11290. {
  11291. shlf = shlf + "L";
  11292. }
  11293. else
  11294. {
  11295. shlf = shlf + "R";
  11296. }
  11297. }
  11298. else if (row == 4) //双升位
  11299. {
  11300. if (i == 0 || i == 1)
  11301. {
  11302. shlf = shlf + "L";
  11303. }
  11304. else
  11305. {
  11306. shlf = shlf + "R";
  11307. }
  11308. }
  11309. for (int j = 0; j < deot; j++)
  11310. {
  11311. for (int k = 0; k < col; k++)
  11312. {
  11313. var dept = "";
  11314. if (i == 0 || i == 3)
  11315. {
  11316. dept = "2";
  11317. }
  11318. else
  11319. {
  11320. dept = "1";
  11321. }
  11322. var code = new BaseWarecell()
  11323. {
  11324. Code = (rowcount + i).ToString() + "-" + (k + 1).ToString() + "-" + (j + 1).ToString() + "-" + shlf + "-" + dept,
  11325. Tunnel = tun,
  11326. IsStop = 0,
  11327. Name = (rowcount + i).ToString() + "行" + (k + 1).ToString() + "列" + (j + 1).ToString() + "层" + shlf + "货架" + dept + "深度",
  11328. WarehouseId = ware.Id,
  11329. WarehouseCode = ware.Code,
  11330. WareAreaId = 0,
  11331. StateNum = LocationState.LocationState_Empty,
  11332. TypeNum = LocationType.LocationType_StorageLocation,
  11333. Size = 1,
  11334. Row = (rowcount + i),
  11335. Col = (k + 1),
  11336. Layer = (j + 1),
  11337. Depth = int.Parse(dept),
  11338. SCRel = "SRM",
  11339. ContGrpId = 0,
  11340. ContGrpBarCode = "",
  11341. AddWho = "wms",
  11342. EditWho = "wms",
  11343. Shelf = shlf,
  11344. Floor = (j + 1) <= 4 ? 1 : (j + 1) > 4 && (j + 1) <= 8 ? 2 : (j + 1) > 8 && (j + 1) <= 12 ? 3 : 0
  11345. };
  11346. _basewarecellrepository.Insert(code);
  11347. }
  11348. }
  11349. }
  11350. return res;
  11351. }
  11352. public sxSysJob GetJobEntityByid(string id)
  11353. {
  11354. return _jobrepository.GetSingle(p => p.Id == long.Parse(id));
  11355. }
  11356. public sxSysJob GetJobEntityByCode(string Code)
  11357. {
  11358. return _jobrepository.GetSingle(p => p.Code == Code);
  11359. }
  11360. public List<sxSysJobApiRelation> GetJobapilist(long id)
  11361. {
  11362. return _jobApirepository.GetList(p => p.JobId == id);
  11363. }
  11364. public List<sxSysJob> GetJobList()
  11365. {
  11366. return _jobrepository.GetList();
  11367. }
  11368. /// <summary>
  11369. /// 接收扭转结果
  11370. /// </summary>
  11371. /// <param name="request"></param>
  11372. /// <returns></returns>
  11373. public SRes TorsChkValue(TorsChkValueRequest request)
  11374. {
  11375. var res = new SRes();
  11376. try
  11377. {
  11378. 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();
  11379. if (taskold == null)
  11380. {
  11381. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11382. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11383. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11384. return res;
  11385. }
  11386. if (taskold.Status == TaskStatus.Finish && !_torchbandinforepository.IsAny(p => p.TaskNo == request.TaskNo))
  11387. {
  11388. var codes = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.IsTorsChk == true);
  11389. if (codes == null)
  11390. {
  11391. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11392. res.ResMsg = request.TaskNo + "条码信息不存在";
  11393. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "条码信息不存在", Time = DateTime.Now });
  11394. return res;
  11395. }
  11396. _logger.LogInformation("扭转下位机重复上抛扭转值,任务号" + request.TaskNo);
  11397. return res;
  11398. //var time1 = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  11399. //var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  11400. //var reqids = Guid.NewGuid().ToString();
  11401. //var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162001", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  11402. //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) };
  11403. //if (request.TorsChkValue == "9.990000")
  11404. //{
  11405. // torschks.OvcResult = false;
  11406. // torschks.ChkVal = 0;
  11407. //}
  11408. //if (request.TorsChkChord == "49.999001")
  11409. //{
  11410. // torschks.Bow = 5;
  11411. // torschks.BowResult = false;
  11412. //}
  11413. //if (request.TorsChkFlatness == "299.998993")
  11414. //{
  11415. // torschks.Straight = 10;
  11416. // torschks.StraightResult = false;
  11417. //}
  11418. //var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(torschks), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  11419. //var esbresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  11420. //if (esbresponse.success == false)
  11421. //{
  11422. // _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11423. // {
  11424. // TorsChkQty = codes.TorsChkQty + 1,
  11425. // TorsChkTime = DateTime.ParseExact(time1, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11426. // TorsChkValue = torschks.ChkVal,
  11427. // TorsChkChord = torschks.Bow,
  11428. // TorsChkFlatness = torschks.Straight,
  11429. // TorsChkMachCode = request.TorsChkWb,
  11430. // TorsChkStation = request.TorsChkStation,
  11431. // TorsChkChordIsGood = request.TorsChkChordIsGood,
  11432. // TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11433. // TorsChkValueIsGood = request.TorsChkValueIsGood,
  11434. // Grade = "C"
  11435. // }, p => p.ContGrpBarCode == codes.ContGrpBarCode);
  11436. // //记录描述信息
  11437. // var error = new BaseErrorinfo()
  11438. // {
  11439. // ContBarCode = codes.ContGrpBarCode,
  11440. // Message = esbresponse.message,
  11441. // AddWho = "",
  11442. // EditWho = "",
  11443. // Count = 1
  11444. // };
  11445. // var errors = _errorinforepository.GetSingle(p => p.ContBarCode == codes.ContGrpBarCode && p.Message == error.Message);
  11446. // if (errors != null)
  11447. // {
  11448. // _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11449. // {
  11450. // Count = errors.Count + 1
  11451. // }, p => p.ContBarCode == errors.ContBarCode);
  11452. // }
  11453. // else
  11454. // {
  11455. // _errorinforepository.Insert(error);
  11456. // }
  11457. // return res;
  11458. //}
  11459. //else
  11460. //{
  11461. // _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11462. // {
  11463. // TorsChkQty = codes.TorsChkQty + 1,
  11464. // TorsChkTime = DateTime.ParseExact(time1, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11465. // TorsChkValue = torschks.ChkVal,
  11466. // TorsChkChord = torschks.Bow,
  11467. // TorsChkFlatness = torschks.Straight,
  11468. // TorsChkMachCode = request.TorsChkWb,
  11469. // TorsChkStation = request.TorsChkStation,
  11470. // TorsChkChordIsGood = request.TorsChkChordIsGood,
  11471. // TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11472. // TorsChkValueIsGood = request.TorsChkValueIsGood
  11473. // }, p => p.ContGrpBarCode == codes.ContGrpBarCode);
  11474. // return res;
  11475. //}
  11476. }
  11477. var code = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11478. if (code == null)
  11479. {
  11480. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11481. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11482. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "库存状态不对,不是出库中", Time = DateTime.Now });
  11483. return res;
  11484. }
  11485. var torch = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo);
  11486. if (torch == null)
  11487. {
  11488. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11489. res.ResMsg = request.TaskNo + "该工字轮没有扭转绑定信息";
  11490. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮没有扭转绑定信息", Time = DateTime.Now });
  11491. return res;
  11492. }
  11493. if (torch.Machine != request.TorsChkWb)
  11494. {
  11495. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11496. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符";
  11497. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符", Time = DateTime.Now });
  11498. return res;
  11499. }
  11500. if (torch.WorkStation != request.TorsChkStation)
  11501. {
  11502. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11503. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符";
  11504. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符", Time = DateTime.Now });
  11505. return res;
  11506. }
  11507. if (code.SideNum == 1)
  11508. {
  11509. }
  11510. else
  11511. {
  11512. #region 扭转值结果处理
  11513. //上传mes扭转结果
  11514. var time = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  11515. var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  11516. var reqid = Guid.NewGuid().ToString();
  11517. var req = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162001", requestId = reqid, TrackId = reqid, sourceCode = "163K" } };
  11518. 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) };
  11519. if (request.TorsChkValue == "9.990000")
  11520. {
  11521. torschk.OvcResult = false;
  11522. torschk.ChkVal = 0;
  11523. }
  11524. if (request.TorsChkChord == "49.999001")
  11525. {
  11526. torschk.Bow = 5;
  11527. torschk.BowResult = false;
  11528. }
  11529. if (request.TorsChkFlatness == "299.998993")
  11530. {
  11531. torschk.Straight = 10;
  11532. torschk.StraightResult = false;
  11533. }
  11534. //CK0701\CK0702\CK0703\CK0704\CK0705\CK0706\CK0707\CK0708\CK0709\CK0710
  11535. _logger.LogInformation("扭转值接口调用,传参条码:" + code.ContGrpBarCode);
  11536. var strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(torschk), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
  11537. var response = JsonConvert.DeserializeObject<TorschMesResponse>(strEsbRes);
  11538. _logger.LogInformation("MES扭转值返回结果:条码" + code.ContGrpBarCode + ",结果:" + response.success + ",扭转等级:" + response.data.GradeCode);
  11539. if (response.success == false)
  11540. {
  11541. //记录描述信息
  11542. var error = new BaseErrorinfo()
  11543. {
  11544. ContBarCode = code.ContGrpBarCode,
  11545. Message = response.message,
  11546. AddWho = "",
  11547. EditWho = "",
  11548. Count = 1
  11549. };
  11550. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11551. if (errorinfo != null)
  11552. {
  11553. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11554. {
  11555. Count = errorinfo.Count + 1
  11556. }, p => p.ContBarCode == errorinfo.ContBarCode);
  11557. }
  11558. else
  11559. {
  11560. _errorinforepository.Insert(error);
  11561. }
  11562. //异常工字轮暂时先回库
  11563. //if (code.ContUsageQty == 2)
  11564. //{
  11565. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11566. // var flow2 = _mapper.Map<BillInvflow>(code);
  11567. // flow2.Id = GetId();
  11568. // flow2.AddTime = DateTime.Now;
  11569. // flow2.EditTime = DateTime.Now;
  11570. // flow2.Memo = "扭转超时出库完成";
  11571. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  11572. // _billInvflow.Insert(flow2);
  11573. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11574. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11575. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11576. // {
  11577. // Status = TaskStatus.Finish,
  11578. // EditTime = DateTime.Now,
  11579. // ManualRemarks = "扭转超时"
  11580. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11581. // var wcsdt = new WCS_TaskDtl()
  11582. // {
  11583. // ID = Guid.NewGuid(),
  11584. // CurPoint = request.TorsChkWb,
  11585. // AddTime = DateTime.Now,
  11586. // AddWho = "wms",
  11587. // Enabled = true,
  11588. // ParentTaskCode = taskold.Id,
  11589. // Desc = "扭转超时"
  11590. // };
  11591. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  11592. // return res;
  11593. //}
  11594. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11595. {
  11596. TorsChkQty = code.TorsChkQty + 1,
  11597. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11598. TorsChkValue = torschk.ChkVal,
  11599. TorsChkChord = torschk.Bow,
  11600. TorsChkFlatness = torschk.Straight,
  11601. TorsChkMachCode = request.TorsChkWb,
  11602. TorsChkStation = request.TorsChkStation,
  11603. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11604. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11605. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11606. Grade = "C",
  11607. SideNum = 1,
  11608. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11609. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11610. }
  11611. else
  11612. {
  11613. //异常工字轮暂时先回库
  11614. //if (code.ContUsageQty == 2)
  11615. //{
  11616. // //记录描述信息
  11617. // var error = new BaseErrorinfo()
  11618. // {
  11619. // ContBarCode = code.ContGrpBarCode,
  11620. // Message = code.ContGrpBarCode + "扭转超时,直接异常排出",
  11621. // AddWho = "",
  11622. // EditWho = "",
  11623. // Count = 1
  11624. // };
  11625. // var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11626. // if (errorinfo != null)
  11627. // {
  11628. // _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11629. // {
  11630. // Count = errorinfo.Count + 1
  11631. // }, p => p.ContBarCode == errorinfo.ContBarCode);
  11632. // }
  11633. // else
  11634. // {
  11635. // _errorinforepository.Insert(error);
  11636. // }
  11637. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11638. // var flow2 = _mapper.Map<BillInvflow>(code);
  11639. // flow2.Id = GetId();
  11640. // flow2.AddTime = DateTime.Now;
  11641. // flow2.EditTime = DateTime.Now;
  11642. // flow2.Memo = "扭转超时出库完成";
  11643. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  11644. // _billInvflow.Insert(flow2);
  11645. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11646. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11647. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11648. // {
  11649. // Status = TaskStatus.Finish,
  11650. // EditTime = DateTime.Now,
  11651. // ManualRemarks = "扭转超时"
  11652. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11653. // var wcsdt = new WCS_TaskDtl()
  11654. // {
  11655. // ID = Guid.NewGuid(),
  11656. // CurPoint = request.TorsChkWb,
  11657. // AddTime = DateTime.Now,
  11658. // AddWho = "wms",
  11659. // Enabled = true,
  11660. // ParentTaskCode = taskold.Id,
  11661. // Desc = "扭转超时"
  11662. // };
  11663. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  11664. // return res;
  11665. //}
  11666. if (response.success == true && response.data.GradeCode == "A")
  11667. {
  11668. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11669. {
  11670. TorsChkQty = code.TorsChkQty + 1,
  11671. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11672. TorsChkValue = torschk.ChkVal,
  11673. TorsChkChord = torschk.Bow,
  11674. TorsChkFlatness = torschk.Straight,
  11675. TorsChkMachCode = request.TorsChkWb,
  11676. TorsChkStation = request.TorsChkStation,
  11677. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11678. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11679. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11680. Grade = "A",
  11681. SideNum = 1,
  11682. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11683. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11684. }
  11685. else
  11686. {
  11687. var error = new BaseErrorinfo()
  11688. {
  11689. ContBarCode = code.ContGrpBarCode,
  11690. Message = response.message,
  11691. AddWho = "",
  11692. EditWho = "",
  11693. Count = 1
  11694. };
  11695. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  11696. if (errorinfo != null)
  11697. {
  11698. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  11699. {
  11700. Count = errorinfo.Count + 1
  11701. }, p => p.ContBarCode == errorinfo.ContBarCode);
  11702. }
  11703. else
  11704. {
  11705. _errorinforepository.Insert(error);
  11706. }
  11707. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11708. {
  11709. TorsChkQty = code.TorsChkQty + 1,
  11710. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  11711. TorsChkValue = torschk.ChkVal,
  11712. TorsChkChord = torschk.Bow,
  11713. TorsChkFlatness = torschk.Straight,
  11714. TorsChkMachCode = request.TorsChkWb,
  11715. TorsChkStation = request.TorsChkStation,
  11716. TorsChkChordIsGood = request.TorsChkChordIsGood,
  11717. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  11718. TorsChkValueIsGood = request.TorsChkValueIsGood,
  11719. SideNum = 1,
  11720. Grade = "C",
  11721. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  11722. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11723. }
  11724. }
  11725. #endregion
  11726. }
  11727. _db.BeginTran();
  11728. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  11729. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == code.ContGrpId && p.Code == taskold.AddrFrom && p.ContGrpBarCode == code.ContGrpBarCode);
  11730. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode);
  11731. _billInvnowrepository.Delete(p => p.Id == code.Id);
  11732. var flow = _mapper.Map<BillInvflow>(stock);
  11733. flow.Id = GetId();
  11734. flow.AddTime = DateTime.Now;
  11735. flow.EditTime = DateTime.Now;
  11736. flow.Memo = "扭转出库任务完成";
  11737. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11738. _billInvflow.Insert(flow);
  11739. _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  11740. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11741. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11742. {
  11743. Status = TaskStatus.Finish,
  11744. EditTime = DateTime.Now,
  11745. ManualRemarks = "扭转完成,操作人" + request.User
  11746. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11747. var wcsdtl = new WCS_TaskDtl()
  11748. {
  11749. ID = Guid.NewGuid(),
  11750. CurPoint = stock.TorsChkMachCode,
  11751. AddTime = DateTime.Now,
  11752. AddWho = "wms",
  11753. Enabled = true,
  11754. ParentTaskCode = taskold.Id,
  11755. Desc = "扭转完成,操作人" + request.User
  11756. };
  11757. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  11758. var inv = stock;
  11759. inv.Id = GetId();
  11760. inv.ContGrpId = GetId();
  11761. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  11762. inv.Memo = "扭转回库";
  11763. _billInvnowrepository.Insert(inv);
  11764. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  11765. var wcs = new WCS_TaskInfo()
  11766. {
  11767. Status = TaskStatus.NewBuild,
  11768. Type = TaskType.EnterDepot,
  11769. Priority = 0,
  11770. Device = "",
  11771. SrmStation = "",
  11772. AddrFrom = inv.TorsChkMachCode,
  11773. BarCode = stock.ContGrpBarCode,
  11774. AddWho = "wms",
  11775. EditWho = "wms",
  11776. WarehouseCode = "sxhouse",
  11777. AddrTo = "",
  11778. Tunnel = "",
  11779. MaterialCode = inv.MatCode,
  11780. MatCode = inv.MatCode,
  11781. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  11782. Grade = inv.Grade
  11783. };
  11784. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  11785. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  11786. var wcsdtls = new WCS_TaskDtl()
  11787. {
  11788. ID = Guid.NewGuid(),
  11789. CurPoint = wcstask.AddrFrom,
  11790. AddTime = DateTime.Now,
  11791. AddWho = "wms",
  11792. Enabled = true,
  11793. ParentTaskCode = wcstask.ID,
  11794. Desc = wcstask.BusType
  11795. };
  11796. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  11797. _torschwbcount.UpdateSetColumnsTrue(p => new TorschWbCount()
  11798. {
  11799. WbCount = p.WbCount - 1
  11800. }, p => p.Code == request.TorsChkWb);
  11801. _db.CommitTran();
  11802. }
  11803. catch (Exception ex)
  11804. {
  11805. _db.RollbackTran();
  11806. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11807. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  11808. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ex.Message, Time = DateTime.Now });
  11809. return res;
  11810. }
  11811. return res;
  11812. }
  11813. public SRes TorsChkStationbinde(TorsChkStationbindeRequest request)
  11814. {
  11815. var res = new SRes();
  11816. try
  11817. {
  11818. if (request.Memo1.Trim() == "2")
  11819. {
  11820. 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();
  11821. if (taskold == null)
  11822. {
  11823. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11824. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11825. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11826. return res;
  11827. }
  11828. var torchbandinfo = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo && p.WorkStation == request.WorkStation && p.Machine == request.Machine);
  11829. if (torchbandinfo != null)
  11830. {
  11831. return res;
  11832. }
  11833. var count = _torchbandinforepository.GetList(p => p.TaskNo == request.TaskNo).Count;
  11834. if (count > 0)
  11835. {
  11836. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11837. res.ResMsg = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位";
  11838. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位", Time = DateTime.Now });
  11839. return res;
  11840. }
  11841. var tors = new BaseTorchbandinfo()
  11842. {
  11843. TaskNo = request.TaskNo,
  11844. ContBarCode = taskold.BarCode,
  11845. WorkStation = request.WorkStation,
  11846. Machine = request.Machine,
  11847. IsStop = 0,
  11848. AddWho = "",
  11849. EditWho = ""
  11850. };
  11851. _torchbandinforepository.Insert(tors);
  11852. }
  11853. else
  11854. {
  11855. 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();
  11856. if (task == null)
  11857. {
  11858. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11859. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  11860. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "不存在扭转出库的任务", Time = DateTime.Now });
  11861. return res;
  11862. }
  11863. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  11864. if (stock == null)
  11865. {
  11866. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11867. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  11868. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "没有找到扭转出库的库存信息", Time = DateTime.Now });
  11869. return res;
  11870. }
  11871. _db.BeginTran();
  11872. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  11873. var flow = _mapper.Map<BillInvflow>(stock);
  11874. flow.Id = GetId();
  11875. flow.AddTime = DateTime.Now;
  11876. flow.EditTime = DateTime.Now;
  11877. flow.Memo = "不需扭转";
  11878. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  11879. _billInvflow.Insert(flow);
  11880. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  11881. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  11882. {
  11883. Status = TaskStatus.Finish,
  11884. EditTime = DateTime.Now,
  11885. ManualRemarks = "未扭转"
  11886. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  11887. var wcsdtl = new WCS_TaskDtl()
  11888. {
  11889. ID = Guid.NewGuid(),
  11890. CurPoint = request.Machine,
  11891. AddTime = DateTime.Now,
  11892. AddWho = "wms",
  11893. Enabled = true,
  11894. ParentTaskCode = task.Id,
  11895. Desc = "未扭转"
  11896. };
  11897. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  11898. var inv = stock;
  11899. inv.Id = GetId();
  11900. inv.ContGrpId = GetId();
  11901. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  11902. inv.Memo = "未扭转";
  11903. _billInvnowrepository.Insert(inv);
  11904. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  11905. var wcs = new WCS_TaskInfo()
  11906. {
  11907. Status = TaskStatus.NewBuild,
  11908. Type = TaskType.EnterDepot,
  11909. Priority = 0,
  11910. Device = "",
  11911. SrmStation = "",
  11912. AddrFrom = request.Machine,
  11913. BarCode = stock.ContGrpBarCode,
  11914. AddWho = "wms",
  11915. EditWho = "wms",
  11916. WarehouseCode = "sxhouse",
  11917. AddrTo = "",
  11918. Tunnel = "",
  11919. MaterialCode = inv.MatCode,
  11920. MatCode = inv.MatCode,
  11921. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  11922. Grade = inv.Grade
  11923. };
  11924. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  11925. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  11926. var wcsdtls = new WCS_TaskDtl()
  11927. {
  11928. ID = Guid.NewGuid(),
  11929. CurPoint = wcstask.AddrFrom,
  11930. AddTime = DateTime.Now,
  11931. AddWho = "wms",
  11932. Enabled = true,
  11933. ParentTaskCode = wcstask.ID,
  11934. Desc = wcstask.BusType
  11935. };
  11936. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  11937. _db.CommitTran();
  11938. }
  11939. }
  11940. catch (Exception ex)
  11941. {
  11942. _db.RollbackTran();
  11943. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  11944. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  11945. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = ex.Message, Time = DateTime.Now });
  11946. return res;
  11947. }
  11948. return res;
  11949. }
  11950. public SRes TorsChkErrorinfo(TorsChkErrorinfoRequest request)
  11951. {
  11952. var res = new SRes();
  11953. 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 });
  11954. return res;
  11955. }
  11956. public SRes CellInfo(string code)
  11957. {
  11958. var res = new SRes();
  11959. MoveTask(code);
  11960. return res;
  11961. }
  11962. public TorsChkResponse GetTorsChkinfo(GetTorsChkinfoRequest request)
  11963. {
  11964. var res = new TorsChkResponse();
  11965. 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();
  11966. if (task == null)
  11967. {
  11968. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  11969. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  11970. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  11971. return res;
  11972. }
  11973. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  11974. if (stock == null)
  11975. {
  11976. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  11977. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  11978. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription(), Time = DateTime.Now });
  11979. return res;
  11980. }
  11981. var marter = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == stock.MatCode).First();
  11982. if (marter == null)
  11983. {
  11984. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  11985. res.ResMsg = request.TaskNo.ToString() + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  11986. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(), Time = DateTime.Now });
  11987. return res;
  11988. }
  11989. if (task.BarCode.EndsWith("R"))
  11990. {
  11991. res.Face = "R";
  11992. }
  11993. else
  11994. {
  11995. res.Face = "L";
  11996. }
  11997. res.GoodsType = task.GoodsType;
  11998. res.Isdetection = 2;
  11999. res.Diameter = marter.Diameter;
  12000. return res;
  12001. }
  12002. public SRes Manaler(DetailCodeStrdtoRequest request)
  12003. {
  12004. var res = new SRes();
  12005. //var list = _basewarecellrepository.GetList(p => p.StateNum == LocationState.LocationState_Full && p.IsStop == 0 && p.Floor == 3).OrderBy(p => p.Depth).Take(50);
  12006. foreach (var item in request.Location)
  12007. {
  12008. var cellcode = _basewarecellrepository.GetSingle(p => p.Code == item && p.StateNum == LocationState.LocationState_Full && p.IsStop == 0);
  12009. if (cellcode == null)
  12010. {
  12011. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12012. res.ResMsg = item + "不满足出库条件,请检查当前货位的状态";
  12013. return res;
  12014. }
  12015. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == cellcode.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  12016. if (stock == null)
  12017. {
  12018. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  12019. res.ResMsg = item + "没有库存";
  12020. return res;
  12021. }
  12022. if (!string.IsNullOrEmpty(stock.PreStock))
  12023. {
  12024. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12025. res.ResMsg = stock.ContGrpBarCode + "该库存已被锁定,不允许手动出库";
  12026. return res;
  12027. }
  12028. if (cellcode.Depth == 2)
  12029. {
  12030. var respon = MoveTask(cellcode.Code);
  12031. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  12032. {
  12033. return respon;
  12034. }
  12035. }
  12036. try
  12037. {
  12038. var bus = "";
  12039. if (request.EndPoint == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetHashCode())
  12040. {
  12041. bus = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription();
  12042. }
  12043. //else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_StackStockOut.GetHashCode())
  12044. //{
  12045. // bus = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription();
  12046. //}
  12047. else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetHashCode())
  12048. {
  12049. bus = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription();
  12050. }
  12051. else
  12052. {
  12053. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12054. res.ResMsg = stock.ContGrpBarCode + "业务类型参数错误";
  12055. return res;
  12056. }
  12057. var wcs = new WCS_TaskInfo()
  12058. {
  12059. Status = TaskStatus.NewBuild,
  12060. Type = TaskType.OutDepot,
  12061. Priority = 0,
  12062. Device = cellcode.SCRel,
  12063. SrmStation = "1",
  12064. AddrFrom = cellcode.Code,
  12065. BarCode = stock.ContGrpBarCode,
  12066. AddWho = "wms",
  12067. EditWho = "wms",
  12068. WarehouseCode = cellcode.WarehouseCode,
  12069. AddrTo = "",
  12070. Tunnel = cellcode.Tunnel.ToString(),
  12071. MaterialCode = stock.MatCode,
  12072. MatCode = stock.MatCode,
  12073. BusType = bus,
  12074. Floor = cellcode.Floor,
  12075. Grade = stock.Grade,
  12076. Length = stock.LengthQty,
  12077. ManualRemarks = request.User + "下发手动出库任务"
  12078. };
  12079. _db.BeginTran();
  12080. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  12081. {
  12082. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  12083. EditTime = DateTime.Now
  12084. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  12085. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  12086. {
  12087. StateNum = LocationState.LocationState_StockOut,
  12088. EditTime = DateTime.Now
  12089. }, p => p.Code == cellcode.Code);
  12090. var flow = _mapper.Map<BillInvflow>(stock);
  12091. flow.Id = GetId();
  12092. flow.AddTime = DateTime.Now;
  12093. flow.EditTime = DateTime.Now;
  12094. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  12095. flow.Memo = "Test";
  12096. _billInvflow.Insert(flow);
  12097. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  12098. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  12099. var wcsdtl = new WCS_TaskDtl()
  12100. {
  12101. ID = Guid.NewGuid(),
  12102. CurPoint = wcstask.AddrFrom,
  12103. AddTime = DateTime.Now,
  12104. AddWho = "wms",
  12105. Enabled = true,
  12106. ParentTaskCode = wcstask.ID,
  12107. Desc = wcstask.BusType
  12108. };
  12109. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  12110. _db.CommitTran();
  12111. InsertErrorinfo(stock.ContGrpBarCode, "环线异常排出口:5186|,人工异常排出" + "操作人员:" + request.User + "|" + DateTime.Now);
  12112. }
  12113. catch (Exception ex)
  12114. {
  12115. _db.RollbackTran();
  12116. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12117. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  12118. return res;
  12119. }
  12120. }
  12121. return res;
  12122. }
  12123. private SRes MoveTask(string Cell)
  12124. {
  12125. lock (lockerPalletizingPackTask)
  12126. {
  12127. var res = new SRes() { Memo1 = "1" };
  12128. var cellform = _basewarecellrepository.GetFirst(p => p.Code == Cell && p.Depth == 2);
  12129. if (cellform == null)
  12130. {
  12131. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12132. res.ResMsg = "该任务所在货位不是二深货位";
  12133. res.Memo1 = "1";
  12134. return res;
  12135. }
  12136. 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);
  12137. if (cellTo == null)
  12138. {
  12139. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12140. res.ResMsg = Cell + "对应一深位货位被禁用或者不存在";
  12141. res.Memo1 = "1"; //1:不允许生成出库任务;2:允许
  12142. return res;
  12143. }
  12144. lock (lockerApplyLoc)
  12145. {
  12146. try
  12147. {
  12148. if (cellTo.StateNum == LocationState.LocationState_Empty)
  12149. {
  12150. res.Memo1 = "2";
  12151. return res;
  12152. }
  12153. else if (cellTo.StateNum == LocationState.LocationState_Full)
  12154. {
  12155. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == cellTo.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  12156. if (stock == null)
  12157. {
  12158. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12159. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  12160. res.Memo1 = "1";
  12161. return res;
  12162. }
  12163. //库位
  12164. var cell = ApplyLoc(new ApplyLocRequest()
  12165. {
  12166. IsMove = true,
  12167. MaterialId = stock.MatId,
  12168. MaterialCode = stock.MatCode,
  12169. TunnelNum = cellTo.Tunnel,
  12170. WarehuoseId = cellTo.WarehouseId,
  12171. Floor = cellTo.Floor,
  12172. Fork = 2,
  12173. Wbgroup = stock.WbGroupCode,
  12174. Wind = stock.Wind,
  12175. IsControlpanel = stock.IsControlpanel,
  12176. IsTorsChk = stock.IsTorsChk,
  12177. TorsChkQty = stock.TorsChkQty,
  12178. ProductTime = stock.ProductTime
  12179. });
  12180. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  12181. {
  12182. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12183. res.ResMsg = cell.ResMsg;
  12184. res.Memo1 = "1";
  12185. return res;
  12186. }
  12187. 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))
  12188. {
  12189. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12190. res.ResMsg = cell.ResData.CellNo + "已被使用";
  12191. res.Memo1 = "1";
  12192. return res;
  12193. }
  12194. 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())
  12195. {
  12196. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12197. res.ResMsg = cell.ResData.CellNo + "存在未结束的入库任务或移库任务,不允许使用";
  12198. res.Memo1 = "1";
  12199. return res;
  12200. }
  12201. var wcs = new WCS_TaskInfo()
  12202. {
  12203. Type = TaskType.TransferDepot,
  12204. Status = TaskStatus.NewBuild,
  12205. Priority = 0,
  12206. Device = cellTo.SCRel,
  12207. SrmStation = "",
  12208. AddrFrom = cellTo.Code,
  12209. AddrTo = cell.ResData.CellNo,
  12210. LastInteractionPoint = "",
  12211. BarCode = stock.ContGrpBarCode,
  12212. Length = stock.LengthQty,
  12213. AddTime = DateTime.Now,
  12214. StartTime = DateTime.Now,
  12215. DocID = 0,
  12216. PalletType = 1,
  12217. ProdLine = 0,
  12218. AddWho = "wms",
  12219. WarehouseCode = cellTo.WarehouseCode,
  12220. Enabled = true,
  12221. WorkBench = "",
  12222. Tunnel = cellTo.Tunnel.ToString(),
  12223. Floor = cellTo.Floor,
  12224. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  12225. };
  12226. _db.BeginTran();
  12227. var celltemp = _basewarecellrepository.GetSingle(p => p.Code == cell.ResData.CellNo);
  12228. if (celltemp.StateNum != LocationState.LocationState_Empty || celltemp.ContGrpId > 0 || !string.IsNullOrEmpty(celltemp.ContGrpBarCode))
  12229. {
  12230. _db.RollbackTran();
  12231. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12232. res.ResMsg = cell.ResData.CellNo + "已被使用";
  12233. res.Memo1 = "1";
  12234. _logger.LogInformation("货位状态1:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  12235. return res;
  12236. }
  12237. _logger.LogInformation("货位状态2:" + celltemp.StateNum + ",code:" + cell.ResData.CellNo);
  12238. var task = _taskrepository.InsertReturnEntity(wcs);
  12239. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  12240. var taskdlt = new WCS_TaskDtl()
  12241. {
  12242. ID = Guid.NewGuid(),
  12243. CurPoint = task.AddrFrom,
  12244. AddTime = DateTime.Now,
  12245. AddWho = "wms",
  12246. Enabled = true,
  12247. ParentTaskCode = task.ID,
  12248. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  12249. };
  12250. _taskdetailrepository.InsertableSplitTable(taskdlt);
  12251. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  12252. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  12253. _db.CommitTran();
  12254. res.Memo1 = "2";
  12255. }
  12256. else if (cellTo.StateNum == LocationState.LocationState_StockIn)
  12257. {
  12258. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12259. res.ResMsg = "一升位有入库任务,二升位不允许出库";
  12260. res.Memo1 = "1";
  12261. return res;
  12262. }
  12263. else if (cellTo.StateNum == LocationState.LocationState_StockOut)
  12264. {
  12265. res.Memo1 = "2";
  12266. return res;
  12267. }
  12268. else if (cellTo.StateNum == LocationState.LocationState_StockMove)
  12269. {
  12270. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12271. res.ResMsg = "一升位有移库任务,二升位不允许出库";
  12272. res.Memo1 = "1";
  12273. return res;
  12274. }
  12275. }
  12276. catch (Exception ex)
  12277. {
  12278. _db.RollbackTran();
  12279. _logger.LogInformation("移库任务创建失败" + ex.ToString());
  12280. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12281. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  12282. res.Memo1 = "1";
  12283. }
  12284. }
  12285. return res;
  12286. }
  12287. }
  12288. /// <summary>
  12289. /// 移库任务
  12290. /// </summary>
  12291. /// <param name="request"></param>
  12292. /// <returns></returns>
  12293. public SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request)
  12294. {
  12295. var res = new SRes<WcsMoveTaskResponse>()
  12296. {
  12297. ResData = new WcsMoveTaskResponse()
  12298. {
  12299. ResType = WcsContractWcsMoveTaskEnum.失败.GetHashCode(),
  12300. CellNo = ""
  12301. }
  12302. };
  12303. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).First();
  12304. if (wcstask == null)
  12305. {
  12306. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12307. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  12308. return res;
  12309. }
  12310. var dept2Loc = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom && p.Depth == 2);
  12311. if (dept2Loc == null)
  12312. {
  12313. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12314. res.ResMsg = "该任务所在货位不是二深货位";
  12315. return res;
  12316. }
  12317. 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);
  12318. if (dept1Loc == null)
  12319. {
  12320. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  12321. res.ResMsg = dept2Loc.Code + "对应一深位货位被禁用或者不存在";
  12322. return res;
  12323. }
  12324. if (wcstask.Type != TaskType.OutDepot)
  12325. {
  12326. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12327. res.ResMsg = "只有出库任务才能调用此接口";
  12328. return res;
  12329. }
  12330. res.ResData.CellNo = dept1Loc.Code;
  12331. lock (lockerApplyLoc)
  12332. {
  12333. try
  12334. {
  12335. if (dept1Loc.StateNum == LocationState.LocationState_Empty)
  12336. {
  12337. res.ResData.ResType = WcsContractWcsMoveTaskEnum.允许2升位执行.GetHashCode();
  12338. res.ResData.CellNo = "";
  12339. return res;
  12340. }
  12341. else if (dept1Loc.StateNum == LocationState.LocationState_Full)
  12342. {
  12343. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  12344. res.ResData.CellNo = dept1Loc.Code;
  12345. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == dept1Loc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  12346. if (stock == null)
  12347. {
  12348. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12349. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  12350. return res;
  12351. }
  12352. var wareshouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  12353. //库位
  12354. var cell = ApplyLoc(new ApplyLocRequest()
  12355. {
  12356. IsMove = true,
  12357. MaterialId = stock.MatId,
  12358. MaterialCode = stock.MatCode,
  12359. TunnelNum = dept1Loc.Tunnel,
  12360. WarehuoseId = wareshouse.Id,
  12361. Floor = dept1Loc.Floor,
  12362. Fork = 2,
  12363. Wbgroup = stock.WbGroupCode,
  12364. Wind = stock.Wind,
  12365. IsControlpanel = stock.IsControlpanel,
  12366. IsTorsChk = stock.IsTorsChk,
  12367. TorsChkQty = stock.TorsChkQty,
  12368. ProductTime = stock.ProductTime
  12369. });
  12370. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  12371. {
  12372. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12373. res.ResMsg = cell.ResMsg;
  12374. return res;
  12375. }
  12376. var wcs = new WCS_TaskInfo()
  12377. {
  12378. Type = TaskType.TransferDepot,
  12379. Status = TaskStatus.NewBuild,
  12380. Priority = 0,
  12381. Device = dept1Loc.SCRel,
  12382. SrmStation = "",
  12383. AddrFrom = dept1Loc.Code,
  12384. AddrTo = cell.ResData.CellNo,
  12385. LastInteractionPoint = "",
  12386. BarCode = stock.ContGrpBarCode,
  12387. Length = stock.LengthQty,
  12388. AddTime = DateTime.Now,
  12389. StartTime = DateTime.Now,
  12390. DocID = 0,
  12391. PalletType = 1,
  12392. ProdLine = 0,
  12393. AddWho = "wms",
  12394. WarehouseCode = wareshouse.Code,
  12395. Enabled = true,
  12396. WorkBench = "",
  12397. Tunnel = dept1Loc.Tunnel.ToString(),
  12398. Floor = dept1Loc.Floor,
  12399. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  12400. };
  12401. _db.BeginTran();
  12402. var task = _taskrepository.InsertReturnEntity(wcs);
  12403. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  12404. var taskdlt = new WCS_TaskDtl()
  12405. {
  12406. ID = Guid.NewGuid(),
  12407. CurPoint = task.AddrFrom,
  12408. AddTime = DateTime.Now,
  12409. AddWho = "wms",
  12410. Enabled = true,
  12411. ParentTaskCode = task.ID,
  12412. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  12413. };
  12414. _taskdetailrepository.InsertableSplitTable(taskdlt);
  12415. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  12416. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  12417. _db.CommitTran();
  12418. return res;
  12419. }
  12420. else if (dept1Loc.StateNum == LocationState.LocationState_StockOut)
  12421. {
  12422. res.ResData.ResType = WcsContractWcsMoveTaskEnum.一深位有出库任务.GetHashCode();
  12423. res.ResData.CellNo = dept1Loc.Code;
  12424. return res;
  12425. }
  12426. //判断移库任务是否已经存在
  12427. else if (dept1Loc.StateNum == LocationState.LocationState_StockMove)
  12428. {
  12429. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  12430. res.ResData.CellNo = dept1Loc.Code;
  12431. return res;
  12432. }
  12433. else
  12434. {
  12435. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12436. res.ResMsg = "一深位有入库任务,优先执行入库任务";
  12437. return res;
  12438. }
  12439. }
  12440. catch (Exception ex)
  12441. {
  12442. _db.RollbackTran();
  12443. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  12444. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  12445. _logger.LogInformation(ex.ToString());
  12446. return res;
  12447. }
  12448. }
  12449. return res;
  12450. }
  12451. private SRes SpoolMaterialInfoTrans1(SxSpoolMaterialInfoTrans1Request reqDto)
  12452. {
  12453. var res = new SRes();
  12454. try
  12455. {
  12456. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  12457. //物料
  12458. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  12459. if (mater == null)
  12460. {
  12461. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  12462. res.ResMsg = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  12463. return res;
  12464. }
  12465. //检查条码
  12466. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  12467. if (barstock == null)
  12468. {
  12469. //创建条码
  12470. var barinfo = new BillInvinit()
  12471. {
  12472. InvBarCode = reqDto.MatBarCode,
  12473. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  12474. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  12475. ExecDocsNo = reqDto.WorkOrder,
  12476. ExecDocsRowNo = reqDto.MatBarCode,
  12477. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  12478. InvInOut = InvInOutType.In,
  12479. ExecWho = "MES",
  12480. EditTime = DateTime.Now,
  12481. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  12482. InDocsNo = reqDto.WorkOrder,
  12483. InDocsRowNo = reqDto.MatBarCode,
  12484. SuppCode = "",
  12485. BomDocsNo = "",
  12486. BomSetId = 0,
  12487. SetGrpCode = "",
  12488. BomMatCode = "",
  12489. BomMatId = 0,
  12490. BomMatName = "",
  12491. MatId = mater.Id,
  12492. MatCode = mater.Code,
  12493. MatName = mater.Name,
  12494. LengthQty = reqDto.Length,
  12495. TareWQty = reqDto.Weight,
  12496. ProductTime = reqDto.ProductDate,
  12497. RFIDBarCode = "",
  12498. ProductMachCode = reqDto.WbCode,
  12499. Grade = reqDto.Grade,
  12500. HWBarCode = reqDto.SpoolCode,
  12501. HWTypeCode = reqDto.SpoolType,
  12502. ContGrpBarCode = reqDto.SpoolCode,
  12503. ContGrpId = IdFactory.NewId(),
  12504. IsFast = false,
  12505. IsRework = reqDto.IsRework,
  12506. CLBarCode = reqDto.MatBarCode,
  12507. Size = 1,
  12508. BackReason = "",
  12509. IsBack = reqDto.IsBlack,
  12510. IsCore = reqDto.IsCore,
  12511. SolderCount = reqDto.SolderCount,
  12512. IsTorsChk = reqDto.IsTorsChk,
  12513. WbGroupCode = reqDto.WbGroupCode
  12514. };
  12515. _billInvinitrepository.Insert(barinfo);
  12516. }
  12517. else
  12518. {
  12519. }
  12520. //库存
  12521. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  12522. if (stock == null)
  12523. {
  12524. var inv = new BillInvnow()
  12525. {
  12526. InvBarCode = reqDto.MatBarCode,
  12527. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  12528. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  12529. ExecDocsNo = reqDto.WorkOrder,
  12530. ExecDocsRowNo = reqDto.MatBarCode,
  12531. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  12532. InvInOut = InvInOutType.In,
  12533. ExecWho = "MES",
  12534. EditTime = DateTime.Now,
  12535. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  12536. InDocsNo = reqDto.WorkOrder,
  12537. InDocsRowNo = reqDto.MatBarCode,
  12538. SuppCode = "",
  12539. BomDocsNo = "",
  12540. BomSetId = 0,
  12541. SetGrpCode = "",
  12542. BomMatCode = "",
  12543. BomMatId = 0,
  12544. BomMatName = "",
  12545. MatId = mater.Id,
  12546. MatCode = mater.Code,
  12547. MatName = mater.Name,
  12548. LengthQty = reqDto.Length,
  12549. TareWQty = reqDto.Weight,
  12550. ProductTime = reqDto.ProductDate,
  12551. RFIDBarCode = "",
  12552. ProductMachCode = reqDto.WbCode,
  12553. Grade = reqDto.Grade,
  12554. HWBarCode = reqDto.SpoolCode,
  12555. HWTypeCode = "BS1",
  12556. ContGrpBarCode = reqDto.SpoolCode,
  12557. ContGrpId = IdFactory.NewId(),
  12558. IsFast = false,
  12559. IsRework = reqDto.IsRework,
  12560. CLBarCode = reqDto.MatBarCode,
  12561. Size = 1,
  12562. BackReason = "",
  12563. IsBack = reqDto.IsBlack,
  12564. IsCore = reqDto.IsCore,
  12565. WbGroupCode = reqDto.WbGroupCode,
  12566. IsTorsChk = reqDto.IsTorsChk,
  12567. IsControlpanel = false,
  12568. SkuCode = ""
  12569. };
  12570. _billInvnowrepository.Insert(inv);
  12571. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  12572. }
  12573. else
  12574. {
  12575. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  12576. {
  12577. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12578. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  12579. return res;
  12580. }
  12581. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  12582. {
  12583. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12584. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  12585. return res;
  12586. }
  12587. }
  12588. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  12589. if (task != null && task.Type == TaskType.OutDepot)
  12590. {
  12591. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12592. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  12593. return res;
  12594. }
  12595. if (task != null && task.Type == TaskType.EnterDepot)
  12596. {
  12597. //res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  12598. //res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  12599. return res;
  12600. }
  12601. var wcs = new WCS_TaskInfo()
  12602. {
  12603. Status = TaskStatus.NewBuild,
  12604. Type = TaskType.EnterDepot,
  12605. Priority = 0,
  12606. Device = "",
  12607. SrmStation = "",
  12608. AddrFrom = "root",
  12609. BarCode = reqDto.SpoolCode,
  12610. AddWho = "wms",
  12611. EditWho = "wms",
  12612. WarehouseCode = wareHosue.Code,
  12613. AddrTo = "",
  12614. Tunnel = "",
  12615. MaterialCode = mater.Code,
  12616. MatCode = mater.Code,
  12617. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  12618. Grade = reqDto.Grade,
  12619. Length = reqDto.Length,
  12620. WorkBench = reqDto.WbCode,
  12621. WorkOrder = reqDto.WorkOrder,
  12622. GoodsType = 0
  12623. };
  12624. _db.BeginTran();
  12625. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  12626. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  12627. var wcsdtl = new WCS_TaskDtl()
  12628. {
  12629. ID = Guid.NewGuid(),
  12630. CurPoint = reqDto.SpoolCode,
  12631. AddTime = DateTime.Now,
  12632. AddWho = "wms",
  12633. Enabled = true,
  12634. ParentTaskCode = wcstask.ID,
  12635. Desc = wcstask.BusType
  12636. };
  12637. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  12638. _db.CommitTran();
  12639. }
  12640. catch (Exception ex)
  12641. {
  12642. _db.RollbackTran();
  12643. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12644. res.ResMsg = ex.ToString();
  12645. }
  12646. return res;
  12647. }
  12648. /// <summary>
  12649. /// 扭转入库分配楼层
  12650. /// </summary>
  12651. /// <param name="reqDto"></param>
  12652. /// <returns></returns>
  12653. public SRes<int> TorsChkFloor(TorsChkFloorRequest reqDto)
  12654. {
  12655. var res = new SRes<int>();
  12656. if (reqDto.Count <= 0)
  12657. {
  12658. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  12659. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription() + "任务数量不能为0";
  12660. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip6", new RedisErrorInfo() { Equip = "TorsChkEquip6", Con = "参数错误,请求任务数量不能为0", Time = DateTime.Now });
  12661. return res;
  12662. }
  12663. var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent) ;
  12664. var bar = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.BusType == "扭转回库").OrderByDescending(p => p.AddTime).First();
  12665. var stock = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == bar.BarCode && p.InvStateCode == "InvEcecState_BuildUp").First();
  12666. var currentTime = stock.ProductTime;
  12667. var startTime = currentTime.Hour >= 13 ? currentTime.Date.AddHours(13) : currentTime.Date.AddDays(-1).AddHours(13);
  12668. var endTime = currentTime.Hour >= 13 ? currentTime.Date.AddDays(1).AddHours(8): currentTime.Date.AddHours(8);
  12669. //今天这一批次的扭转入库的分配楼层数量
  12670. 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();
  12671. int row = 8;
  12672. var cellfloor1stockcount = existstock.Where(p => p.PutLayer >= 1 && p.PutLayer <= 4 && p.PutRow > row).Count(); //1楼层同规格数量
  12673. var cellfloor2stockcount = existstock.Where(p => p.PutLayer >= 5 && p.PutLayer <= 8 && p.PutRow > row).Count(); //2楼层同规格数量
  12674. var cellfloor3stockcount = existstock.Where(p => p.PutLayer >= 9 && p.PutLayer <= 12 && p.PutRow > row).Count(); //3楼层同规格数量
  12675. //bool isTobeTors = false;
  12676. int tun = 2;
  12677. //int row = 8;
  12678. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty).ToList();
  12679. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  12680. if (disabletunnels != null && disabletunnels.Any())
  12681. {
  12682. foreach (var item in disabletunnels)
  12683. {
  12684. var distun = int.Parse(item.Default1);
  12685. var disfloor = int.Parse(item.Default2);
  12686. var disids = cell.Where(p => p.Floor == disfloor && p.Tunnel == distun).Select(p => p.Id);
  12687. cell = cell.Where(p => !disids.Contains(p.Id)).ToList();
  12688. }
  12689. }
  12690. var cellfloor1count = cell.Where(p => p.Floor == 1 && p.Tunnel > tun).Count(); //1楼层可用的货位数
  12691. var cellfloor2count = cell.Where(p => p.Floor == 2 && p.Tunnel > tun).Count(); //2楼层可用的货位数
  12692. var cellfloor3count = cell.Where(p => p.Floor == 3 && p.Tunnel > tun).Count(); //3楼层可用的货位数
  12693. var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  12694. if (!string.IsNullOrEmpty(forbidlayer))
  12695. {
  12696. if (forbidlayer.Contains("1")) cellfloor1count = 0;
  12697. if (forbidlayer.Contains("2")) cellfloor2count = 0;
  12698. if (forbidlayer.Contains("3")) cellfloor3count = 0;
  12699. }
  12700. var tempcells = new List<Tuple<int, int, double>>() {
  12701. new Tuple<int, int,double>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count * 1.0)),
  12702. new Tuple<int, int,double>(2,cellfloor2count,cellfloor2stockcount/ (cellfloor2count * 1.0)),
  12703. new Tuple<int, int,double>(3,cellfloor3count,cellfloor3stockcount/ (cellfloor3count * 1.0)),
  12704. };
  12705. //tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();
  12706. tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  12707. //每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  12708. var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  12709. if (tempcells[0].Item2 > (reqDto.Count + 10))
  12710. {
  12711. if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > floorTaskCount || tempcells[0].Item2 == 0)
  12712. {
  12713. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  12714. {
  12715. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  12716. {
  12717. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12718. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12719. res.ResData = 0;
  12720. return res;
  12721. }
  12722. else
  12723. {
  12724. res.ResData = tempcells[2].Item1;
  12725. }
  12726. }
  12727. else
  12728. {
  12729. res.ResData = tempcells[1].Item1;
  12730. }
  12731. }
  12732. else
  12733. {
  12734. res.ResData = tempcells[0].Item1;
  12735. }
  12736. }
  12737. else
  12738. {
  12739. if (tempcells[1].Item2 > (reqDto.Count + 10))
  12740. {
  12741. if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  12742. {
  12743. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  12744. {
  12745. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12746. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12747. res.ResData = 0;
  12748. return res;
  12749. }
  12750. else
  12751. {
  12752. res.ResData = tempcells[2].Item1;
  12753. }
  12754. }
  12755. else
  12756. {
  12757. res.ResData = tempcells[1].Item1;
  12758. }
  12759. }
  12760. else
  12761. {
  12762. if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  12763. {
  12764. res.ResData = tempcells[2].Item1;
  12765. }
  12766. else
  12767. {
  12768. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12769. res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  12770. res.ResData = 0;
  12771. return res;
  12772. }
  12773. }
  12774. }
  12775. return res;
  12776. }
  12777. public SRes PalletizingPatchWheel(PalletizingPatchWheelRequest request)
  12778. {
  12779. var res = new SRes();
  12780. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First();
  12781. if (task == null)
  12782. {
  12783. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  12784. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  12785. return res;
  12786. }
  12787. var taskold = _wcstaskoldrepository.AsQueryable().Where(p => p.WmsTask == request.TaskNum && p.Id != request.TaskNum).SplitTable(p => p.Take(2)).First();
  12788. if (taskold != null)
  12789. {
  12790. return res;
  12791. }
  12792. var pallet = _palletizrepository.GetSingle(p => p.Id == task.PalletizingId && p.PalletizState == 0);
  12793. if (pallet == null)
  12794. {
  12795. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  12796. res.ResMsg = request.TaskNum + "没有找到码垛基础信息";
  12797. return res;
  12798. }
  12799. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  12800. if (stocks == null)
  12801. {
  12802. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  12803. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  12804. return res;
  12805. }
  12806. var rulebox = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  12807. try
  12808. {
  12809. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  12810. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == stocks.Grade && p.HWTypeCode == stocks.HWTypeCode
  12811. && p.IsRework == stocks.IsRework && p.IsBlack == stocks.IsBlack && p.MatCode == task.MatCode && p.WbGroupCode == stocks.WbGroupCode && p.SolderCount == stocks.SolderCount
  12812. && p.IsControlpanel == stocks.IsControlpanel && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  12813. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  12814. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 1 && p.Id == pallet.BoxRuleId)
  12815. on stock.InDocsNo equals rule1.DocsNo
  12816. select new
  12817. {
  12818. stock.MatCode,
  12819. stock.InvBarCode,
  12820. stock.Grade,
  12821. stock.InvStateCode,
  12822. stock.ProductTime,
  12823. stock.WbGroupCode,
  12824. stock.IsTorsChk,
  12825. stock.TorsChkQty,
  12826. stock.TorsChkValue,
  12827. stock.TorsChkChord,
  12828. stock.TorsChkFlatness,
  12829. stock.HoldTime,
  12830. stock.ProductMachCode,
  12831. stock.IsControlpanel,
  12832. stock.HWTypeCode,
  12833. stock.IsBlack,
  12834. stock.IsRework,
  12835. stock.SolderCount,
  12836. stock.TorsChkChordIsGood,
  12837. stock.TorsChkFlatnessIsGood,
  12838. stock.TorsChkValueIsGood,
  12839. loc.Col,
  12840. loc.Layer,
  12841. loc.Shelf,
  12842. loc.Depth,
  12843. loc.Code,
  12844. loc.Tunnel,
  12845. loc.SCRel,
  12846. loc.Floor,
  12847. loc.WarehouseCode,
  12848. loc.ContGrpBarCode,
  12849. loc.ContGrpId,
  12850. loc.Id,
  12851. loc.StateNum,
  12852. rule1.SkuCode
  12853. };
  12854. invlist = invlist.Distinct();
  12855. if (!string.IsNullOrEmpty(rulebox.SkuCode))
  12856. {
  12857. invlist = invlist.Where(p => p.SkuCode == rulebox.SkuCode);
  12858. }
  12859. if (pallet.BoxRule == "层配")
  12860. {
  12861. //计算扭转值、弓高、平直度
  12862. invlist = invlist.Where(p => p.TorsChkValueIsGood == "OK" && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.IsTorsChk == true && p.TorsChkQty > 0 &&
  12863. 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());
  12864. }
  12865. else
  12866. {
  12867. if (stocks.IsControlpanel == true)
  12868. {
  12869. invlist = invlist.Where(p => p.IsTorsChk == true && p.IsControlpanel == true && p.TorsChkQty > 0);
  12870. }
  12871. else
  12872. {
  12873. invlist = invlist.Where(p => p.IsControlpanel == false);
  12874. }
  12875. }
  12876. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  12877. if (tunlist.Any())
  12878. {
  12879. if (tunlist.Where(p => p.Default2 == "1").Any())
  12880. {
  12881. invlist = invlist.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  12882. //invlist3 = invlist3.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  12883. }
  12884. if (tunlist.Where(p => p.Default2 == "2").Any())
  12885. {
  12886. invlist = invlist.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  12887. //invlist3 = invlist3.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  12888. }
  12889. if (tunlist.Where(p => p.Default2 == "3").Any())
  12890. {
  12891. invlist = invlist.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  12892. //invlist3 = invlist3.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  12893. }
  12894. }
  12895. if (!invlist.Any())
  12896. {
  12897. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  12898. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有待补的工字轮";
  12899. return res;
  12900. }
  12901. invlist = invlist.OrderBy(p => p.ProductTime);
  12902. foreach (var item in invlist)
  12903. {
  12904. if (item.Depth == 2)
  12905. {
  12906. var respon = MoveTask(item.Code);
  12907. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  12908. {
  12909. continue;
  12910. }
  12911. }
  12912. var wcs = new WCS_TaskInfo()
  12913. {
  12914. Status = TaskStatus.NewBuild,
  12915. Type = TaskType.OutDepot,
  12916. Priority = 0,
  12917. Device = item.SCRel,
  12918. SrmStation = item.SCRel,
  12919. AddrFrom = item.Code,
  12920. BarCode = item.ContGrpBarCode,
  12921. AddWho = "wms",
  12922. EditWho = "wms",
  12923. WarehouseCode = "sxhouse",
  12924. AddrTo = task.AddrTo,
  12925. FullQty = 1,
  12926. AgvTaskID = task.AgvTaskID, //层配层数
  12927. Tunnel = item.Tunnel.ToString(),
  12928. MaterialCode = item.MatCode,
  12929. MatCode = item.MatCode,
  12930. OutType = OutTypeEnum.自动出库任务,
  12931. BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
  12932. Floor = item.Floor,
  12933. Grade = item.Grade,
  12934. WorkBench = item.ProductMachCode,
  12935. WmsTask = request.TaskNum, //需要补轮子的任务号
  12936. PalletizingId = task.PalletizingId,
  12937. Robot = task.Robot,
  12938. ProdLine = task.ProdLine,
  12939. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2,
  12940. ManualRemarks = "排走的工字轮" + task.BarCode + "扫码设备" + request.Equip
  12941. };
  12942. _db.BeginTran();
  12943. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  12944. {
  12945. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  12946. EditTime = DateTime.Now,
  12947. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip
  12948. }, p => p.ContGrpBarCode == item.ContGrpBarCode);
  12949. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  12950. {
  12951. StateNum = LocationState.LocationState_StockOut,
  12952. EditTime = DateTime.Now
  12953. }, p => p.Code == item.Code);
  12954. var stock1 = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode);
  12955. var flow1 = _mapper.Map<BillInvflow>(stock1);
  12956. flow1.Id = GetId();
  12957. flow1.AddTime = DateTime.Now;
  12958. flow1.EditTime = DateTime.Now;
  12959. flow1.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  12960. flow1.Memo = "装箱码垛出库";
  12961. _billInvflow.Insert(flow1);
  12962. var flow = _mapper.Map<BillInvflow>(stocks);
  12963. flow.Id = GetId();
  12964. flow.AddTime = DateTime.Now;
  12965. flow.EditTime = DateTime.Now;
  12966. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  12967. flow.Memo = "异常补轮" + request.TaskNum;
  12968. _billInvnowrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  12969. _billInvflow.Insert(flow);
  12970. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  12971. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  12972. var wcsdtl = new WCS_TaskDtl()
  12973. {
  12974. ID = Guid.NewGuid(),
  12975. CurPoint = wcstask.AddrFrom,
  12976. AddTime = DateTime.Now,
  12977. AddWho = "wms",
  12978. Enabled = true,
  12979. ParentTaskCode = wcstask.ID,
  12980. Desc = wcstask.BusType
  12981. };
  12982. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  12983. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  12984. var layer = new PalletLayerMath()
  12985. {
  12986. ContGrpId = (long)stock1.ContGrpId,
  12987. ContBarCode = stock1.ContGrpBarCode,
  12988. Layer = task.AgvTaskID,
  12989. SkuCode = rulebox.SkuCode,
  12990. Finish = 0,
  12991. PboxruleId = rulebox.Id,
  12992. Istask = 1,
  12993. Palletequip = task.AddrTo,
  12994. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip,
  12995. AddWho = "WCS",
  12996. EditWho = "WCS"
  12997. };
  12998. _palletlayerMathrepository.Insert(layer);
  12999. _db.CommitTran();
  13000. return res;
  13001. }
  13002. }
  13003. catch (Exception ex)
  13004. {
  13005. _db.RollbackTran();
  13006. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13007. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13008. return res;
  13009. }
  13010. return res;
  13011. }
  13012. /// <summary>
  13013. /// 码垛强制结盘
  13014. /// </summary>
  13015. /// <param name="request"></param>
  13016. /// <returns></returns>
  13017. public SRes PalletizingForceknot(PalletizingForceknotRequest request)
  13018. {
  13019. var res = new SRes();
  13020. try
  13021. {
  13022. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  13023. if (pallet == null)
  13024. {
  13025. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13026. res.ResMsg = request.Equip + "没有当前码垛工位信息";
  13027. return res;
  13028. }
  13029. _palletizrepository.AsUpdateable().SetColumns(p => new Palletizing()
  13030. {
  13031. Finish = 1 + pallet.Finish,
  13032. Memo = "强制结盘时间:" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")
  13033. }).Where(p => p.Id == pallet.Id).ExecuteCommand();
  13034. }
  13035. catch (Exception ex)
  13036. {
  13037. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  13038. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13039. return res;
  13040. }
  13041. return res;
  13042. }
  13043. public SRes Palletizinginfobinde(PalletizinginfobindeRequest request)
  13044. {
  13045. var res = new SRes();
  13046. try
  13047. {
  13048. if (!request.TaskNum.Any())
  13049. {
  13050. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  13051. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  13052. return res;
  13053. }
  13054. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  13055. if (pallet == null)
  13056. {
  13057. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13058. res.ResMsg = request.Equip + "没有当前码垛工位的单据信息";
  13059. return res;
  13060. }
  13061. var rule = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  13062. if (rule == null)
  13063. {
  13064. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13065. res.ResMsg = request.Equip + "码垛工位没有找到对应的装箱信息";
  13066. return res;
  13067. }
  13068. DateTime date = DateTime.Now;
  13069. var taskgroup = string.Join("|", request.TaskNum.OrderBy(p => p).ToList());
  13070. foreach (var item in request.TaskNum)
  13071. {
  13072. 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();
  13073. if (task == null)
  13074. {
  13075. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  13076. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  13077. return res;
  13078. }
  13079. if (task.PalletizingId != pallet.Id)
  13080. {
  13081. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  13082. res.ResMsg = pallet.Equip + "当前工位抓取任务和码垛主表信息不匹配,不能完成抓取,请确认是否混箱";
  13083. return res;
  13084. }
  13085. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  13086. if (stock == null)
  13087. {
  13088. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  13089. res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  13090. return res;
  13091. }
  13092. var palletdetails = _palletizdetailrepository.GetSingle(p => p.TaskNum == item);
  13093. if (palletdetails != null)
  13094. {
  13095. if (palletdetails.Memo == taskgroup)
  13096. {
  13097. continue;
  13098. }
  13099. else
  13100. {
  13101. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  13102. res.ResMsg = pallet.Equip + "当前任务请确认是否重复上传,不能完成抓取";
  13103. return res;
  13104. }
  13105. }
  13106. //根据任务实际计算层
  13107. var fincount = _palletlayerMathrepository.Count(p => p.Palletequip == task.AddrTo && p.Istask == 1 && p.Finish == 1);
  13108. int layer = (fincount / 12) + 1;
  13109. //var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//近3张分表
  13110. //foreach (var tbname in tables)
  13111. //{
  13112. // //更新1点到6点时间内数据
  13113. // _wcstaskoldrepository.Context.Updateable<WCS_TaskOld>().AS(tbname.TableName)//使用分表名
  13114. // .SetColumns(it => new WCS_TaskOld()
  13115. // {
  13116. // EndTime = DateTime.Now,
  13117. // ManualRemarks = layer.ToString()
  13118. // })
  13119. // .Where(p => p.Id == item)
  13120. // .ExecuteCommand();
  13121. //}
  13122. _db.BeginTran();
  13123. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13124. {
  13125. Finish = 1
  13126. }, p => p.ContBarCode == task.BarCode && p.ContGrpId == stock.ContGrpId && p.Palletequip == task.AddrTo && p.Istask == 1);
  13127. var palletdetail = new Palletizingdetail()
  13128. {
  13129. PalletizingId = pallet.Id,
  13130. TaskNum = item,
  13131. PackRule = pallet.BoxRule.ToString(),
  13132. Sku = rule.SkuCode,
  13133. BarCode = task.BarCode,
  13134. Layer = layer,
  13135. WbGroupCode = stock.WbGroupCode,
  13136. GradeCode = stock.Grade,
  13137. AddWho = "",
  13138. EditWho = "",
  13139. MaterialCode = stock.MatCode,
  13140. MaterialDesc = stock.MatName,
  13141. InDocsNo = stock.InDocsNo,
  13142. Batch = rule.BatchNo,
  13143. IsBlack = stock.IsBlack,
  13144. IsControlpanel = pallet.IsControlpanel,
  13145. Winding = stock.Wind,
  13146. SolderCount = stock.SolderCount,
  13147. PalletizingDate = date,
  13148. OvcFlag = pallet.IsControlpanel == true ? 2 : 0,
  13149. OvcValue = string.IsNullOrEmpty(stock.TorsChkValue.ToString()) ? 0.ToString() : stock.TorsChkValue.ToString(),
  13150. EquNo = pallet.Equip,
  13151. TolWQty = stock.TolWQty,
  13152. TareWQty = stock.TareWQty,
  13153. NetWQty = stock.NetWQty,
  13154. CLBarCode = stock.CLBarCode,
  13155. BoxCode = rule.PBoxCode,
  13156. Memo = taskgroup
  13157. //Memo = layer.ToString()
  13158. };
  13159. _palletizdetailrepository.Insert(palletdetail);
  13160. //更新历史任务
  13161. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  13162. //{
  13163. // EndTime = DateTime.Now,
  13164. // ManualRemarks = layer.ToString()
  13165. //}).Where(p => p.Id == task.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  13166. _logger.LogInformation("实际层末尾");
  13167. _db.CommitTran();
  13168. }
  13169. }
  13170. catch (Exception ex)
  13171. {
  13172. _db.RollbackTran();
  13173. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  13174. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13175. return res;
  13176. }
  13177. return res;
  13178. }
  13179. public SRes GetMesErrorInfo(SxErrorinfoRequest request)
  13180. {
  13181. var res = new SRes();
  13182. var wcsCode = _errorinfowcs.AsQueryable().With(SqlWith.NoLock).Where(v => v.ContBarCode == request.Code).OrderByDescending(p => p.AddTime).ToList();
  13183. if (!wcsCode.Any())
  13184. {
  13185. res.ResMsg = request.Code + ",扫码失败";
  13186. res.Memo1 = request.Code + ",扫码失败";
  13187. return res;
  13188. }
  13189. else
  13190. {
  13191. res.Memo1 = request.Code + "," + wcsCode.First().Message;
  13192. return res;
  13193. }
  13194. return res;
  13195. }
  13196. private SRes SpcErrorTaskinfo(PalletizingPackTaskRequest request)
  13197. {
  13198. var res = new SRes();
  13199. try
  13200. {
  13201. var wcs = new WCS_TaskInfo()
  13202. {
  13203. Status = TaskStatus.NewBuild,
  13204. Type = TaskType.OutDepot,
  13205. Priority = 0,
  13206. Device = request.Srm,
  13207. SrmStation = request.Srm,
  13208. AddrFrom = request.CellCode,
  13209. BarCode = request.Code,
  13210. AddWho = "wms",
  13211. EditWho = "wms",
  13212. WarehouseCode = "sxhouse",
  13213. AddrTo = "5186",
  13214. Tunnel = request.Tunnel,
  13215. MaterialCode = request.Mater,
  13216. MatCode = request.Mater,
  13217. OutType = OutTypeEnum.自动出库任务,
  13218. BusType = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription(),
  13219. Floor = request.Floor,
  13220. Grade = request.Grade,
  13221. ManualRemarks = request.Memo
  13222. };
  13223. _db.BeginTran();
  13224. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  13225. {
  13226. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  13227. EditTime = DateTime.Now
  13228. }, p => p.ContGrpBarCode == request.Code);
  13229. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  13230. {
  13231. StateNum = LocationState.LocationState_StockOut,
  13232. EditTime = DateTime.Now
  13233. }, p => p.Code == request.CellCode);
  13234. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  13235. var flow = _mapper.Map<BillInvflow>(stock);
  13236. flow.Id = GetId();
  13237. flow.AddTime = DateTime.Now;
  13238. flow.EditTime = DateTime.Now;
  13239. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  13240. flow.Memo = "异常出库";
  13241. _billInvflow.Insert(flow);
  13242. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  13243. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  13244. var wcsdtl = new WCS_TaskDtl()
  13245. {
  13246. ID = Guid.NewGuid(),
  13247. CurPoint = request.Code,
  13248. AddTime = DateTime.Now,
  13249. AddWho = "wms",
  13250. Enabled = true,
  13251. ParentTaskCode = wcstask.ID,
  13252. Desc = wcstask.BusType
  13253. };
  13254. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  13255. _db.CommitTran();
  13256. }
  13257. catch (Exception ex)
  13258. {
  13259. _db.RollbackTran();
  13260. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13261. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  13262. return res;
  13263. }
  13264. return res;
  13265. }
  13266. /// <summary>
  13267. /// B质量码垛出库
  13268. /// </summary>
  13269. /// <param name="request"></param>
  13270. /// <returns></returns>
  13271. public SRes PalletizingPackBStockOut(PalletizingPackStockOutRequest request)
  13272. {
  13273. var res = new SRes();
  13274. var isforbid = _sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").Default1;
  13275. if (isforbid == "1")
  13276. {
  13277. res.ResMsg = "B质量码垛已禁用";
  13278. return res;
  13279. }
  13280. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "BGrade");
  13281. if (palletlist.Any())
  13282. {
  13283. foreach (var item in palletlist)
  13284. {
  13285. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  13286. if (equips == null)
  13287. {
  13288. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut2", new RedisErrorInfo() { Equip = "BGradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  13289. continue;
  13290. }
  13291. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  13292. if (!palletMach.Any())
  13293. {
  13294. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut3", new RedisErrorInfo() { Equip = "BGradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  13295. continue;
  13296. }
  13297. //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;
  13298. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13299. var curdocid = maxdocid + 1;
  13300. if (palletMach.Any())
  13301. {
  13302. var pid = palletMach.First().PalletizingId;
  13303. 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)
  13304. {
  13305. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13306. }
  13307. }
  13308. foreach (var pallets in palletMach)
  13309. {
  13310. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  13311. if (cell == null)
  13312. {
  13313. continue;
  13314. }
  13315. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13316. if (invs == null)
  13317. {
  13318. continue;
  13319. }
  13320. var root = "";
  13321. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  13322. {
  13323. root = "Robot1";
  13324. }
  13325. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  13326. {
  13327. root = "Robot2";
  13328. }
  13329. //先判断二升位是否能出库
  13330. if (cell.Depth == 2)
  13331. {
  13332. var respon = MoveTask(cell.Code);
  13333. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13334. {
  13335. continue;
  13336. }
  13337. }
  13338. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  13339. {
  13340. Code = pallets.ContBarCode,
  13341. CellCode = cell.Code,
  13342. Srm = cell.SCRel,
  13343. Tunnel = cell.Tunnel.ToString(),
  13344. Floor = cell.Floor,
  13345. Grade = invs.Grade,
  13346. Mater = invs.MatCode,
  13347. SkuCode = pallets.SkuCode,
  13348. PalletLayer = 0,
  13349. ProductMachCode = invs.ProductMachCode,
  13350. Equip = item.Equip,
  13351. PalletizingId = item.Id,
  13352. Robot = root,
  13353. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  13354. DocId = curdocid
  13355. });
  13356. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13357. {
  13358. continue;
  13359. }
  13360. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13361. {
  13362. Istask = 1,
  13363. Layer = 0
  13364. }, p => p.ContBarCode == invs.ContGrpBarCode);
  13365. }
  13366. }
  13367. }
  13368. //取视图码垛设备号
  13369. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  13370. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Memo) && p.AddWho != "禁用").Any())
  13371. {
  13372. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  13373. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13374. res.ResMsg = "没有空闲的码垛工位";
  13375. return res;
  13376. }
  13377. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  13378. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  13379. if (!devices.Where(p => p.pH_STATUS == true).Any())
  13380. {
  13381. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  13382. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13383. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  13384. return res;
  13385. }
  13386. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  13387. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent);
  13388. //
  13389. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  13390. 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
  13391. && (DateTime.Now - p.ProductTime).TotalHours <= timeOutHoldHours)
  13392. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  13393. select new StockTemp
  13394. {
  13395. MatCode = stock.MatCode,
  13396. InvBarCode = stock.InvBarCode,
  13397. Grade = stock.Grade,
  13398. InvStateCode = stock.InvStateCode,
  13399. ProductTime = stock.ProductTime,
  13400. WbGroupCode = stock.WbGroupCode,
  13401. IsTorsChk = stock.IsTorsChk,
  13402. TorsChkQty = stock.TorsChkQty,
  13403. TorsChkValue = stock.TorsChkValue,
  13404. HoldTime = stock.HoldTime,
  13405. ProductMachCode = stock.ProductMachCode,
  13406. IsControlpanel = stock.IsControlpanel,
  13407. HWTypeCode = stock.HWTypeCode,
  13408. SolderCount = stock.SolderCount,
  13409. IsRework = stock.IsRework,
  13410. IsBlack = stock.IsBlack,
  13411. Col = loc.Col,
  13412. Layer = loc.Layer,
  13413. Shelf = loc.Shelf,
  13414. Depth = loc.Depth,
  13415. Code = loc.Code,
  13416. Tunnel = loc.Tunnel,
  13417. SCRel = loc.SCRel,
  13418. Floor = loc.Floor,
  13419. WarehouseCode = loc.WarehouseCode,
  13420. ContGrpBarCode = loc.ContGrpBarCode,
  13421. ContGrpId = loc.ContGrpId,
  13422. Id = loc.Id,
  13423. StateNum = loc.StateNum,
  13424. Wind = stock.Wind,
  13425. InDocsNo = stock.InDocsNo
  13426. };
  13427. if (!invlist1.Any())
  13428. {
  13429. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  13430. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13431. res.ResMsg = "库存不足";
  13432. return res;
  13433. }
  13434. invlist1 = invlist1.Distinct();
  13435. var temps = invlist1.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  13436. var rules = new BillPboxrule();
  13437. foreach (var item in temps)
  13438. {
  13439. var invlist2 = invlist1.Where(p => p.HWTypeCode == item.Key);
  13440. if (!invlist2.Any())
  13441. {
  13442. continue;
  13443. }
  13444. var mater = invlist2.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  13445. foreach (var stockTemps in mater)
  13446. {
  13447. var invlist = invlist2.Where(p => p.MatCode == stockTemps.Key);
  13448. if (!invlist.Any())
  13449. {
  13450. continue;
  13451. }
  13452. //else if (invlist.Count() < 36)
  13453. //{
  13454. // res.ResMsg = "B质量数量不满足";
  13455. // continue;
  13456. //}
  13457. var ti = DateTime.Now;
  13458. var yaar = ti.Year.ToString().Substring(2, 2);
  13459. var month = ti.Month.ToString().PadLeft(2, '0');
  13460. var day = ti.Day.ToString().PadLeft(2, '0');
  13461. //获取当天最大箱号
  13462. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "B" && p.Year == yaar && p.Month == month && p.Day == day);
  13463. string boxserial = "HAZDB";
  13464. if (maxnumre.Any())
  13465. {
  13466. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  13467. _boxserialrepository.Insert(new BillBoxSerial()
  13468. {
  13469. Year = yaar,
  13470. Month = month,
  13471. Day = day,
  13472. Num = maxnumre.Max(q => q.Num) + 1,
  13473. BoxNum = boxserial,
  13474. Grade = "B",
  13475. AddTime = DateTime.Now,
  13476. AddWho = "wms",
  13477. EditTime = DateTime.Now,
  13478. EditWho = "wms"
  13479. });
  13480. }
  13481. else
  13482. {
  13483. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  13484. _boxserialrepository.Insert(new BillBoxSerial()
  13485. {
  13486. Year = yaar,
  13487. Month = month,
  13488. Day = day,
  13489. Num = 1,
  13490. BoxNum = boxserial,
  13491. Grade = "B",
  13492. AddTime = DateTime.Now,
  13493. AddWho = "wms",
  13494. EditTime = DateTime.Now,
  13495. EditWho = "wms"
  13496. });
  13497. }
  13498. //B质量不区分绕向
  13499. //invlist = invlist.Where(p => p.Wind == "R");
  13500. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  13501. rule.Id = GetId();
  13502. rule.PBoxCode = boxserial;
  13503. rule.Wind = "";
  13504. rule.ZXStateCode = 1;
  13505. rule.SpoolType = item.Key;
  13506. rule.PackRule = "BGrade";
  13507. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  13508. rule.SkuCode = "TestBGrade";
  13509. rule.BatchNo = "1";
  13510. rules = _boxrulerepository.InsertReturnEntity(rule);
  13511. if (item.Key == "BS60" || item.Key == "BS40")
  13512. {
  13513. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  13514. }
  13515. else
  13516. {
  13517. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  13518. }
  13519. 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();
  13520. //码垛信息校验
  13521. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  13522. {
  13523. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  13524. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  13525. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  13526. return res;
  13527. }
  13528. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  13529. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  13530. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  13531. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13532. {
  13533. res.ResCode = trayres.ResCode;
  13534. res.ResMsg = trayres.ResMsg;
  13535. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  13536. return res;
  13537. }
  13538. var root = "";
  13539. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  13540. {
  13541. root = "Robot1";
  13542. }
  13543. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  13544. {
  13545. root = "Robot2";
  13546. }
  13547. var pallet = new Palletizing()
  13548. {
  13549. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  13550. PalletizState = 0,
  13551. Equip = palletequip.Code,
  13552. Finish = 0,
  13553. AddWho = "",
  13554. EditWho = "",
  13555. BoxRule = rules.PackRule,
  13556. BoxRuleId = rules.Id,
  13557. IsControlpanel = false,
  13558. TaskNum = int.Parse(trayres.Memo1),
  13559. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  13560. Robot = root
  13561. };
  13562. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  13563. List<PalletLayerMath> math = new List<PalletLayerMath>();
  13564. foreach (var invs in invlist)
  13565. {
  13566. var palletlayer = new PalletLayerMath()
  13567. {
  13568. ContGrpId = (long)invs.ContGrpId,
  13569. ContBarCode = invs.ContGrpBarCode,
  13570. Layer = 0,
  13571. SkuCode = rules.SkuCode,
  13572. Finish = 0,
  13573. PboxruleId = rules.Id,
  13574. Istask = 0,
  13575. Palletequip = palletequip.Code,
  13576. Depth = invs.Depth,
  13577. IsBlack = invs.IsBlack,
  13578. SolderCount = invs.SolderCount,
  13579. BoxCode = rules.PBoxCode,
  13580. PalletizingId = pallects.Id
  13581. };
  13582. math.Add(palletlayer);
  13583. }
  13584. _palletlayerMathrepository.InsertRange(math);
  13585. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  13586. {
  13587. PreStock = "1"
  13588. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  13589. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  13590. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  13591. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13592. var curdocid = maxdocid + 1;
  13593. if (palletMach.Any())
  13594. {
  13595. var pid = palletMach.First().PalletizingId;
  13596. 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)
  13597. {
  13598. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13599. }
  13600. }
  13601. foreach (var code in invlist)
  13602. {
  13603. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  13604. if (cell == null)
  13605. {
  13606. continue;
  13607. }
  13608. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13609. if (invs == null)
  13610. {
  13611. continue;
  13612. }
  13613. //先判断二升位是否能出库
  13614. if (code.Depth == 2)
  13615. {
  13616. var respon = MoveTask(code.Code);
  13617. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13618. {
  13619. continue;
  13620. }
  13621. }
  13622. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  13623. {
  13624. Code = code.ContGrpBarCode,
  13625. Equip = pallects.Equip,
  13626. Mater = code.MatCode,
  13627. Srm = code.SCRel,
  13628. PalletLayer = 1,
  13629. Grade = code.Grade,
  13630. Tunnel = code.Tunnel.ToString(),
  13631. CellCode = code.Code,
  13632. SkuCode = rules.SkuCode,
  13633. ProductMachCode = code.ProductMachCode,
  13634. Floor = code.Floor,
  13635. PalletizingId = pallects.Id,
  13636. Robot = root,
  13637. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  13638. DocId = curdocid
  13639. });
  13640. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13641. {
  13642. continue;
  13643. }
  13644. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13645. {
  13646. Istask = 1,
  13647. Layer = 1
  13648. }, p => p.ContBarCode == code.ContGrpBarCode);
  13649. }
  13650. return res;
  13651. }
  13652. }
  13653. return res;
  13654. }
  13655. public CurStockListResponse GetCurStockList(CurStockListRequest request)
  13656. {
  13657. var res = new CurStockListResponse() { ResData = new List<resItmes>() };
  13658. var stock = _billInvnowrepository.Context.Queryable<BillInvnow, BaseMatinfo>((inv, mater) => new object[]
  13659. {
  13660. JoinType.Left, inv.MatCode == mater.Code
  13661. })
  13662. .Where((inv, mater) => inv.InvStateCode == InvState.InvEcecState_In.ToString())
  13663. .WhereIF(!string.IsNullOrEmpty(request.MatCode), (inv, mater) => inv.MatCode.Contains(request.MatCode))
  13664. .WhereIF(!string.IsNullOrEmpty(request.MatName), (inv, mater) => inv.MatName.Contains(request.MatName))
  13665. .Select((inv, mater) => new resItmes()
  13666. {
  13667. MatCode = mater.Code,
  13668. MatBarCode = inv.CLBarCode,
  13669. SpoolCode = inv.ContGrpBarCode,
  13670. WbCode = inv.ProductMachCode,
  13671. WorkOrder = inv.InDocsNo,
  13672. SpoolType = inv.HWTypeCode,
  13673. Length = (decimal)mater.Length,
  13674. Weight = (decimal)mater.Weight,
  13675. ProductDate = inv.ProductTime,
  13676. IsHold = mater.IsHold,
  13677. IsBlack = inv.IsBlack,
  13678. IsCore = inv.IsCore,
  13679. IsRework = inv.IsRework,
  13680. Grade = inv.Grade,
  13681. SolderCount = inv.SolderCount,
  13682. HoldDuration = mater.HoldDuration,
  13683. LocRow = inv.PutRow.ToString(),
  13684. LocCell = inv.PutCol.ToString(),
  13685. LocLayer = inv.PutLayer.ToString(),
  13686. WareCode = "sxhouse"
  13687. })
  13688. .ToList();
  13689. res.ResData = stock;
  13690. return res;
  13691. }
  13692. public SRes UpdateBoxNo(UpdateBoxNoRequest request)
  13693. {
  13694. var res = new SRes();
  13695. var list = _boxrulerepository.GetList(p => request.List.Contains(p.DocsNo)).OrderBy(p => p.Id);
  13696. var index = request.StartIndex;
  13697. foreach (var item in list)
  13698. {
  13699. _boxrulerepository.UpdateModelColumns(p => new BillPboxrule() { PBoxCode = "888888" + index.ToString(), EditTime = DateTime.Now },
  13700. p => p.Id == item.Id);
  13701. index++;
  13702. }
  13703. return res;
  13704. }
  13705. public SRes UpdateBlackCount(UpdateBlackCountReq request)
  13706. {
  13707. var res = new SRes();
  13708. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  13709. if (blackcount == null)
  13710. {
  13711. res.ResCode = 0;
  13712. res.ResMsg = "更新失败,没有配置";
  13713. return res;
  13714. }
  13715. if (request.SpoolType == "1")
  13716. {
  13717. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default1 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  13718. p => p.Id == blackcount.Id);
  13719. }
  13720. else if (request.SpoolType == "2")
  13721. {
  13722. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default2 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  13723. p => p.Id == blackcount.Id);
  13724. }
  13725. else
  13726. {
  13727. res.ResCode = 0;
  13728. res.ResMsg = "更新失败,SpoolType传值无效";
  13729. return res;
  13730. }
  13731. return res;
  13732. }
  13733. /// <summary>
  13734. /// 重绕超时码垛
  13735. /// </summary>
  13736. /// <param name="request"></param>
  13737. /// <returns></returns>
  13738. public SRes ChongraoPackStockOut(PalletizingPackStockOutRequest request)
  13739. {
  13740. var res = new SRes();
  13741. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SpecialCHA");
  13742. if (palletlist.Any())
  13743. {
  13744. foreach (var item in palletlist)
  13745. {
  13746. //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));
  13747. //if (tasklist.Any())
  13748. //{
  13749. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  13750. // continue;
  13751. //}
  13752. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  13753. if (equips == null)
  13754. {
  13755. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  13756. continue;
  13757. }
  13758. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  13759. if (!palletMach.Any())
  13760. {
  13761. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  13762. continue;
  13763. }
  13764. //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;
  13765. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  13766. var curdocid = maxdocid + 1;
  13767. if (palletMach.Any())
  13768. {
  13769. var pid = palletMach.First().PalletizingId;
  13770. 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)
  13771. {
  13772. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  13773. }
  13774. }
  13775. foreach (var pallets in palletMach)
  13776. {
  13777. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  13778. if (cell == null)
  13779. {
  13780. continue;
  13781. }
  13782. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  13783. if (invs == null)
  13784. {
  13785. continue;
  13786. }
  13787. var root = "";
  13788. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  13789. {
  13790. root = "Robot1";
  13791. }
  13792. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  13793. {
  13794. root = "Robot2";
  13795. }
  13796. //先判断二升位是否能出库
  13797. if (cell.Depth == 2)
  13798. {
  13799. var respon = MoveTask(cell.Code);
  13800. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  13801. {
  13802. continue;
  13803. }
  13804. }
  13805. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  13806. {
  13807. Code = pallets.ContBarCode,
  13808. CellCode = cell.Code,
  13809. Srm = cell.SCRel,
  13810. Tunnel = cell.Tunnel.ToString(),
  13811. Floor = cell.Floor,
  13812. Grade = invs.Grade,
  13813. Mater = invs.MatCode,
  13814. SkuCode = pallets.SkuCode,
  13815. PalletLayer = 0,
  13816. ProductMachCode = invs.ProductMachCode,
  13817. Equip = item.Equip,
  13818. PalletizingId = item.Id,
  13819. Robot = root,
  13820. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  13821. DocId = curdocid
  13822. });
  13823. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  13824. {
  13825. continue;
  13826. }
  13827. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  13828. {
  13829. Istask = 1,
  13830. Layer = 0
  13831. }, p => p.ContBarCode == invs.ContGrpBarCode);
  13832. }
  13833. }
  13834. }
  13835. //取视图码垛设备号
  13836. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  13837. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  13838. {
  13839. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  13840. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13841. res.ResMsg = "没有空闲的码垛工位";
  13842. return res;
  13843. }
  13844. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  13845. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  13846. if (!devices.Where(p => p.pH_STATUS == true).Any())
  13847. {
  13848. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  13849. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13850. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  13851. return res;
  13852. }
  13853. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  13854. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  13855. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  13856. //
  13857. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  13858. 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
  13859. && p.InDocsNo.StartsWith("CHA") && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  13860. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  13861. select new StockTemp
  13862. {
  13863. MatCode = stock.MatCode,
  13864. InvBarCode = stock.InvBarCode,
  13865. Grade = stock.Grade,
  13866. InvStateCode = stock.InvStateCode,
  13867. ProductTime = stock.ProductTime,
  13868. OneInTime = stock.OneInTime,
  13869. WbGroupCode = stock.WbGroupCode,
  13870. IsTorsChk = stock.IsTorsChk,
  13871. TorsChkQty = stock.TorsChkQty,
  13872. TorsChkValue = stock.TorsChkValue,
  13873. HoldTime = stock.HoldTime,
  13874. ProductMachCode = stock.ProductMachCode,
  13875. IsControlpanel = stock.IsControlpanel,
  13876. HWTypeCode = stock.HWTypeCode,
  13877. SolderCount = stock.SolderCount,
  13878. IsRework = stock.IsRework,
  13879. IsBlack = stock.IsBlack,
  13880. Col = loc.Col,
  13881. Layer = loc.Layer,
  13882. Shelf = loc.Shelf,
  13883. Depth = loc.Depth,
  13884. Code = loc.Code,
  13885. Tunnel = loc.Tunnel,
  13886. SCRel = loc.SCRel,
  13887. Floor = loc.Floor,
  13888. WarehouseCode = loc.WarehouseCode,
  13889. ContGrpBarCode = loc.ContGrpBarCode,
  13890. ContGrpId = loc.ContGrpId,
  13891. Id = loc.Id,
  13892. StateNum = loc.StateNum,
  13893. Wind = stock.Wind,
  13894. InDocsNo = stock.InDocsNo
  13895. };
  13896. //禁用巷道过滤
  13897. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  13898. if (tunlist.Any())
  13899. {
  13900. if (tunlist.Where(p => p.Default2 == "1").Any())
  13901. {
  13902. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13903. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13904. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  13905. }
  13906. if (tunlist.Where(p => p.Default2 == "2").Any())
  13907. {
  13908. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13909. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13910. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  13911. }
  13912. if (tunlist.Where(p => p.Default2 == "3").Any())
  13913. {
  13914. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  13915. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  13916. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  13917. }
  13918. }
  13919. if (!invlist.Any())
  13920. {
  13921. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  13922. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  13923. res.ResMsg = "库存不足";
  13924. return res;
  13925. }
  13926. invlist = invlist.Distinct();
  13927. var temps = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.HWTypeCode);
  13928. var rules = new BillPboxrule();
  13929. foreach (var item in temps)
  13930. {
  13931. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  13932. if (!invlist.Any())
  13933. {
  13934. continue;
  13935. }
  13936. var mater = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.MatCode).ToList();
  13937. foreach (var stockTemps in mater)
  13938. {
  13939. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  13940. if (!invlist.Any())
  13941. {
  13942. continue;
  13943. }
  13944. var ti = DateTime.Now;
  13945. var yaar = ti.Year.ToString().Substring(2, 2);
  13946. var month = ti.Month.ToString().PadLeft(2, '0');
  13947. var day = ti.Day.ToString().PadLeft(2, '0');
  13948. //获取当天最大箱号
  13949. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  13950. string boxserial = "HAZDA";
  13951. if (maxnumre.Any())
  13952. {
  13953. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  13954. _boxserialrepository.Insert(new BillBoxSerial()
  13955. {
  13956. Year = yaar,
  13957. Month = month,
  13958. Day = day,
  13959. Num = maxnumre.Max(q => q.Num) + 1,
  13960. BoxNum = boxserial,
  13961. Grade = "A",
  13962. AddTime = DateTime.Now,
  13963. AddWho = "wms",
  13964. EditTime = DateTime.Now,
  13965. EditWho = "wms"
  13966. });
  13967. }
  13968. else
  13969. {
  13970. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  13971. _boxserialrepository.Insert(new BillBoxSerial()
  13972. {
  13973. Year = yaar,
  13974. Month = month,
  13975. Day = day,
  13976. Num = 1,
  13977. BoxNum = boxserial,
  13978. Grade = "A",
  13979. AddTime = DateTime.Now,
  13980. AddWho = "wms",
  13981. EditTime = DateTime.Now,
  13982. EditWho = "wms"
  13983. });
  13984. }
  13985. if (invlist.Any(p => p.Wind == "L"))
  13986. {
  13987. invlist = invlist.Where(p => p.Wind == "L");
  13988. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  13989. rule.Id = GetId();
  13990. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  13991. rule.PBoxCode = boxserial;
  13992. rule.Wind = "L";
  13993. rule.ZXStateCode = 1;
  13994. rule.SpoolType = item.Key;
  13995. rule.PackRule = "SpecialCHA";
  13996. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  13997. rule.SkuCode = "Test123";
  13998. rule.BatchNo = "1";
  13999. rules = _boxrulerepository.InsertReturnEntity(rule);
  14000. }
  14001. else
  14002. {
  14003. invlist = invlist.Where(p => p.Wind == "R");
  14004. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  14005. rule.Id = GetId();
  14006. rule.PBoxCode = boxserial;
  14007. rule.Wind = "R";
  14008. rule.ZXStateCode = 1;
  14009. rule.SpoolType = item.Key;
  14010. rule.PackRule = "SpecialCHA";
  14011. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  14012. rule.SkuCode = "Test123";
  14013. rule.BatchNo = "1";
  14014. rules = _boxrulerepository.InsertReturnEntity(rule);
  14015. }
  14016. if (item.Key == "BS60" || item.Key == "BS40")
  14017. {
  14018. invlist = invlist.OrderBy(p => p.OneInTime).Take(72);
  14019. }
  14020. else
  14021. {
  14022. invlist = invlist.OrderBy(p => p.OneInTime).Take(36);
  14023. }
  14024. 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();
  14025. //码垛信息校验
  14026. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  14027. {
  14028. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  14029. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  14030. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  14031. return res;
  14032. }
  14033. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  14034. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  14035. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  14036. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  14037. {
  14038. res.ResCode = trayres.ResCode;
  14039. res.ResMsg = trayres.ResMsg;
  14040. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  14041. return res;
  14042. }
  14043. var root = "";
  14044. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  14045. {
  14046. root = "Robot1";
  14047. }
  14048. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  14049. {
  14050. root = "Robot2";
  14051. }
  14052. var pallet = new Palletizing()
  14053. {
  14054. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  14055. PalletizState = 0,
  14056. Equip = palletequip.Code,
  14057. Finish = 0,
  14058. AddWho = "",
  14059. EditWho = "",
  14060. BoxRule = rules.PackRule,
  14061. BoxRuleId = rules.Id,
  14062. IsControlpanel = false,
  14063. TaskNum = int.Parse(trayres.Memo1),
  14064. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  14065. Robot = root
  14066. };
  14067. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  14068. List<PalletLayerMath> math = new List<PalletLayerMath>();
  14069. foreach (var invs in invlist)
  14070. {
  14071. var palletlayer = new PalletLayerMath()
  14072. {
  14073. ContGrpId = (long)invs.ContGrpId,
  14074. ContBarCode = invs.ContGrpBarCode,
  14075. Layer = 0,
  14076. SkuCode = rules.SkuCode,
  14077. Finish = 0,
  14078. PboxruleId = rules.Id,
  14079. Istask = 0,
  14080. Palletequip = palletequip.Code,
  14081. Depth = invs.Depth,
  14082. IsBlack = invs.IsBlack,
  14083. SolderCount = invs.SolderCount,
  14084. BoxCode = rules.PBoxCode,
  14085. PalletizingId = pallects.Id
  14086. };
  14087. math.Add(palletlayer);
  14088. }
  14089. _palletlayerMathrepository.InsertRange(math);
  14090. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14091. {
  14092. PreStock = "1"
  14093. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  14094. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  14095. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  14096. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  14097. var curdocid = maxdocid + 1;
  14098. if (palletMach.Any())
  14099. {
  14100. var pid = palletMach.First().PalletizingId;
  14101. 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)
  14102. {
  14103. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  14104. }
  14105. }
  14106. foreach (var code in invlist)
  14107. {
  14108. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  14109. if (cell == null)
  14110. {
  14111. continue;
  14112. }
  14113. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14114. if (invs == null)
  14115. {
  14116. continue;
  14117. }
  14118. //先判断二升位是否能出库
  14119. if (code.Depth == 2)
  14120. {
  14121. var respon = MoveTask(code.Code);
  14122. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  14123. {
  14124. continue;
  14125. }
  14126. }
  14127. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  14128. {
  14129. Code = code.ContGrpBarCode,
  14130. Equip = pallects.Equip,
  14131. Mater = code.MatCode,
  14132. Srm = code.SCRel,
  14133. PalletLayer = 1,
  14134. Grade = code.Grade,
  14135. Tunnel = code.Tunnel.ToString(),
  14136. CellCode = code.Code,
  14137. SkuCode = rules.SkuCode,
  14138. ProductMachCode = code.ProductMachCode,
  14139. Floor = code.Floor,
  14140. PalletizingId = pallects.Id,
  14141. Robot = root,
  14142. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  14143. DocId = curdocid
  14144. });
  14145. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  14146. {
  14147. continue;
  14148. }
  14149. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  14150. {
  14151. Istask = 1,
  14152. Layer = 1
  14153. }, p => p.ContBarCode == code.ContGrpBarCode);
  14154. }
  14155. return res;
  14156. }
  14157. }
  14158. return res;
  14159. }
  14160. public SRes SolderErrorStockOut(PalletizingPackStockOutRequest request)
  14161. {
  14162. var res = new SRes();
  14163. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  14164. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(p.PreStock) && p.SolderCount > 0)
  14165. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  14166. select new
  14167. {
  14168. stock.MatCode,
  14169. stock.InvBarCode,
  14170. stock.Grade,
  14171. stock.InvStateCode,
  14172. stock.ProductTime,
  14173. stock.WbGroupCode,
  14174. stock.IsTorsChk,
  14175. stock.TorsChkQty,
  14176. stock.TorsChkValue,
  14177. stock.HoldTime,
  14178. stock.ProductMachCode,
  14179. stock.IsControlpanel,
  14180. stock.HWTypeCode,
  14181. stock.SolderCount,
  14182. stock.IsRework,
  14183. stock.IsBlack,
  14184. stock.InDocsNo,
  14185. loc.Col,
  14186. loc.Layer,
  14187. loc.Shelf,
  14188. loc.Depth,
  14189. loc.Code,
  14190. loc.Tunnel,
  14191. loc.SCRel,
  14192. loc.Floor,
  14193. loc.WarehouseCode,
  14194. loc.ContGrpBarCode,
  14195. loc.ContGrpId,
  14196. loc.Id,
  14197. loc.StateNum
  14198. };
  14199. if (!invlist.Any())
  14200. {
  14201. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14202. res.ResMsg = "库存不足";
  14203. return res;
  14204. }
  14205. invlist = invlist.OrderBy(p => p.ProductTime);
  14206. foreach (var item in invlist)
  14207. {
  14208. 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)
  14209. {
  14210. SpcErrorTaskinfo(new PalletizingPackTaskRequest()
  14211. {
  14212. Srm = item.SCRel,
  14213. CellCode = item.Code,
  14214. Code = item.ContGrpBarCode,
  14215. Tunnel = item.Tunnel.ToString(),
  14216. Floor = item.Floor,
  14217. Grade = item.Grade,
  14218. Mater = item.MatCode,
  14219. Memo = "焊点不符,自动排出"
  14220. });
  14221. }
  14222. }
  14223. return res;
  14224. }
  14225. public SRes ForceCancelTask(ErrorTaskRequest request)
  14226. {
  14227. var res = new SRes();
  14228. if (string.IsNullOrEmpty(request.TaskNo))
  14229. {
  14230. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14231. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14232. return res;
  14233. }
  14234. if (request.WareHouse != Const.SxWareHouse)
  14235. {
  14236. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14237. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14238. return res;
  14239. }
  14240. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  14241. if (task == null)
  14242. {
  14243. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  14244. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  14245. return res;
  14246. }
  14247. if (_taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo)))
  14248. {
  14249. _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();
  14250. //删除码垛信息
  14251. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  14252. _palletizdetailrepository.Delete(p => p.BarCode == task.BarCode);
  14253. _logger.LogInformation("强制取消任务" + request.TaskNo);
  14254. }
  14255. return res;
  14256. }
  14257. public SRes DeleteStockInfo(DetailCodeStrRequest request)
  14258. {
  14259. var res = new SRes();
  14260. if (request.WareHouse != Const.SxWareHouse)
  14261. {
  14262. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14263. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14264. return res;
  14265. }
  14266. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14267. if (stock == null)
  14268. {
  14269. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14270. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14271. return res;
  14272. }
  14273. else
  14274. {
  14275. //_billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14276. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  14277. {
  14278. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14279. res.ResMsg = $"工字轮{stock.ContGrpBarCode} | 已在库中,不允许删除";
  14280. return res;
  14281. }
  14282. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  14283. {
  14284. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14285. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14286. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  14287. flow.Id = GetId();
  14288. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  14289. flow.AddTime = DateTime.Now;
  14290. flow.EditTime = DateTime.Now;
  14291. flow.Memo = "异常处理库存";
  14292. _billInvflow.Insert(flow);
  14293. }
  14294. else if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  14295. {
  14296. if (stock.PutRow == 0 && stock.PutCol == 0 && stock.PutLayer == 0)
  14297. {
  14298. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14299. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14300. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  14301. flow.Id = GetId();
  14302. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  14303. flow.AddTime = DateTime.Now;
  14304. flow.EditTime = DateTime.Now;
  14305. flow.Memo = "异常处理库存";
  14306. _billInvflow.Insert(flow);
  14307. }
  14308. }
  14309. }
  14310. return res;
  14311. }
  14312. public SRes DeleteTorsBind(DetailCodeStrRequest request)
  14313. {
  14314. var res = new SRes();
  14315. if (request.WareHouse != Const.SxWareHouse)
  14316. {
  14317. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14318. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14319. return res;
  14320. }
  14321. var stock = _torchbandinforepository.GetSingle(p => p.ContBarCode == request.Code);
  14322. if (stock == null)
  14323. {
  14324. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14325. res.ResMsg = request.Code + "不存在扭转绑定信息";
  14326. return res;
  14327. }
  14328. else
  14329. {
  14330. _torchbandinforepository.Delete(p => p.ContBarCode == request.Code);
  14331. }
  14332. return res;
  14333. }
  14334. public SRes DeleteHwPre(DetailCodeStrRequest request)
  14335. {
  14336. var res = new SRes();
  14337. if (request.WareHouse != Const.SxWareHouse)
  14338. {
  14339. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14340. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14341. return res;
  14342. }
  14343. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14344. if (stock == null)
  14345. {
  14346. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14347. res.ResMsg = request.Code + "不存在库存信息";
  14348. return res;
  14349. }
  14350. else
  14351. {
  14352. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14353. {
  14354. PreStock = ""
  14355. }, p => p.ContGrpBarCode == request.Code);
  14356. }
  14357. return res;
  14358. }
  14359. public SRes UpdateStockState(DetailCodeStr1Requestdto request)
  14360. {
  14361. var res = new SRes();
  14362. if (request.WareHouse != Const.SxWareHouse)
  14363. {
  14364. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14365. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14366. return res;
  14367. }
  14368. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14369. if (stock == null)
  14370. {
  14371. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14372. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14373. return res;
  14374. }
  14375. var status = "";
  14376. switch (request.State)
  14377. {
  14378. case 1:
  14379. status = InvState.InvEcecState_BuildUp.ToString();
  14380. break;
  14381. case 3:
  14382. status = InvState.InvEcecState_In.ToString();
  14383. break;
  14384. case 4:
  14385. status = InvState.InvEcecState_OutGoing.ToString();
  14386. break;
  14387. case 5:
  14388. status = InvState.InvEcecState_Out.ToString();
  14389. break;
  14390. default:
  14391. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  14392. res.ResMsg = "状态" + ResponseStatusCodeEnum.ErrParam.GetDescription();
  14393. return res;
  14394. }
  14395. try
  14396. {
  14397. var p = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14398. {
  14399. InvStateCode = status,
  14400. EditTime = DateTime.Now
  14401. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  14402. if (!p)
  14403. {
  14404. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14405. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.Fail.GetDescription();
  14406. return res;
  14407. }
  14408. var flow = _mapper.Map<BillInvflow>(stock);
  14409. flow.Id = GetId();
  14410. flow.AddTime = DateTime.Now;
  14411. flow.EditTime = DateTime.Now;
  14412. flow.InvStateCode = status;
  14413. _billInvflow.Insert(flow);
  14414. }
  14415. catch (Exception ex)
  14416. {
  14417. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14418. res.ResMsg = request.Code + ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14419. return res;
  14420. }
  14421. return res;
  14422. }
  14423. public SRes UpdateCellState(DetailCodeStr1Requestdto request)
  14424. {
  14425. var res = new SRes();
  14426. if (request.WareHouse != Const.SxWareHouse)
  14427. {
  14428. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14429. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14430. return res;
  14431. }
  14432. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Code);
  14433. if (cell == null)
  14434. {
  14435. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14436. res.ResMsg = request.Code + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14437. return res;
  14438. }
  14439. var st = (LocationState)request.State;
  14440. if (request.State == 1)
  14441. {
  14442. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14443. {
  14444. StateNum = st,
  14445. ContGrpBarCode = "",
  14446. ContGrpId = 0,
  14447. EditTime = DateTime.Now
  14448. }, p => p.Code == request.Code);
  14449. }
  14450. else
  14451. {
  14452. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14453. {
  14454. StateNum = st,
  14455. EditTime = DateTime.Now
  14456. }, p => p.Code == request.Code);
  14457. }
  14458. return res;
  14459. }
  14460. public SRes DataSwapCell(DataSwapCellStrRequest request)
  14461. {
  14462. var res = new SRes();
  14463. if (request.WareHouse != Const.SxWareHouse)
  14464. {
  14465. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14466. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14467. return res;
  14468. }
  14469. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  14470. if (fromCell == null)
  14471. {
  14472. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14473. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14474. return res;
  14475. }
  14476. if (fromCell.StateNum != LocationState.LocationState_Full)
  14477. {
  14478. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14479. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许互换";
  14480. return res;
  14481. }
  14482. var fromstock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14483. if (fromstock == null)
  14484. {
  14485. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14486. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14487. return res;
  14488. }
  14489. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  14490. if (toCell == null)
  14491. {
  14492. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14493. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14494. return res;
  14495. }
  14496. if (toCell.StateNum != LocationState.LocationState_Full)
  14497. {
  14498. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14499. res.ResMsg = request.EndEquip + "货位不是有货状态,不允许互换";
  14500. return res;
  14501. }
  14502. var tostock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == toCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14503. if (tostock == null)
  14504. {
  14505. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14506. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14507. return res;
  14508. }
  14509. try
  14510. {
  14511. _db.BeginTran();
  14512. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14513. {
  14514. ContGrpBarCode = fromCell.ContGrpBarCode,
  14515. ContGrpId = fromCell.ContGrpId
  14516. }, p => p.Code == toCell.Code);
  14517. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14518. {
  14519. ContGrpBarCode = toCell.ContGrpBarCode,
  14520. ContGrpId = toCell.ContGrpId
  14521. }, p => p.Code == fromCell.Code);
  14522. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14523. {
  14524. PutRow = toCell.Row,
  14525. PutCol = toCell.Col,
  14526. PutLayer = toCell.Layer
  14527. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  14528. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  14529. {
  14530. PutRow = fromCell.Row,
  14531. PutCol = fromCell.Col,
  14532. PutLayer = fromCell.Layer
  14533. }, p => p.ContGrpBarCode == toCell.ContGrpBarCode);
  14534. _db.CommitTran();
  14535. }
  14536. catch (Exception ex)
  14537. {
  14538. _db.RollbackTran();
  14539. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14540. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14541. return res;
  14542. }
  14543. return res;
  14544. }
  14545. public SRes DataBasePatch(DataBasePatchRequest request)
  14546. {
  14547. var res = new SRes();
  14548. if (request.WareHouse != Const.SxWareHouse)
  14549. {
  14550. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14551. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14552. return res;
  14553. }
  14554. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  14555. if (stock != null)
  14556. {
  14557. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14558. res.ResMsg = request.Code + "存在组盘信息,不允许补数据";
  14559. return res;
  14560. }
  14561. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Cell);
  14562. if (cell == null)
  14563. {
  14564. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14565. res.ResMsg = request.Cell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14566. return res;
  14567. }
  14568. if (cell.StateNum != LocationState.LocationState_Empty)
  14569. {
  14570. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14571. res.ResMsg = request.Cell + "货位状态不是空货位,不允许补数据";
  14572. return res;
  14573. }
  14574. try
  14575. {
  14576. if (request.ContGrpType == 1)
  14577. {
  14578. var boxCode = _billInvnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode);
  14579. if (boxCode != null)
  14580. {
  14581. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  14582. res.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  14583. return res;
  14584. }
  14585. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.BoxBarCode == request.BoxCode && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  14586. if (flow == null)
  14587. {
  14588. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14589. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  14590. return res;
  14591. }
  14592. }
  14593. else if (request.ContGrpType == 2 || request.ContGrpType == 3)
  14594. {
  14595. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  14596. if (flow == null)
  14597. {
  14598. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14599. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  14600. return res;
  14601. }
  14602. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  14603. flow.Id = GetId();
  14604. flow.AddTime = DateTime.Now;
  14605. flow.EditTime = DateTime.Now;
  14606. flow.PutRow = cell.Row;
  14607. flow.PutCol = cell.Col;
  14608. flow.PutLayer = cell.Layer;
  14609. flow.AddWho = "wms";
  14610. flow.EditWho = "wms";
  14611. flow.Memo = "手动补数据";
  14612. _db.BeginTran();
  14613. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  14614. _billInvflow.Insert(flow);
  14615. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14616. {
  14617. ContGrpBarCode = flow.ContGrpBarCode,
  14618. ContGrpId = flow.ContGrpId,
  14619. StateNum = LocationState.LocationState_Full,
  14620. IsStop = 0,
  14621. EditTime = DateTime.Now
  14622. }, p => p.Code == cell.Code);
  14623. _db.CommitTran();
  14624. }
  14625. }
  14626. catch (Exception ex)
  14627. {
  14628. _db.RollbackTran();
  14629. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14630. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14631. return res;
  14632. }
  14633. return res;
  14634. }
  14635. public SRes DataBasePatch2(DataBasePatchRequest request)
  14636. {
  14637. var res = new SRes();
  14638. try
  14639. {
  14640. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "扭转回库").OrderByDescending(p => p.EditTime).First();
  14641. if (flow == null)
  14642. {
  14643. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14644. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  14645. return res;
  14646. }
  14647. if (flow.IsControlpanel == true && flow.IsTorsChk)
  14648. {
  14649. flow.Id = GetId();
  14650. flow.AddTime = DateTime.Now;
  14651. flow.EditTime = DateTime.Now;
  14652. flow.AddWho = "wms";
  14653. flow.EditWho = "wms";
  14654. flow.Memo = "手动补数据,更新扭转数据";
  14655. _db.BeginTran();
  14656. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14657. {
  14658. TorsChkQty = flow.TorsChkQty,
  14659. TorsChkTime = flow.TorsChkTime,
  14660. SideNum = 1,
  14661. TorsChkValue = flow.TorsChkValue,
  14662. TorsChkMachCode = flow.TorsChkMachCode,
  14663. Memo = flow.Memo,
  14664. TorsChkChord = flow.TorsChkChord,
  14665. TorsChkFlatness = flow.TorsChkFlatness,
  14666. TorsChkStation = flow.TorsChkStation,
  14667. TorsChkChordIsGood = flow.TorsChkChordIsGood,
  14668. TorsChkFlatnessIsGood = flow.TorsChkFlatnessIsGood,
  14669. TorsChkValueIsGood = flow.TorsChkValueIsGood,
  14670. //FailReason = "测试"+ flow.Memo
  14671. }, p => p.ContGrpBarCode == flow.ContGrpBarCode);
  14672. _billInvflow.Insert(flow);
  14673. _db.CommitTran();
  14674. }
  14675. }
  14676. catch (Exception ex)
  14677. {
  14678. _db.RollbackTran();
  14679. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14680. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14681. return res;
  14682. }
  14683. return res;
  14684. }
  14685. public SRes DataBasePatch3(DataBasePatchRequest request)
  14686. {
  14687. var res = new SRes();
  14688. try
  14689. {
  14690. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "装箱码垛出库").OrderByDescending(p => p.EditTime).First();
  14691. if (flow == null)
  14692. {
  14693. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14694. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  14695. return res;
  14696. }
  14697. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  14698. _billInvinitrepository.Insert(_mapper.Map<BillInvinit>(flow));
  14699. }
  14700. catch (Exception ex)
  14701. {
  14702. _db.RollbackTran();
  14703. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14704. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  14705. return res;
  14706. }
  14707. return res;
  14708. }
  14709. public SRes UpdatePurchState(UpdatePurchStateRequestdto request)
  14710. {
  14711. var res = new SRes();
  14712. if (!request.Id.Any())
  14713. {
  14714. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  14715. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14716. return res;
  14717. }
  14718. foreach (var item in request.Id)
  14719. {
  14720. var pursh = _billPushinforepository.GetSingle(p => p.Id == item);
  14721. if (pursh != null)
  14722. {
  14723. _billPushinforepository.UpdateSetColumnsTrue(p => new BillPushinfo()
  14724. {
  14725. PostQty = 5,
  14726. PostResult = 0,
  14727. Memo = "手动推送"
  14728. }, p => p.Id == pursh.Id);
  14729. }
  14730. }
  14731. return res;
  14732. }
  14733. public SRes DataMoveCell(DataSwapCellStrRequest request)
  14734. {
  14735. var res = new SRes();
  14736. if (request.WareHouse != Const.SxWareHouse)
  14737. {
  14738. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  14739. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  14740. return res;
  14741. }
  14742. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  14743. if (fromCell == null)
  14744. {
  14745. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14746. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14747. return res;
  14748. }
  14749. if (fromCell.StateNum != LocationState.LocationState_Full)
  14750. {
  14751. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14752. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许转移";
  14753. return res;
  14754. }
  14755. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  14756. if (toCell == null)
  14757. {
  14758. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  14759. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  14760. return res;
  14761. }
  14762. if (toCell.StateNum != LocationState.LocationState_Empty)
  14763. {
  14764. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14765. res.ResMsg = request.EndEquip + "货位不是无货状态,不允许转移";
  14766. return res;
  14767. }
  14768. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14769. if (stock == null)
  14770. {
  14771. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  14772. res.ResMsg = fromCell.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  14773. return res;
  14774. }
  14775. try
  14776. {
  14777. _db.BeginTran();
  14778. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14779. {
  14780. StateNum = LocationState.LocationState_Empty,
  14781. ContGrpBarCode = "",
  14782. ContGrpId = 0,
  14783. EditTime = DateTime.Now
  14784. }, p => p.Code == fromCell.Code);
  14785. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  14786. {
  14787. StateNum = LocationState.LocationState_Full,
  14788. ContGrpBarCode = fromCell.ContGrpBarCode,
  14789. ContGrpId = fromCell.ContGrpId,
  14790. EditTime = DateTime.Now
  14791. }, p => p.Code == toCell.Code);
  14792. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  14793. {
  14794. PutRow = toCell.Row,
  14795. PutCol = toCell.Col,
  14796. PutLayer = toCell.Layer
  14797. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  14798. _db.CommitTran();
  14799. }
  14800. catch (Exception ex)
  14801. {
  14802. _db.RollbackTran();
  14803. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14804. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  14805. return res;
  14806. }
  14807. return res;
  14808. }
  14809. public SRes TaskRepeatSend(TaskRepeatRequest request)
  14810. {
  14811. var res = new SRes();
  14812. if (!request.TaskNo.Any())
  14813. {
  14814. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  14815. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  14816. return res;
  14817. }
  14818. var wcsTask = _taskrepository.GetList(p => request.TaskNo.Contains(p.ID) && p.Status == TaskStatus.码垛抓取中);
  14819. if (wcsTask.Count == request.TaskNo.Count)
  14820. {
  14821. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  14822. {
  14823. Status = TaskStatus.码垛抓取扫码,
  14824. EditTime = DateTime.Now,
  14825. ManualRemarks = "机器人重复下发任务"
  14826. }, p => request.TaskNo.Contains(p.ID));
  14827. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  14828. {
  14829. Status = TaskStatus.码垛抓取扫码,
  14830. EditTime = DateTime.Now,
  14831. ManualRemarks = "机器人重复下发任务"
  14832. }).Where(p => request.TaskNo.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  14833. }
  14834. else
  14835. {
  14836. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14837. res.ResMsg = "申请的任务数不等于查询结果的任务数";
  14838. return res;
  14839. }
  14840. return res;
  14841. }
  14842. public SRes UpdateTaskState(UpdateTaskStateRequest request)
  14843. {
  14844. var res = new SRes();
  14845. var task = _taskrepository.GetSingle(p => p.ID == request.TaskNo);
  14846. if (task == null)
  14847. {
  14848. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  14849. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  14850. return res;
  14851. }
  14852. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  14853. {
  14854. Status = request.Status,
  14855. EditTime = DateTime.Now,
  14856. ManualRemarks = "手动修改任务状态"
  14857. }, p => p.ID == request.TaskNo);
  14858. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  14859. {
  14860. Status = request.Status,
  14861. EditTime = DateTime.Now,
  14862. ManualRemarks = "手动修改任务状态"
  14863. }).Where(p => p.Id == request.TaskNo).SplitTable(p => p.Take(2)).ExecuteCommand();
  14864. return res;
  14865. }
  14866. public SRes SpecialStockOut(PalletizingPackStockOutRequest request)
  14867. {
  14868. var res = new SRes();
  14869. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "Special");
  14870. if (palletlist.Any())
  14871. {
  14872. foreach (var item in palletlist)
  14873. {
  14874. //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));
  14875. //if (tasklist.Any())
  14876. //{
  14877. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  14878. // continue;
  14879. //}
  14880. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  14881. if (equips == null)
  14882. {
  14883. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  14884. continue;
  14885. }
  14886. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  14887. if (!palletMach.Any())
  14888. {
  14889. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  14890. continue;
  14891. }
  14892. //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;
  14893. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  14894. var curdocid = maxdocid + 1;
  14895. if (palletMach.Any())
  14896. {
  14897. var pid = palletMach.First().PalletizingId;
  14898. 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)
  14899. {
  14900. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  14901. }
  14902. }
  14903. foreach (var pallets in palletMach)
  14904. {
  14905. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  14906. if (cell == null)
  14907. {
  14908. continue;
  14909. }
  14910. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  14911. if (invs == null)
  14912. {
  14913. continue;
  14914. }
  14915. var root = "";
  14916. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  14917. {
  14918. root = "Robot1";
  14919. }
  14920. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  14921. {
  14922. root = "Robot2";
  14923. }
  14924. //先判断二升位是否能出库
  14925. if (cell.Depth == 2)
  14926. {
  14927. var respon = MoveTask(cell.Code);
  14928. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  14929. {
  14930. continue;
  14931. }
  14932. }
  14933. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  14934. {
  14935. Code = pallets.ContBarCode,
  14936. CellCode = cell.Code,
  14937. Srm = cell.SCRel,
  14938. Tunnel = cell.Tunnel.ToString(),
  14939. Floor = cell.Floor,
  14940. Grade = invs.Grade,
  14941. Mater = invs.MatCode,
  14942. SkuCode = pallets.SkuCode,
  14943. PalletLayer = 0,
  14944. ProductMachCode = invs.ProductMachCode,
  14945. Equip = item.Equip,
  14946. PalletizingId = item.Id,
  14947. Robot = root,
  14948. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  14949. DocId = curdocid
  14950. });
  14951. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  14952. {
  14953. continue;
  14954. }
  14955. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  14956. {
  14957. Istask = 1,
  14958. Layer = 0
  14959. }, p => p.ContBarCode == invs.ContGrpBarCode);
  14960. }
  14961. }
  14962. }
  14963. //取视图码垛设备号
  14964. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  14965. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo) ).Any())
  14966. {
  14967. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  14968. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14969. res.ResMsg = "没有空闲的码垛工位";
  14970. return res;
  14971. }
  14972. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  14973. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  14974. if (!devices.Where(p => p.pH_STATUS == true).Any())
  14975. {
  14976. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  14977. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  14978. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  14979. return res;
  14980. }
  14981. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  14982. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  14983. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  14984. //
  14985. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  14986. 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
  14987. && !p.InDocsNo.StartsWith("CHA") && p.IsMulti == false && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  14988. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  14989. select new StockTemp
  14990. {
  14991. MatCode = stock.MatCode,
  14992. InvBarCode = stock.InvBarCode,
  14993. Grade = stock.Grade,
  14994. InvStateCode = stock.InvStateCode,
  14995. ProductTime = stock.ProductTime,
  14996. WbGroupCode = stock.WbGroupCode,
  14997. IsTorsChk = stock.IsTorsChk,
  14998. TorsChkQty = stock.TorsChkQty,
  14999. TorsChkValue = stock.TorsChkValue,
  15000. HoldTime = stock.HoldTime,
  15001. ProductMachCode = stock.ProductMachCode,
  15002. IsControlpanel = stock.IsControlpanel,
  15003. HWTypeCode = stock.HWTypeCode,
  15004. SolderCount = stock.SolderCount,
  15005. IsRework = stock.IsRework,
  15006. IsBlack = stock.IsBlack,
  15007. Col = loc.Col,
  15008. Layer = loc.Layer,
  15009. Shelf = loc.Shelf,
  15010. Depth = loc.Depth,
  15011. Code = loc.Code,
  15012. Tunnel = loc.Tunnel,
  15013. SCRel = loc.SCRel,
  15014. Floor = loc.Floor,
  15015. WarehouseCode = loc.WarehouseCode,
  15016. ContGrpBarCode = loc.ContGrpBarCode,
  15017. ContGrpId = loc.ContGrpId,
  15018. Id = loc.Id,
  15019. StateNum = loc.StateNum,
  15020. Wind = stock.Wind,
  15021. InDocsNo = stock.InDocsNo
  15022. };
  15023. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15024. 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
  15025. && !p.InDocsNo.StartsWith("CHA") && p.IsMulti == false && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  15026. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15027. select new StockTemp
  15028. {
  15029. MatCode = stock.MatCode,
  15030. InvBarCode = stock.InvBarCode,
  15031. Grade = stock.Grade,
  15032. InvStateCode = stock.InvStateCode,
  15033. ProductTime = stock.ProductTime,
  15034. WbGroupCode = stock.WbGroupCode,
  15035. IsTorsChk = stock.IsTorsChk,
  15036. TorsChkQty = stock.TorsChkQty,
  15037. TorsChkValue = stock.TorsChkValue,
  15038. HoldTime = stock.HoldTime,
  15039. ProductMachCode = stock.ProductMachCode,
  15040. IsControlpanel = stock.IsControlpanel,
  15041. HWTypeCode = stock.HWTypeCode,
  15042. SolderCount = stock.SolderCount,
  15043. IsRework = stock.IsRework,
  15044. IsBlack = stock.IsBlack,
  15045. Col = loc.Col,
  15046. Layer = loc.Layer,
  15047. Shelf = loc.Shelf,
  15048. Depth = loc.Depth,
  15049. Code = loc.Code,
  15050. Tunnel = loc.Tunnel,
  15051. SCRel = loc.SCRel,
  15052. Floor = loc.Floor,
  15053. WarehouseCode = loc.WarehouseCode,
  15054. ContGrpBarCode = loc.ContGrpBarCode,
  15055. ContGrpId = loc.ContGrpId,
  15056. Id = loc.Id,
  15057. StateNum = loc.StateNum,
  15058. Wind = stock.Wind,
  15059. InDocsNo = stock.InDocsNo
  15060. };
  15061. invlist = invlist.Union(invlist1);
  15062. //禁用巷道过滤
  15063. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  15064. if (tunlist.Any())
  15065. {
  15066. if (tunlist.Where(p => p.Default2 == "1").Any())
  15067. {
  15068. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15069. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15070. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  15071. }
  15072. if (tunlist.Where(p => p.Default2 == "2").Any())
  15073. {
  15074. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15075. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15076. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  15077. }
  15078. if (tunlist.Where(p => p.Default2 == "3").Any())
  15079. {
  15080. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15081. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15082. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  15083. }
  15084. }
  15085. if (!invlist.Any())
  15086. {
  15087. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  15088. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15089. res.ResMsg = "库存不足";
  15090. return res;
  15091. }
  15092. invlist = invlist.Distinct();
  15093. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  15094. var rules = new BillPboxrule();
  15095. foreach (var item in temps)
  15096. {
  15097. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  15098. if (!invlist.Any())
  15099. {
  15100. continue;
  15101. }
  15102. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  15103. foreach (var stockTemps in mater)
  15104. {
  15105. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  15106. if (!invlist.Any())
  15107. {
  15108. continue;
  15109. }
  15110. var ti = DateTime.Now;
  15111. var yaar = ti.Year.ToString().Substring(2, 2);
  15112. var month = ti.Month.ToString().PadLeft(2, '0');
  15113. var day = ti.Day.ToString().PadLeft(2, '0');
  15114. //获取当天最大箱号
  15115. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  15116. string boxserial = "HAZDA";
  15117. if (maxnumre.Any())
  15118. {
  15119. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  15120. _boxserialrepository.Insert(new BillBoxSerial()
  15121. {
  15122. Year = yaar,
  15123. Month = month,
  15124. Day = day,
  15125. Num = maxnumre.Max(q => q.Num) + 1,
  15126. BoxNum = boxserial,
  15127. Grade = "A",
  15128. AddTime = DateTime.Now,
  15129. AddWho = "wms",
  15130. EditTime = DateTime.Now,
  15131. EditWho = "wms"
  15132. });
  15133. }
  15134. else
  15135. {
  15136. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  15137. _boxserialrepository.Insert(new BillBoxSerial()
  15138. {
  15139. Year = yaar,
  15140. Month = month,
  15141. Day = day,
  15142. Num = 1,
  15143. BoxNum = boxserial,
  15144. Grade = "A",
  15145. AddTime = DateTime.Now,
  15146. AddWho = "wms",
  15147. EditTime = DateTime.Now,
  15148. EditWho = "wms"
  15149. });
  15150. }
  15151. if (invlist.Any(p => p.Wind == "L"))
  15152. {
  15153. invlist = invlist.Where(p => p.Wind == "L");
  15154. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15155. rule.Id = GetId();
  15156. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15157. rule.PBoxCode = boxserial;
  15158. rule.Wind = "L";
  15159. rule.ZXStateCode = 1;
  15160. rule.SpoolType = item.Key;
  15161. rule.PackRule = "Special";
  15162. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15163. rule.SkuCode = "Test123";
  15164. rule.BatchNo = "1";
  15165. rules = _boxrulerepository.InsertReturnEntity(rule);
  15166. }
  15167. else
  15168. {
  15169. invlist = invlist.Where(p => p.Wind == "R");
  15170. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15171. rule.Id = GetId();
  15172. rule.PBoxCode = boxserial;
  15173. rule.Wind = "R";
  15174. rule.ZXStateCode = 1;
  15175. rule.SpoolType = item.Key;
  15176. rule.PackRule = "Special";
  15177. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15178. rule.SkuCode = "Test123";
  15179. rule.BatchNo = "1";
  15180. rules = _boxrulerepository.InsertReturnEntity(rule);
  15181. }
  15182. if (item.Key == "BS60" || item.Key == "BS40")
  15183. {
  15184. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  15185. }
  15186. else
  15187. {
  15188. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  15189. }
  15190. 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();
  15191. //码垛信息校验
  15192. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  15193. {
  15194. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  15195. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  15196. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  15197. return res;
  15198. }
  15199. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode,ActType = 1 };
  15200. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  15201. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  15202. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15203. {
  15204. res.ResCode = trayres.ResCode;
  15205. res.ResMsg = trayres.ResMsg;
  15206. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  15207. return res;
  15208. }
  15209. var root = "";
  15210. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  15211. {
  15212. root = "Robot1";
  15213. }
  15214. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  15215. {
  15216. root = "Robot2";
  15217. }
  15218. var pallet = new Palletizing()
  15219. {
  15220. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  15221. PalletizState = 0,
  15222. Equip = palletequip.Code,
  15223. Finish = 0,
  15224. AddWho = "",
  15225. EditWho = "",
  15226. BoxRule = rules.PackRule,
  15227. BoxRuleId = rules.Id,
  15228. IsControlpanel = false,
  15229. TaskNum = int.Parse(trayres.Memo1),
  15230. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  15231. Robot = root
  15232. };
  15233. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  15234. List<PalletLayerMath> math = new List<PalletLayerMath>();
  15235. foreach (var invs in invlist)
  15236. {
  15237. var palletlayer = new PalletLayerMath()
  15238. {
  15239. ContGrpId = (long)invs.ContGrpId,
  15240. ContBarCode = invs.ContGrpBarCode,
  15241. Layer = 0,
  15242. SkuCode = rules.SkuCode,
  15243. Finish = 0,
  15244. PboxruleId = rules.Id,
  15245. Istask = 0,
  15246. Palletequip = palletequip.Code,
  15247. Depth = invs.Depth,
  15248. IsBlack = invs.IsBlack,
  15249. SolderCount = invs.SolderCount,
  15250. BoxCode = rules.PBoxCode,
  15251. PalletizingId = pallects.Id
  15252. };
  15253. math.Add(palletlayer);
  15254. }
  15255. _palletlayerMathrepository.InsertRange(math);
  15256. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  15257. {
  15258. PreStock = "1"
  15259. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  15260. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  15261. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  15262. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15263. var curdocid = maxdocid + 1;
  15264. if (palletMach.Any())
  15265. {
  15266. var pid = palletMach.First().PalletizingId;
  15267. 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)
  15268. {
  15269. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15270. }
  15271. }
  15272. foreach (var code in invlist)
  15273. {
  15274. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  15275. if (cell == null)
  15276. {
  15277. continue;
  15278. }
  15279. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15280. if (invs == null)
  15281. {
  15282. continue;
  15283. }
  15284. //先判断二升位是否能出库
  15285. if (code.Depth == 2)
  15286. {
  15287. var respon = MoveTask(code.Code);
  15288. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15289. {
  15290. continue;
  15291. }
  15292. }
  15293. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  15294. {
  15295. Code = code.ContGrpBarCode,
  15296. Equip = pallects.Equip,
  15297. Mater = code.MatCode,
  15298. Srm = code.SCRel,
  15299. PalletLayer = 1,
  15300. Grade = code.Grade,
  15301. Tunnel = code.Tunnel.ToString(),
  15302. CellCode = code.Code,
  15303. SkuCode = rules.SkuCode,
  15304. ProductMachCode = code.ProductMachCode,
  15305. Floor = code.Floor,
  15306. PalletizingId = pallects.Id,
  15307. Robot = root,
  15308. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  15309. DocId = curdocid
  15310. });
  15311. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15312. {
  15313. continue;
  15314. }
  15315. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15316. {
  15317. Istask = 1,
  15318. Layer = 1
  15319. }, p => p.ContBarCode == code.ContGrpBarCode);
  15320. }
  15321. return res;
  15322. }
  15323. }
  15324. return res;
  15325. }
  15326. /// <summary>
  15327. /// 手动筛选码垛出库
  15328. /// </summary>
  15329. /// <param name="request"></param>
  15330. /// <returns></returns>
  15331. public SRes ManualPalletizingStockOut(ManualPalletizingStockOutRequest request)
  15332. {
  15333. var res = new SRes();
  15334. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "ManualSpecial");
  15335. if (palletlist.Any())
  15336. {
  15337. foreach (var item in palletlist)
  15338. {
  15339. //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));
  15340. //if (tasklist.Any())
  15341. //{
  15342. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  15343. // continue;
  15344. //}
  15345. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  15346. if (equips == null)
  15347. {
  15348. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  15349. continue;
  15350. }
  15351. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  15352. if (!palletMach.Any())
  15353. {
  15354. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  15355. continue;
  15356. }
  15357. //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;
  15358. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15359. var curdocid = maxdocid + 1;
  15360. if (palletMach.Any())
  15361. {
  15362. var pid = palletMach.First().PalletizingId;
  15363. 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)
  15364. {
  15365. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15366. }
  15367. }
  15368. foreach (var pallets in palletMach)
  15369. {
  15370. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15371. if (cell == null)
  15372. {
  15373. continue;
  15374. }
  15375. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15376. if (invs == null)
  15377. {
  15378. continue;
  15379. }
  15380. var root = "";
  15381. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  15382. {
  15383. root = "Robot1";
  15384. }
  15385. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  15386. {
  15387. root = "Robot2";
  15388. }
  15389. //先判断二升位是否能出库
  15390. if (cell.Depth == 2)
  15391. {
  15392. var respon = MoveTask(cell.Code);
  15393. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15394. {
  15395. continue;
  15396. }
  15397. }
  15398. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15399. {
  15400. Code = pallets.ContBarCode,
  15401. CellCode = cell.Code,
  15402. Srm = cell.SCRel,
  15403. Tunnel = cell.Tunnel.ToString(),
  15404. Floor = cell.Floor,
  15405. Grade = invs.Grade,
  15406. Mater = invs.MatCode,
  15407. SkuCode = pallets.SkuCode,
  15408. PalletLayer = 0,
  15409. ProductMachCode = invs.ProductMachCode,
  15410. Equip = item.Equip,
  15411. PalletizingId = item.Id,
  15412. Robot = root,
  15413. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  15414. DocId = curdocid
  15415. });
  15416. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15417. {
  15418. continue;
  15419. }
  15420. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15421. {
  15422. Istask = 1,
  15423. Layer = 0
  15424. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15425. }
  15426. }
  15427. }
  15428. //取视图码垛设备号
  15429. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  15430. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  15431. {
  15432. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  15433. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15434. res.ResMsg = "没有空闲的码垛工位";
  15435. return res;
  15436. }
  15437. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  15438. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  15439. if (!devices.Where(p => p.pH_STATUS == true).Any())
  15440. {
  15441. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  15442. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15443. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  15444. return res;
  15445. }
  15446. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  15447. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  15448. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  15449. //
  15450. //获取库存列表
  15451. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15452. 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")
  15453. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  15454. )
  15455. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15456. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  15457. on stock.InDocsNo equals rule1.DocsNo
  15458. select new StockTemp
  15459. {
  15460. MatCode = stock.MatCode,
  15461. InvBarCode = stock.InvBarCode,
  15462. Grade = stock.Grade,
  15463. InvStateCode = stock.InvStateCode,
  15464. ProductTime = stock.ProductTime,
  15465. OneInTime = stock.OneInTime,
  15466. WbGroupCode = stock.WbGroupCode,
  15467. IsTorsChk = stock.IsTorsChk,
  15468. TorsChkQty = stock.TorsChkQty,
  15469. TorsChkValue = stock.TorsChkValue,
  15470. HoldTime = stock.HoldTime,
  15471. ProductMachCode = stock.ProductMachCode,
  15472. IsControlpanel = stock.IsControlpanel,
  15473. HWTypeCode = stock.HWTypeCode,
  15474. SolderCount = stock.SolderCount,
  15475. IsRework = stock.IsRework,
  15476. IsBlack = stock.IsBlack,
  15477. Col = loc.Col,
  15478. Layer = loc.Layer,
  15479. Shelf = loc.Shelf,
  15480. Depth = loc.Depth,
  15481. Code = loc.Code,
  15482. Tunnel = loc.Tunnel,
  15483. SCRel = loc.SCRel,
  15484. Floor = loc.Floor,
  15485. WarehouseCode = loc.WarehouseCode,
  15486. ContGrpBarCode = loc.ContGrpBarCode,
  15487. ContGrpId = loc.ContGrpId,
  15488. Id = loc.Id,
  15489. StateNum = loc.StateNum,
  15490. SkuCode = rule1.SkuCode,
  15491. Wind = stock.Wind,
  15492. InDocsNo = stock.InDocsNo,
  15493. BatchNo = stock.BatchNo
  15494. };
  15495. //查找满足时效但是没有全部检测完成的盘所在的机器组
  15496. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  15497. 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")
  15498. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  15499. )
  15500. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  15501. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  15502. on stock.InDocsNo equals rule1.DocsNo
  15503. select new StockTemp
  15504. {
  15505. MatCode = stock.MatCode,
  15506. InvBarCode = stock.InvBarCode,
  15507. Grade = stock.Grade,
  15508. InvStateCode = stock.InvStateCode,
  15509. ProductTime = stock.ProductTime,
  15510. OneInTime = stock.OneInTime,
  15511. WbGroupCode = stock.WbGroupCode,
  15512. IsTorsChk = stock.IsTorsChk,
  15513. TorsChkQty = stock.TorsChkQty,
  15514. TorsChkValue = stock.TorsChkValue,
  15515. HoldTime = stock.HoldTime,
  15516. ProductMachCode = stock.ProductMachCode,
  15517. IsControlpanel = stock.IsControlpanel,
  15518. HWTypeCode = stock.HWTypeCode,
  15519. SolderCount = stock.SolderCount,
  15520. IsRework = stock.IsRework,
  15521. IsBlack = stock.IsBlack,
  15522. Col = loc.Col,
  15523. Layer = loc.Layer,
  15524. Shelf = loc.Shelf,
  15525. Depth = loc.Depth,
  15526. Code = loc.Code,
  15527. Tunnel = loc.Tunnel,
  15528. SCRel = loc.SCRel,
  15529. Floor = loc.Floor,
  15530. WarehouseCode = loc.WarehouseCode,
  15531. ContGrpBarCode = loc.ContGrpBarCode,
  15532. ContGrpId = loc.ContGrpId,
  15533. Id = loc.Id,
  15534. StateNum = loc.StateNum,
  15535. SkuCode = rule1.SkuCode,
  15536. Wind = stock.Wind,
  15537. InDocsNo = stock.InDocsNo,
  15538. BatchNo = stock.BatchNo
  15539. };
  15540. invlist = invlist.Union(invlistTors);
  15541. if (!invlist.Any())
  15542. {
  15543. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  15544. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15545. res.ResMsg = "库存不足";
  15546. return res;
  15547. }
  15548. if (!string.IsNullOrEmpty(request.Sku))
  15549. {
  15550. invlist = invlist.Where(p => p.SkuCode == request.Sku);
  15551. }
  15552. if (!string.IsNullOrEmpty(request.Wind))
  15553. {
  15554. invlist = invlist.Where(p => p.Wind == request.Wind);
  15555. }
  15556. if (!string.IsNullOrEmpty(request.WbGroupCode))
  15557. {
  15558. invlist = invlist.Where(p => p.WbGroupCode == request.WbGroupCode);
  15559. }
  15560. if (!string.IsNullOrEmpty(request.HwType))
  15561. {
  15562. invlist = invlist.Where(p => p.HWTypeCode.Contains(request.HwType));
  15563. }
  15564. if (!string.IsNullOrEmpty(request.IsTimeOut))
  15565. {
  15566. if (request.IsTimeOut == "0")
  15567. {
  15568. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours));
  15569. }
  15570. else if (request.IsTimeOut == "1")
  15571. {
  15572. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours >= timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours >= timeOutHoldHours));
  15573. }
  15574. }
  15575. //禁用巷道过滤
  15576. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  15577. if (tunlist.Any())
  15578. {
  15579. if (tunlist.Where(p => p.Default2 == "1").Any())
  15580. {
  15581. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15582. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15583. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  15584. }
  15585. if (tunlist.Where(p => p.Default2 == "2").Any())
  15586. {
  15587. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15588. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15589. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  15590. }
  15591. if (tunlist.Where(p => p.Default2 == "3").Any())
  15592. {
  15593. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  15594. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  15595. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  15596. }
  15597. }
  15598. if (!invlist.Any())
  15599. {
  15600. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  15601. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15602. res.ResMsg = "库存不足";
  15603. return res;
  15604. }
  15605. invlist = invlist.Distinct();
  15606. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  15607. var rules = new BillPboxrule();
  15608. foreach (var item in temps)
  15609. {
  15610. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  15611. if (!invlist.Any())
  15612. {
  15613. continue;
  15614. }
  15615. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => new { p.SkuCode,p.Wind,p.WbGroupCode }).ToList();
  15616. foreach (var stockTemps in mater)
  15617. {
  15618. invlist = invlist.Where(p => p.SkuCode == stockTemps.Key.SkuCode && p.Wind == stockTemps.Key.Wind && p.WbGroupCode == stockTemps.Key.WbGroupCode);
  15619. if (!invlist.Any())
  15620. {
  15621. continue;
  15622. }
  15623. var ti = DateTime.Now;
  15624. var yaar = ti.Year.ToString().Substring(2, 2);
  15625. var month = ti.Month.ToString().PadLeft(2, '0');
  15626. var day = ti.Day.ToString().PadLeft(2, '0');
  15627. //获取当天最大箱号
  15628. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  15629. string boxserial = "HAZDA";
  15630. if (maxnumre.Any())
  15631. {
  15632. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  15633. _boxserialrepository.Insert(new BillBoxSerial()
  15634. {
  15635. Year = yaar,
  15636. Month = month,
  15637. Day = day,
  15638. Num = maxnumre.Max(q => q.Num) + 1,
  15639. BoxNum = boxserial,
  15640. Grade = "A",
  15641. AddTime = DateTime.Now,
  15642. AddWho = "wms",
  15643. EditTime = DateTime.Now,
  15644. EditWho = "wms"
  15645. });
  15646. }
  15647. else
  15648. {
  15649. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  15650. _boxserialrepository.Insert(new BillBoxSerial()
  15651. {
  15652. Year = yaar,
  15653. Month = month,
  15654. Day = day,
  15655. Num = 1,
  15656. BoxNum = boxserial,
  15657. Grade = "A",
  15658. AddTime = DateTime.Now,
  15659. AddWho = "wms",
  15660. EditTime = DateTime.Now,
  15661. EditWho = "wms"
  15662. });
  15663. }
  15664. if (invlist.Any(p => p.Wind == "L"))
  15665. {
  15666. invlist = invlist.Where(p => p.Wind == "L");
  15667. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15668. rule.Id = GetId();
  15669. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  15670. rule.PBoxCode = boxserial;
  15671. rule.Wind = "L";
  15672. rule.ZXStateCode = 1;
  15673. rule.SpoolType = item.Key;
  15674. rule.PackRule = "ManualSpecial";
  15675. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15676. rule.SkuCode = "Test123";
  15677. rule.BatchNo = "1";
  15678. rules = _boxrulerepository.InsertReturnEntity(rule);
  15679. }
  15680. else
  15681. {
  15682. invlist = invlist.Where(p => p.Wind == "R");
  15683. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  15684. rule.Id = GetId();
  15685. rule.PBoxCode = boxserial;
  15686. rule.Wind = "R";
  15687. rule.ZXStateCode = 1;
  15688. rule.SpoolType = item.Key;
  15689. rule.PackRule = "ManualSpecial";
  15690. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  15691. rule.SkuCode = "Test123";
  15692. rule.BatchNo = "1";
  15693. rules = _boxrulerepository.InsertReturnEntity(rule);
  15694. }
  15695. if (item.Key == "BS60" || item.Key == "BS40")
  15696. {
  15697. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  15698. }
  15699. else
  15700. {
  15701. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  15702. }
  15703. 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();
  15704. //码垛信息校验
  15705. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  15706. {
  15707. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  15708. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  15709. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  15710. return res;
  15711. }
  15712. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  15713. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  15714. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  15715. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15716. {
  15717. res.ResCode = trayres.ResCode;
  15718. res.ResMsg = trayres.ResMsg;
  15719. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  15720. return res;
  15721. }
  15722. var root = "";
  15723. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  15724. {
  15725. root = "Robot1";
  15726. }
  15727. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  15728. {
  15729. root = "Robot2";
  15730. }
  15731. var pallet = new Palletizing()
  15732. {
  15733. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  15734. PalletizState = 0,
  15735. Equip = palletequip.Code,
  15736. Finish = 0,
  15737. AddWho = "",
  15738. EditWho = "",
  15739. BoxRule = rules.PackRule,
  15740. BoxRuleId = rules.Id,
  15741. IsControlpanel = false,
  15742. TaskNum = int.Parse(trayres.Memo1),
  15743. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  15744. Robot = root
  15745. };
  15746. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  15747. List<PalletLayerMath> math = new List<PalletLayerMath>();
  15748. foreach (var invs in invlist)
  15749. {
  15750. var palletlayer = new PalletLayerMath()
  15751. {
  15752. ContGrpId = (long)invs.ContGrpId,
  15753. ContBarCode = invs.ContGrpBarCode,
  15754. Layer = 0,
  15755. SkuCode = rules.SkuCode,
  15756. Finish = 0,
  15757. PboxruleId = rules.Id,
  15758. Istask = 0,
  15759. Palletequip = palletequip.Code,
  15760. Depth = invs.Depth,
  15761. IsBlack = invs.IsBlack,
  15762. SolderCount = invs.SolderCount,
  15763. BoxCode = rules.PBoxCode,
  15764. PalletizingId = pallects.Id
  15765. };
  15766. math.Add(palletlayer);
  15767. }
  15768. _palletlayerMathrepository.InsertRange(math);
  15769. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  15770. {
  15771. PreStock = "1"
  15772. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  15773. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  15774. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  15775. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  15776. var curdocid = maxdocid + 1;
  15777. if (palletMach.Any())
  15778. {
  15779. var pid = palletMach.First().PalletizingId;
  15780. 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)
  15781. {
  15782. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  15783. }
  15784. }
  15785. foreach (var code in invlist)
  15786. {
  15787. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  15788. if (cell == null)
  15789. {
  15790. continue;
  15791. }
  15792. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15793. if (invs == null)
  15794. {
  15795. continue;
  15796. }
  15797. //先判断二升位是否能出库
  15798. if (code.Depth == 2)
  15799. {
  15800. var respon = MoveTask(code.Code);
  15801. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15802. {
  15803. continue;
  15804. }
  15805. }
  15806. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  15807. {
  15808. Code = code.ContGrpBarCode,
  15809. Equip = pallects.Equip,
  15810. Mater = code.MatCode,
  15811. Srm = code.SCRel,
  15812. PalletLayer = 1,
  15813. Grade = code.Grade,
  15814. Tunnel = code.Tunnel.ToString(),
  15815. CellCode = code.Code,
  15816. SkuCode = rules.SkuCode,
  15817. ProductMachCode = code.ProductMachCode,
  15818. Floor = code.Floor,
  15819. PalletizingId = pallects.Id,
  15820. Robot = root,
  15821. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  15822. DocId = curdocid
  15823. });
  15824. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15825. {
  15826. continue;
  15827. }
  15828. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15829. {
  15830. Istask = 1,
  15831. Layer = 1
  15832. }, p => p.ContBarCode == code.ContGrpBarCode);
  15833. }
  15834. return res;
  15835. }
  15836. }
  15837. return res;
  15838. }
  15839. public SRes CGrageStockOut(PalletizingPackStockOutRequest request)
  15840. {
  15841. var res = new SRes();
  15842. return res;//改造后方法没有修改,暂时注释
  15843. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "CGreade");
  15844. if (palletlist.Any())
  15845. {
  15846. foreach (var item in palletlist)
  15847. {
  15848. //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));
  15849. //if (tasklist.Any())
  15850. //{
  15851. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  15852. // continue;
  15853. //}
  15854. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  15855. if (equips == null)
  15856. {
  15857. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut2", new RedisErrorInfo() { Equip = "CgradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  15858. continue;
  15859. }
  15860. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  15861. if (!palletMach.Any())
  15862. {
  15863. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut3", new RedisErrorInfo() { Equip = "CgradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  15864. continue;
  15865. }
  15866. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  15867. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  15868. if (tasklayer != 12 && tasklayer < 12)
  15869. {
  15870. palletMach = palletMach.Take(12 - tasklayer);
  15871. foreach (var pallets in palletMach)
  15872. {
  15873. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15874. if (cell == null)
  15875. {
  15876. continue;
  15877. }
  15878. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15879. if (invs == null)
  15880. {
  15881. continue;
  15882. }
  15883. var root = "";
  15884. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  15885. {
  15886. root = "Robot1";
  15887. }
  15888. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  15889. {
  15890. root = "Robot2";
  15891. }
  15892. //先判断二升位是否能出库
  15893. if (cell.Depth == 2)
  15894. {
  15895. var respon = MoveTask(cell.Code);
  15896. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15897. {
  15898. continue;
  15899. }
  15900. }
  15901. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15902. {
  15903. Code = pallets.ContBarCode,
  15904. CellCode = cell.Code,
  15905. Srm = cell.SCRel,
  15906. Tunnel = cell.Tunnel.ToString(),
  15907. Floor = cell.Floor,
  15908. Grade = invs.Grade,
  15909. Mater = invs.MatCode,
  15910. SkuCode = pallets.SkuCode,
  15911. PalletLayer = curlayer,
  15912. ProductMachCode = invs.ProductMachCode,
  15913. Equip = item.Equip,
  15914. PalletizingId = item.Id,
  15915. Robot = root,
  15916. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  15917. });
  15918. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15919. {
  15920. continue;
  15921. }
  15922. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15923. {
  15924. Istask = 1,
  15925. Layer = curlayer
  15926. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15927. }
  15928. return res;
  15929. }
  15930. else
  15931. {
  15932. foreach (var pallets in palletMach)
  15933. {
  15934. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  15935. if (cell == null)
  15936. {
  15937. continue;
  15938. }
  15939. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  15940. if (invs == null)
  15941. {
  15942. continue;
  15943. }
  15944. var root = "";
  15945. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  15946. {
  15947. root = "Robot1";
  15948. }
  15949. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  15950. {
  15951. root = "Robot2";
  15952. }
  15953. //先判断二升位是否能出库
  15954. if (cell.Depth == 2)
  15955. {
  15956. var respon = MoveTask(cell.Code);
  15957. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  15958. {
  15959. continue;
  15960. }
  15961. }
  15962. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  15963. {
  15964. Code = pallets.ContBarCode,
  15965. CellCode = cell.Code,
  15966. Srm = cell.SCRel,
  15967. Tunnel = cell.Tunnel.ToString(),
  15968. Floor = cell.Floor,
  15969. Grade = invs.Grade,
  15970. Mater = invs.MatCode,
  15971. SkuCode = pallets.SkuCode,
  15972. PalletLayer = curlayer + 1,
  15973. ProductMachCode = invs.ProductMachCode,
  15974. Equip = item.Equip,
  15975. PalletizingId = item.Id,
  15976. Robot = root,
  15977. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  15978. });
  15979. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  15980. {
  15981. continue;
  15982. }
  15983. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  15984. {
  15985. Istask = 1,
  15986. Layer = curlayer + 1
  15987. }, p => p.ContBarCode == invs.ContGrpBarCode);
  15988. }
  15989. return res;
  15990. }
  15991. }
  15992. }
  15993. //取视图码垛设备号
  15994. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  15995. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  15996. {
  15997. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut4", new RedisErrorInfo() { Equip = "CgradeOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  15998. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  15999. res.ResMsg = "没有空闲的码垛工位";
  16000. return res;
  16001. }
  16002. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  16003. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  16004. if (!devices.Where(p => p.pH_STATUS == true).Any())
  16005. {
  16006. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut5", new RedisErrorInfo() { Equip = "CgradeOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  16007. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16008. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  16009. return res;
  16010. }
  16011. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  16012. //var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  16013. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16014. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "C" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  16015. && !p.InDocsNo.StartsWith("CHA"))
  16016. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16017. select new StockTemp
  16018. {
  16019. MatCode = stock.MatCode,
  16020. InvBarCode = stock.InvBarCode,
  16021. Grade = stock.Grade,
  16022. InvStateCode = stock.InvStateCode,
  16023. ProductTime = stock.ProductTime,
  16024. WbGroupCode = stock.WbGroupCode,
  16025. IsTorsChk = stock.IsTorsChk,
  16026. TorsChkQty = stock.TorsChkQty,
  16027. TorsChkValue = stock.TorsChkValue,
  16028. HoldTime = stock.HoldTime,
  16029. ProductMachCode = stock.ProductMachCode,
  16030. IsControlpanel = stock.IsControlpanel,
  16031. HWTypeCode = stock.HWTypeCode,
  16032. SolderCount = stock.SolderCount,
  16033. IsRework = stock.IsRework,
  16034. IsBlack = stock.IsBlack,
  16035. Col = loc.Col,
  16036. Layer = loc.Layer,
  16037. Shelf = loc.Shelf,
  16038. Depth = loc.Depth,
  16039. Code = loc.Code,
  16040. Tunnel = loc.Tunnel,
  16041. SCRel = loc.SCRel,
  16042. Floor = loc.Floor,
  16043. WarehouseCode = loc.WarehouseCode,
  16044. ContGrpBarCode = loc.ContGrpBarCode,
  16045. ContGrpId = loc.ContGrpId,
  16046. Id = loc.Id,
  16047. StateNum = loc.StateNum,
  16048. Wind = stock.Wind,
  16049. InDocsNo = stock.InDocsNo
  16050. };
  16051. if (!invlist.Any())
  16052. {
  16053. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut6", new RedisErrorInfo() { Equip = "CgradeOut6", Con = "库存不足", Time = DateTime.Now });
  16054. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16055. res.ResMsg = "库存不足";
  16056. return res;
  16057. }
  16058. invlist = invlist.Distinct();
  16059. var temps = invlist.GroupBy(p => p.HWTypeCode);
  16060. var rules = new BillPboxrule();
  16061. foreach (var item in temps)
  16062. {
  16063. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  16064. if (!invlist.Any())
  16065. {
  16066. continue;
  16067. }
  16068. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  16069. foreach (var stockTemps in mater)
  16070. {
  16071. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  16072. if (!invlist.Any())
  16073. {
  16074. continue;
  16075. }
  16076. if (invlist.Any(p => p.Wind == "L"))
  16077. {
  16078. invlist = invlist.Where(p => p.Wind == "L");
  16079. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16080. rule.Id = GetId();
  16081. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16082. rule.Wind = "L";
  16083. rule.ZXStateCode = 1;
  16084. rule.SpoolType = item.Key;
  16085. rule.PackRule = "CGreade";
  16086. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16087. rule.SkuCode = "TestC12";
  16088. rule.BatchNo = "22";
  16089. rules = _boxrulerepository.InsertReturnEntity(rule);
  16090. }
  16091. else
  16092. {
  16093. invlist = invlist.Where(p => p.Wind == "R");
  16094. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16095. rule.Id = GetId();
  16096. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16097. rule.Wind = "R";
  16098. rule.ZXStateCode = 1;
  16099. rule.SpoolType = item.Key;
  16100. rule.PackRule = "CGreade";
  16101. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16102. rule.SkuCode = "TestC12";
  16103. rule.BatchNo = "22";
  16104. rules = _boxrulerepository.InsertReturnEntity(rule);
  16105. }
  16106. if (item.Key == "BS60" || item.Key == "BS40")
  16107. {
  16108. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  16109. }
  16110. else
  16111. {
  16112. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  16113. }
  16114. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  16115. //码垛信息校验
  16116. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  16117. {
  16118. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  16119. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  16120. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  16121. return res;
  16122. }
  16123. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  16124. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  16125. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  16126. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16127. {
  16128. res.ResCode = trayres.ResCode;
  16129. res.ResMsg = trayres.ResMsg;
  16130. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut7", new RedisErrorInfo() { Equip = "CgradeOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  16131. return res;
  16132. }
  16133. var pallet = new Palletizing()
  16134. {
  16135. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  16136. PalletizState = 0,
  16137. Equip = palletequip.Code,
  16138. Finish = 0,
  16139. AddWho = "",
  16140. EditWho = "",
  16141. BoxRule = rules.PackRule,
  16142. BoxRuleId = rules.Id,
  16143. IsControlpanel = false,
  16144. TaskNum = int.Parse(trayres.Memo1),
  16145. GoodsType = item.Key == "BS80/33" ? 1 : 2
  16146. };
  16147. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  16148. List<PalletLayerMath> math = new List<PalletLayerMath>();
  16149. foreach (var invs in invlist)
  16150. {
  16151. var palletlayer = new PalletLayerMath()
  16152. {
  16153. ContGrpId = (long)invs.ContGrpId,
  16154. ContBarCode = invs.ContGrpBarCode,
  16155. Layer = 0,
  16156. SkuCode = rules.SkuCode,
  16157. Finish = 0,
  16158. PboxruleId = rules.Id,
  16159. Istask = 0,
  16160. Palletequip = palletequip.Code,
  16161. Depth = invs.Depth,
  16162. IsBlack = invs.IsBlack,
  16163. SolderCount = invs.SolderCount,
  16164. BoxCode = rules.PBoxCode
  16165. };
  16166. math.Add(palletlayer);
  16167. }
  16168. _palletlayerMathrepository.InsertRange(math);
  16169. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  16170. {
  16171. PreStock = "1"
  16172. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  16173. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  16174. foreach (var code in invlist)
  16175. {
  16176. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  16177. if (cell == null)
  16178. {
  16179. continue;
  16180. }
  16181. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16182. if (invs == null)
  16183. {
  16184. continue;
  16185. }
  16186. var root = "";
  16187. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  16188. {
  16189. root = "Robot1";
  16190. }
  16191. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  16192. {
  16193. root = "Robot2";
  16194. }
  16195. //先判断二升位是否能出库
  16196. if (code.Depth == 2)
  16197. {
  16198. var respon = MoveTask(code.Code);
  16199. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16200. {
  16201. continue;
  16202. }
  16203. }
  16204. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  16205. {
  16206. Code = code.ContGrpBarCode,
  16207. Equip = pallects.Equip,
  16208. Mater = code.MatCode,
  16209. Srm = code.SCRel,
  16210. PalletLayer = 1,
  16211. Grade = code.Grade,
  16212. Tunnel = code.Tunnel.ToString(),
  16213. CellCode = code.Code,
  16214. SkuCode = rules.SkuCode,
  16215. ProductMachCode = code.ProductMachCode,
  16216. Floor = code.Floor,
  16217. PalletizingId = pallects.Id,
  16218. Robot = root,
  16219. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  16220. });
  16221. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16222. {
  16223. continue;
  16224. }
  16225. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16226. {
  16227. Istask = 1,
  16228. Layer = 1
  16229. }, p => p.ContBarCode == code.ContGrpBarCode);
  16230. }
  16231. return res;
  16232. }
  16233. }
  16234. return res;
  16235. }
  16236. public SRes OnePackStock(PalletizingPackStockOutRequest request)
  16237. {
  16238. var res = new SRes();
  16239. return res;//改造后方法没有修改,暂时注释
  16240. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "OnePack");
  16241. if (palletlist.Any())
  16242. {
  16243. foreach (var item in palletlist)
  16244. {
  16245. 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));
  16246. if (tasklist.Any())
  16247. {
  16248. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut1", new RedisErrorInfo() { Equip = "OnePackOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  16249. continue;
  16250. }
  16251. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  16252. if (equips == null)
  16253. {
  16254. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut2", new RedisErrorInfo() { Equip = "OnePackOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  16255. continue;
  16256. }
  16257. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  16258. if (!palletMach.Any())
  16259. {
  16260. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut3", new RedisErrorInfo() { Equip = "OnePackOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  16261. continue;
  16262. }
  16263. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  16264. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  16265. if (tasklayer != 12 && tasklayer < 12)
  16266. {
  16267. palletMach = palletMach.Take(12 - tasklayer);
  16268. foreach (var pallets in palletMach)
  16269. {
  16270. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  16271. if (cell == null)
  16272. {
  16273. continue;
  16274. }
  16275. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16276. if (invs == null)
  16277. {
  16278. continue;
  16279. }
  16280. var root = "";
  16281. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  16282. {
  16283. root = "Robot1";
  16284. }
  16285. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  16286. {
  16287. root = "Robot2";
  16288. }
  16289. //先判断二升位是否能出库
  16290. if (cell.Depth == 2)
  16291. {
  16292. var respon = MoveTask(cell.Code);
  16293. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16294. {
  16295. continue;
  16296. }
  16297. }
  16298. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  16299. {
  16300. Code = pallets.ContBarCode,
  16301. CellCode = cell.Code,
  16302. Srm = cell.SCRel,
  16303. Tunnel = cell.Tunnel.ToString(),
  16304. Floor = cell.Floor,
  16305. Grade = invs.Grade,
  16306. Mater = invs.MatCode,
  16307. SkuCode = pallets.SkuCode,
  16308. PalletLayer = curlayer,
  16309. ProductMachCode = invs.ProductMachCode,
  16310. Equip = item.Equip,
  16311. PalletizingId = item.Id,
  16312. Robot = root,
  16313. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  16314. });
  16315. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16316. {
  16317. continue;
  16318. }
  16319. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16320. {
  16321. Istask = 1,
  16322. Layer = curlayer
  16323. }, p => p.ContBarCode == invs.ContGrpBarCode);
  16324. }
  16325. return res;
  16326. }
  16327. else
  16328. {
  16329. foreach (var pallets in palletMach)
  16330. {
  16331. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  16332. if (cell == null)
  16333. {
  16334. continue;
  16335. }
  16336. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16337. if (invs == null)
  16338. {
  16339. continue;
  16340. }
  16341. var root = "";
  16342. if (pallets.Palletequip == "8090" || pallets.Palletequip == "8092")
  16343. {
  16344. root = "Robot1";
  16345. }
  16346. else if (pallets.Palletequip == "8096" || pallets.Palletequip == "8098")
  16347. {
  16348. root = "Robot2";
  16349. }
  16350. //先判断二升位是否能出库
  16351. if (cell.Depth == 2)
  16352. {
  16353. var respon = MoveTask(cell.Code);
  16354. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16355. {
  16356. continue;
  16357. }
  16358. }
  16359. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  16360. {
  16361. Code = pallets.ContBarCode,
  16362. CellCode = cell.Code,
  16363. Srm = cell.SCRel,
  16364. Tunnel = cell.Tunnel.ToString(),
  16365. Floor = cell.Floor,
  16366. Grade = invs.Grade,
  16367. Mater = invs.MatCode,
  16368. SkuCode = pallets.SkuCode,
  16369. PalletLayer = curlayer + 1,
  16370. ProductMachCode = invs.ProductMachCode,
  16371. Equip = item.Equip,
  16372. PalletizingId = item.Id,
  16373. Robot = root,
  16374. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  16375. });
  16376. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16377. {
  16378. continue;
  16379. }
  16380. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16381. {
  16382. Istask = 1,
  16383. Layer = curlayer + 1
  16384. }, p => p.ContBarCode == invs.ContGrpBarCode);
  16385. }
  16386. return res;
  16387. }
  16388. }
  16389. }
  16390. //取视图码垛设备号
  16391. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  16392. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  16393. {
  16394. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut4", new RedisErrorInfo() { Equip = "OnePackOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  16395. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16396. res.ResMsg = "没有空闲的码垛工位";
  16397. return res;
  16398. }
  16399. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  16400. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  16401. if (!devices.Where(p => p.pH_STATUS == true).Any())
  16402. {
  16403. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut5", new RedisErrorInfo() { Equip = "OnePackOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  16404. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16405. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  16406. return res;
  16407. }
  16408. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  16409. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16410. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  16411. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16412. select new StockTemp
  16413. {
  16414. MatCode = stock.MatCode,
  16415. InvBarCode = stock.InvBarCode,
  16416. Grade = stock.Grade,
  16417. InvStateCode = stock.InvStateCode,
  16418. ProductTime = stock.ProductTime,
  16419. WbGroupCode = stock.WbGroupCode,
  16420. IsTorsChk = stock.IsTorsChk,
  16421. TorsChkQty = stock.TorsChkQty,
  16422. TorsChkValue = stock.TorsChkValue,
  16423. HoldTime = stock.HoldTime,
  16424. ProductMachCode = stock.ProductMachCode,
  16425. IsControlpanel = stock.IsControlpanel,
  16426. HWTypeCode = stock.HWTypeCode,
  16427. SolderCount = stock.SolderCount,
  16428. IsRework = stock.IsRework,
  16429. IsBlack = stock.IsBlack,
  16430. Col = loc.Col,
  16431. Layer = loc.Layer,
  16432. Shelf = loc.Shelf,
  16433. Depth = loc.Depth,
  16434. Code = loc.Code,
  16435. Tunnel = loc.Tunnel,
  16436. SCRel = loc.SCRel,
  16437. Floor = loc.Floor,
  16438. WarehouseCode = loc.WarehouseCode,
  16439. ContGrpBarCode = loc.ContGrpBarCode,
  16440. ContGrpId = loc.ContGrpId,
  16441. Id = loc.Id,
  16442. StateNum = loc.StateNum,
  16443. Wind = stock.Wind,
  16444. InDocsNo = stock.InDocsNo
  16445. };
  16446. if (!invlist.Any())
  16447. {
  16448. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut6", new RedisErrorInfo() { Equip = "OnePackOut6", Con = "库存不足", Time = DateTime.Now });
  16449. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16450. res.ResMsg = "库存不足";
  16451. return res;
  16452. }
  16453. invlist = invlist.Distinct();
  16454. var temps = invlist.GroupBy(p => p.HWTypeCode);
  16455. var rules = new BillPboxrule();
  16456. foreach (var item in temps)
  16457. {
  16458. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  16459. if (!invlist.Any())
  16460. {
  16461. continue;
  16462. }
  16463. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  16464. foreach (var stockTemps in mater)
  16465. {
  16466. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  16467. if (!invlist.Any())
  16468. {
  16469. continue;
  16470. }
  16471. if (invlist.Any(p => p.Wind == "L"))
  16472. {
  16473. invlist = invlist.Where(p => p.Wind == "L");
  16474. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16475. rule.Id = GetId();
  16476. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16477. rule.Wind = "L";
  16478. rule.ZXStateCode = 1;
  16479. rule.SpoolType = item.Key;
  16480. rule.PackRule = "OnePack";
  16481. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16482. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  16483. rule.BatchNo = "1";
  16484. rules = _boxrulerepository.InsertReturnEntity(rule);
  16485. }
  16486. else
  16487. {
  16488. invlist = invlist.Where(p => p.Wind == "R");
  16489. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  16490. rule.Id = GetId();
  16491. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  16492. rule.Wind = "R";
  16493. rule.ZXStateCode = 1;
  16494. rule.SpoolType = item.Key;
  16495. rule.PackRule = "OnePack";
  16496. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  16497. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  16498. rule.BatchNo = "1";
  16499. rules = _boxrulerepository.InsertReturnEntity(rule);
  16500. }
  16501. if (item.Key == "BS60" || item.Key == "BS40")
  16502. {
  16503. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  16504. }
  16505. else
  16506. {
  16507. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  16508. }
  16509. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  16510. //码垛信息校验
  16511. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  16512. {
  16513. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  16514. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  16515. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  16516. return res;
  16517. }
  16518. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  16519. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  16520. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  16521. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16522. {
  16523. res.ResCode = trayres.ResCode;
  16524. res.ResMsg = trayres.ResMsg;
  16525. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut7", new RedisErrorInfo() { Equip = "OnePackOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  16526. return res;
  16527. }
  16528. var pallet = new Palletizing()
  16529. {
  16530. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  16531. PalletizState = 0,
  16532. Equip = palletequip.Code,
  16533. Finish = 0,
  16534. AddWho = "",
  16535. EditWho = "",
  16536. BoxRule = rules.PackRule,
  16537. BoxRuleId = rules.Id,
  16538. IsControlpanel = false,
  16539. TaskNum = int.Parse(trayres.Memo1),
  16540. GoodsType = item.Key == "BS80/33" ? 1 : 2
  16541. };
  16542. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  16543. List<PalletLayerMath> math = new List<PalletLayerMath>();
  16544. foreach (var invs in invlist)
  16545. {
  16546. var palletlayer = new PalletLayerMath()
  16547. {
  16548. ContGrpId = (long)invs.ContGrpId,
  16549. ContBarCode = invs.ContGrpBarCode,
  16550. Layer = 0,
  16551. SkuCode = rules.SkuCode,
  16552. Finish = 0,
  16553. PboxruleId = rules.Id,
  16554. Istask = 0,
  16555. Palletequip = palletequip.Code,
  16556. Depth = invs.Depth,
  16557. IsBlack = invs.IsBlack,
  16558. SolderCount = invs.SolderCount,
  16559. BoxCode = rules.PBoxCode
  16560. };
  16561. math.Add(palletlayer);
  16562. }
  16563. _palletlayerMathrepository.InsertRange(math);
  16564. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  16565. {
  16566. PreStock = "1"
  16567. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  16568. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  16569. foreach (var code in invlist)
  16570. {
  16571. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  16572. if (cell == null)
  16573. {
  16574. continue;
  16575. }
  16576. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16577. if (invs == null)
  16578. {
  16579. continue;
  16580. }
  16581. var root = "";
  16582. if (palletequip.Code == "8090" || palletequip.Code == "8092")
  16583. {
  16584. root = "Robot1";
  16585. }
  16586. else if (palletequip.Code == "8096" || palletequip.Code == "8098")
  16587. {
  16588. root = "Robot2";
  16589. }
  16590. //先判断二升位是否能出库
  16591. if (code.Depth == 2)
  16592. {
  16593. var respon = MoveTask(code.Code);
  16594. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  16595. {
  16596. continue;
  16597. }
  16598. }
  16599. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  16600. {
  16601. Code = code.ContGrpBarCode,
  16602. Equip = pallects.Equip,
  16603. Mater = code.MatCode,
  16604. Srm = code.SCRel,
  16605. PalletLayer = 1,
  16606. Grade = code.Grade,
  16607. Tunnel = code.Tunnel.ToString(),
  16608. CellCode = code.Code,
  16609. SkuCode = rules.SkuCode,
  16610. ProductMachCode = code.ProductMachCode,
  16611. Floor = code.Floor,
  16612. PalletizingId = pallects.Id,
  16613. Robot = root,
  16614. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  16615. });
  16616. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  16617. {
  16618. continue;
  16619. }
  16620. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  16621. {
  16622. Istask = 1,
  16623. Layer = 1
  16624. }, p => p.ContBarCode == code.ContGrpBarCode);
  16625. }
  16626. return res;
  16627. }
  16628. }
  16629. return res;
  16630. }
  16631. public SRes<bool> IsExistTask(DetailCodeRequest request)
  16632. {
  16633. var result = new SRes<bool>();
  16634. result.ResData = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == request.Code && p.Status < TaskStatus.Finish).Any();
  16635. return result;
  16636. }
  16637. public SRes<string> GetLocationInfo(DetailCodeRequest request)
  16638. {
  16639. var result = new SRes<string>();
  16640. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == request.Code && p.StateNum == LocationState.LocationState_Full).ToList();
  16641. result.ResData = cell.Any() ? cell.First().Code : "";
  16642. return result;
  16643. }
  16644. public SRes CancelPreStockinfo(CancelPreStockinfoRequest request)
  16645. {
  16646. var res = new SRes();
  16647. if (!request.Ids.Any())
  16648. {
  16649. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  16650. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  16651. return res;
  16652. }
  16653. foreach (var item in request.Ids)
  16654. {
  16655. var match = _palletlayerMathrepository.GetSingle(p => p.Id == item && p.Istask == 0);
  16656. if (match == null)
  16657. {
  16658. continue;
  16659. }
  16660. var inv = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == match.ContBarCode && p.ContGrpId == match.ContGrpId && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  16661. if (inv == null)
  16662. {
  16663. continue;
  16664. }
  16665. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == inv.ContGrpBarCode).First();
  16666. if (task != null)
  16667. {
  16668. continue;
  16669. }
  16670. var sucess = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  16671. {
  16672. PreStock = string.Empty,
  16673. Memo = "取消预锁库存"
  16674. }, p => p.Id == inv.Id);
  16675. if (sucess)
  16676. {
  16677. _palletlayerMathrepository.Delete(p => p.Id == match.Id);
  16678. }
  16679. }
  16680. return res;
  16681. }
  16682. public SRes<GetTorsRangeRes> GetTorsRange(DetailCodeRequest request)
  16683. {
  16684. var result = new SRes<GetTorsRangeRes>() { ResData = new GetTorsRangeRes() };
  16685. var rules = _boxrulerepository.GetList(p => p.PBoxCode == request.Code);
  16686. if (rules != null && rules.Any())
  16687. {
  16688. var rule = rules.First();
  16689. result.ResData.TorsValue = rule.Torsion48Qty > 0 ? rule.Torsion48Qty : rule.Torsion72Qty > 0 ? rule.Torsion72Qty : rule.Torsion24Qty;
  16690. result.ResData.TorsRangeValue = rule.TorsionErrRange;
  16691. }
  16692. return result;
  16693. }
  16694. public SRes<string> GetCGradeList()
  16695. {
  16696. var res = new SRes<string>() { ResDataList = new List<string>() };
  16697. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16698. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.Grade == "C" || p.Grade == "D") && string.IsNullOrEmpty(p.PreStock)
  16699. && !p.InDocsNo.StartsWith("CHA"))
  16700. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16701. select loc.Code;
  16702. if (!invlist.Any())
  16703. {
  16704. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16705. res.ResMsg = "没有C级品库存不足";
  16706. return res;
  16707. }
  16708. res.ResDataList = invlist.Distinct().ToList();
  16709. return res;
  16710. }
  16711. public SRes<string> GetBGradeTimeOutList()
  16712. {
  16713. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent); // int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  16714. var res = new SRes<string>() { ResDataList = new List<string>() };
  16715. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  16716. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "B" && string.IsNullOrEmpty(p.PreStock)
  16717. && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  16718. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  16719. select loc.Code;
  16720. if (!invlist.Any())
  16721. {
  16722. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16723. res.ResMsg = "没有B级品超时库存不足";
  16724. return res;
  16725. }
  16726. res.ResDataList = invlist.Distinct().ToList();
  16727. return res;
  16728. }
  16729. public SRes ErrorDateclearJob()
  16730. {
  16731. var res = new SRes();
  16732. try
  16733. {
  16734. 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();
  16735. foreach (var item in task)
  16736. {
  16737. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.BarCode);
  16738. if (stock == null)
  16739. {
  16740. if (_taskrepository.Delete(p => p.ID == item.ID))
  16741. {
  16742. _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();
  16743. }
  16744. }
  16745. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString() || stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  16746. {
  16747. if (_taskrepository.Delete(p => p.ID == item.ID))
  16748. {
  16749. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  16750. _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();
  16751. }
  16752. }
  16753. else
  16754. {
  16755. continue;
  16756. }
  16757. }
  16758. }
  16759. catch (Exception ex)
  16760. {
  16761. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16762. res.ResMsg = ex.Message;
  16763. return res;
  16764. }
  16765. return res;
  16766. }
  16767. public SRes FlowDataMoveJob(PalletizingPackStockOutRequest request)
  16768. {
  16769. var res = new SRes();
  16770. //流水表
  16771. try
  16772. {
  16773. var flow = _billInvflow.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddDays(-60)).OrderBy(p => p.Id).Take(100).ToList();
  16774. if (flow.Any())
  16775. {
  16776. var ids = flow.Select(p => p.Id).Distinct().ToList();
  16777. var flowhty = _mapper.Map<List<Bill_InvflowHty>>(flow);
  16778. if (_flowhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p=> ids.Contains(p.Id)).Any())
  16779. {
  16780. _flowhtyrepository.Context.Deleteable<Bill_InvflowHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16781. }
  16782. _flowhtyrepository.InsertableSplitTable(flowhty);
  16783. _billInvflow.Delete(p => ids.Contains(p.Id));
  16784. }
  16785. }
  16786. catch (Exception ex)
  16787. {
  16788. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16789. res.ResMsg = ex.Message;
  16790. return res;
  16791. }
  16792. //码垛主表
  16793. try
  16794. {
  16795. 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();
  16796. if (pallet.Any())
  16797. {
  16798. var ids = pallet.Select(p => p.Id).Distinct().ToList();
  16799. var pallethty = _mapper.Map<List<PalletizingHty>>(pallet);
  16800. if (_pallethtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16801. {
  16802. _pallethtyrepository.Context.Deleteable<PalletizingHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16803. }
  16804. _pallethtyrepository.InsertableSplitTable(pallethty);
  16805. _palletizrepository.Delete(p => ids.Contains(p.Id));
  16806. }
  16807. }
  16808. catch (Exception ex)
  16809. {
  16810. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16811. res.ResMsg = ex.Message;
  16812. return res;
  16813. }
  16814. //推送表
  16815. try
  16816. {
  16817. var push = _billPushinforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6)).OrderBy(p => p.Id).Take(100).ToList();
  16818. if (push.Any())
  16819. {
  16820. var ids = push.Select(p => p.Id).Distinct().ToList();
  16821. var pushthty = _mapper.Map<List<BillPushinfoHty>>(push);
  16822. if (_pushhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16823. {
  16824. _pushhtyrepository.Context.Deleteable<BillPushinfoHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16825. }
  16826. _pushhtyrepository.InsertableSplitTable(pushthty);
  16827. _billPushinforepository.Delete(p => ids.Contains(p.Id));
  16828. }
  16829. }
  16830. catch (Exception ex)
  16831. {
  16832. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16833. res.ResMsg = ex.Message;
  16834. return res;
  16835. }
  16836. //箱号表
  16837. try
  16838. {
  16839. 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();
  16840. if (boxrule.Any())
  16841. {
  16842. var ids = boxrule.Select(p => p.Id).Distinct().ToList();
  16843. var boxrulethty = _mapper.Map<List<BillPboxruleHty>>(boxrule);
  16844. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  16845. {
  16846. _pboxrulehtyrepository.Context.Deleteable<BillPboxruleHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  16847. }
  16848. _pboxrulehtyrepository.InsertableSplitTable(boxrulethty);
  16849. _boxrulerepository.Delete(p => ids.Contains(p.Id));
  16850. }
  16851. }
  16852. catch (Exception ex)
  16853. {
  16854. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16855. res.ResMsg = ex.Message;
  16856. return res;
  16857. }
  16858. return res;
  16859. }
  16860. /// <summary>
  16861. /// 清理任务数据
  16862. /// </summary>
  16863. /// <param name="request"></param>
  16864. /// <returns></returns>
  16865. public SRes RemoveTaskData(PalletizingPackStockOutRequest request)
  16866. {
  16867. var res = new SRes();
  16868. try
  16869. {
  16870. var sysconfcon = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TaskRemoveHours").SContent) * (-1);
  16871. 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();
  16872. //var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddHours(sysconfcon)).SplitTable(p => p.Take(2)).Take(100).ToList();
  16873. if (tasklist.Any())
  16874. {
  16875. var ids = tasklist.Select(p => p.ID).ToList();
  16876. var barlist = tasklist.Select(p => p.BarCode).ToList();
  16877. _taskrepository.Delete(p => ids.Contains(p.ID));//任务表
  16878. var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//
  16879. foreach (var item in tables)
  16880. {
  16881. //删除历史任务表
  16882. _wcstaskoldrepository.Context.Deleteable<WCS_TaskOld>().AS(item.TableName)//使用当前分表名
  16883. .Where(p => ids.Contains(p.Id))
  16884. .ExecuteCommand();
  16885. }
  16886. _billInvinitrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  16887. _billInvnowrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  16888. }
  16889. }
  16890. catch (Exception ex)
  16891. {
  16892. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  16893. res.ResMsg = ex.Message;
  16894. return res;
  16895. }
  16896. return res;
  16897. }
  16898. public void WreTimeOutRecord(List<string> contbars,string msg)
  16899. {
  16900. try
  16901. {
  16902. if (contbars.Any())
  16903. {
  16904. //存在的数据更新,不存在的新增
  16905. if (msg.Length > 4900)
  16906. {
  16907. msg = msg.Substring(0, 4900);
  16908. }
  16909. _timeoutrecord.AsUpdateable().SetColumns(p => new BillTimeOutRecord() { Reason = msg, EditTime = DateTime.Now }).Where(p => contbars.Contains(p.ContGrpBarCode)).SplitTable(p => p.Take(2)).ExecuteCommand();
  16910. var existlist = _timeoutrecord.AsQueryable().SplitTable(p => p.Take(2)).Select(p => p.ContGrpBarCode).Distinct().ToList();
  16911. var noexistlist = contbars.Where(p => !existlist.Contains(p)).Distinct().ToList();
  16912. List<BillTimeOutRecord> listrec = noexistlist.Select(p => new BillTimeOutRecord() { ContGrpBarCode = p, Reason = msg, AddTime = DateTime.Now, EditTime = DateTime.Now }).ToList();
  16913. if (listrec.Any()) _timeoutrecord.Context.Insertable(listrec).SplitTable().ExecuteCommand();
  16914. }
  16915. }
  16916. catch (Exception ex)
  16917. {
  16918. _logger.LogInformation("记录超时信息异常" + ex.ToString());
  16919. }
  16920. }
  16921. }
  16922. }