SXService.cs 663 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312
  1. using AutoMapper;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using SqlSugar;
  5. using SqlSugar.Extensions;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using WCS.Entity.sx;
  12. using wms.dataservice.IDataSetvice;
  13. using wms.dto;
  14. using wms.dto.request;
  15. using wms.dto.request.cp;
  16. using wms.dto.request.fj;
  17. using wms.dto.request.hj;
  18. using wms.dto.request.hj.dto;
  19. using wms.dto.request.share;
  20. using wms.dto.request.sx;
  21. using wms.dto.response;
  22. using wms.dto.response.cp;
  23. using wms.dto.response.hj;
  24. using wms.dto.response.share;
  25. using wms.dto.response.sx;
  26. using wms.service.Help;
  27. using wms.service.Help.Packing;
  28. using wms.service.IService;
  29. using wms.sqlsugar;
  30. using wms.sqlsugar.model;
  31. using wms.sqlsugar.model.sx;
  32. using wms.util;
  33. using wms.util.Check;
  34. using wms.util.Ext;
  35. using wms.util.Http;
  36. using TaskStatus = wms.dto.TaskStatus;
  37. namespace wms.service.Service
  38. {
  39. /// <summary>
  40. /// SX业务逻辑
  41. /// </summary>
  42. public class SXService : ISXService
  43. {
  44. private readonly IMapper _mapper;
  45. private readonly ILogger<SXService> _logger;
  46. private readonly ISXDataService _sxtDataService;
  47. private static object lockerPalletizingPackTask = new object();
  48. private static object lockerApplyLoc = new object();
  49. /// <summary>
  50. /// 包材-托盘重量
  51. /// </summary>
  52. private static decimal TuoPan { get => 12.6M; }
  53. /// <summary>
  54. /// 包材-塑料袋重量
  55. /// </summary>
  56. private static decimal SuLiaoDai { get => 1.03M; }
  57. /// <summary>
  58. /// 包材-隔板重量
  59. /// </summary>
  60. private static decimal GeBan { get => 0.77M; }
  61. /// <summary>
  62. /// 包材-纸箱重量
  63. /// </summary>
  64. private static decimal ZhiXiang { get => 1.09M; }
  65. public SXService(IMapper mapper, ILogger<SXService> logger, ISXDataService sxtDataService)
  66. {
  67. _mapper = mapper;
  68. _logger = logger;
  69. _sxtDataService = sxtDataService;
  70. }
  71. private Repository<sxSysConfig> _sysconfigrepository => new Repository<sxSysConfig>();
  72. /// <summary>
  73. /// 容器表
  74. /// </summary>
  75. private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
  76. /// <summary>
  77. /// 当前任务表
  78. /// </summary>
  79. private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();
  80. /// <summary>
  81. /// 库存表
  82. /// </summary>
  83. private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();
  84. /// <summary>
  85. /// 条码表
  86. /// </summary>
  87. private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();
  88. /// <summary>
  89. /// 物料表
  90. /// </summary>
  91. private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();
  92. /// <summary>
  93. /// 单据表
  94. /// </summary>
  95. private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();
  96. /// <summary>
  97. /// 任务历史表
  98. /// </summary>
  99. private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();
  100. /// <summary>
  101. /// 流水表
  102. /// </summary>
  103. private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();
  104. /// <summary>
  105. /// 甲方管理系统推送反馈
  106. /// </summary>
  107. private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();
  108. /// <summary>
  109. /// 货位表
  110. /// </summary>
  111. private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();
  112. /// <summary>
  113. /// 仓库表
  114. /// </summary>
  115. private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();
  116. private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();
  117. /// <summary>
  118. /// 机台表
  119. /// </summary>
  120. private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();
  121. private Repository<sxSysJob> _jobrepository => new Repository<sxSysJob>();
  122. private Repository<sxSysJobApiRelation> _jobApirepository => new Repository<sxSysJobApiRelation>();
  123. private Repository<BillSkuInfo> _skuInforepository => new Repository<BillSkuInfo>();
  124. private Repository<BillPackInfo> _packInforepository => new Repository<BillPackInfo>();
  125. private Repository<BillPboxrule> _boxrulerepository => new Repository<BillPboxrule>();
  126. private Repository<BillBoxSerial> _boxserialrepository => new Repository<BillBoxSerial>();
  127. private Repository<PalletLayerMath> _palletlayerMathrepository => new Repository<PalletLayerMath>();
  128. private Repository<Palletizingdetail> _palletizdetailrepository => new Repository<Palletizingdetail>();
  129. private Repository<Palletizing> _palletizrepository => new Repository<Palletizing>();
  130. private Repository<BaseTorchbandinfo> _torchbandinforepository => new Repository<BaseTorchbandinfo>();
  131. private Repository<BaseErrorinfo> _errorinforepository => new Repository<BaseErrorinfo>();
  132. private Repository<TorschWbCount> _torschwbcount => new Repository<TorschWbCount>();
  133. private Repository<BaseErrorinfoWcs> _errorinfowcs => new Repository<BaseErrorinfoWcs>();
  134. private RepositoryTask<BillTimeOutRecord> _timeoutrecord => new RepositoryTask<BillTimeOutRecord>();
  135. private RepositoryTask<Bill_InvflowHty> _flowhtyrepository => new RepositoryTask<Bill_InvflowHty>();
  136. private RepositoryTask<BillPboxruleHty> _pboxrulehtyrepository => new RepositoryTask<BillPboxruleHty>();
  137. private RepositoryTask<BillPushinfoHty> _pushhtyrepository => new RepositoryTask<BillPushinfoHty>();
  138. private RepositoryTask<PalletizingHty> _pallethtyrepository => new RepositoryTask<PalletizingHty>();
  139. private ITenant _db => SqlSugarHelper.Db;//处理事务
  140. /// <summary>
  141. /// 获取配置内容信息
  142. /// </summary>
  143. /// <param name="code">配置表code值</param>
  144. /// <returns></returns>
  145. public string GetSysConfigContentByCode(string code)
  146. {
  147. //先读缓存
  148. var cacheContent = RedisHelper.Get("sys_config" + code);
  149. if (!string.IsNullOrEmpty(cacheContent))
  150. {
  151. return cacheContent;
  152. }
  153. var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);
  154. if (sysconf == null)
  155. {
  156. throw new Exception("数据表没有配置" + code);
  157. }
  158. var content = sysconf.SContent;
  159. string sysname = sysconf.Default1;//所属系统mes/erp
  160. RedisHelper.Set("sys_config" + code, content + "|" + sysname);
  161. return content;
  162. }
  163. /// <summary>
  164. /// 获取配置信息
  165. /// </summary>
  166. /// <param name="code"></param>
  167. /// <returns></returns>
  168. public sxSysConfig GetSysConfigByCode(string code)
  169. {
  170. //Repository<dynamic> _billdtrepository = new Repository<dynamic>();
  171. return _sysconfigrepository.GetSingle(p => p.Code == code);
  172. }
  173. public bool SyncMaterInfo(List<SxSyncMaterInfoRequestItem> ResData)
  174. {
  175. foreach (var item in ResData)
  176. {
  177. if (_basematerrepository.IsAny(p => p.Code == item.MatCode))
  178. {
  179. _basematerrepository.UpdateModelColumns(p => new BaseMatinfo() { IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName, EditTime = DateTime.Now, Description = item.Describe },
  180. p => p.Code == item.MatCode);
  181. }
  182. else
  183. {
  184. var model = _mapper.Map<BaseMatinfo>(item);
  185. model.AddTime = DateTime.Now;
  186. _basematerrepository.Insert(model);
  187. }
  188. }
  189. return true;
  190. }
  191. /// <summary>
  192. /// 帘线工单信息传输
  193. /// </summary>
  194. /// <param name="reqDto"></param>
  195. /// <returns></returns>
  196. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  197. {
  198. var res = new SRes();
  199. List<BillPboxrule> rulelist = new List<BillPboxrule>();
  200. var skuinfolist = _skuInforepository.GetList(p => p.SkuCode == reqDto.SkuCode);
  201. if (!skuinfolist.Any())
  202. {
  203. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  204. res.ResMsg = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode;
  205. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到SKU,单据信息无法接收,请先推送" + reqDto.SkuCode, Time = DateTime.Now });
  206. return res;
  207. }
  208. var l = reqDto.WindingList.FirstOrDefault(x => x.LR_TYPE.Contains("L"));
  209. var r = reqDto.WindingList.FirstOrDefault(x => x.LR_TYPE.Contains("R"));
  210. if (l == null || r == null)
  211. {
  212. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  213. res.ResMsg = "缺少L/R绕向相关信息";
  214. return res;
  215. }
  216. //箱号处理
  217. foreach (var item in reqDto.ListBoxInfo)
  218. {
  219. var rule = _boxrulerepository.AsQueryable().With(SqlWith.NoLock).Single(p => p.PBoxCode == item.BoxNo);
  220. if (rule == null)
  221. {
  222. //判断历史数据箱号
  223. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(12)).Where(p => p.PBoxCode == item.BoxNo).Any())
  224. {
  225. continue;
  226. }
  227. var packinfllist = _packInforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackCode == item.PackCode).ToList();
  228. if (!packinfllist.Any())
  229. {
  230. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  231. res.ResMsg = "没有找到包号,请先推送" + item.PackCode;
  232. RedisHelper.Set("Sx:WMSErrorInfo:MESEquip2", new RedisErrorInfo() { Equip = "MESEquip2", Con = "没有找到包号,请先推送" + item.PackCode, Time = DateTime.Now });
  233. return res;
  234. }
  235. int solrder = Convert.ToInt32(reqDto.SolderJointMax);
  236. int perSolderMaxCount = Convert.ToInt32(reqDto.HuSolderJointMax);
  237. decimal torsion24Qty = 0;
  238. decimal torsion48Qty = 0;
  239. decimal torsionErrRange = 0;
  240. decimal hold = 0;
  241. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  242. {
  243. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  244. }
  245. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  246. {
  247. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  248. }
  249. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  250. {
  251. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  252. }
  253. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  254. {
  255. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  256. }
  257. rule = new BillPboxrule();
  258. rule.IsStop = 0;
  259. rule.DocsNo = reqDto.BillCode;
  260. rule.SkuCode = reqDto.SkuCode;
  261. rule.PBoxCode = item.BoxNo;
  262. rule.PackRule = reqDto.PackRule;
  263. rule.FullCountQty = item.FullCount;
  264. rule.IsSolder = solrder > 0 ? 1 : 0;
  265. rule.SolderMaxCount = solrder;
  266. rule.PerSolderMaxCount = perSolderMaxCount;
  267. rule.Torsion24Qty = torsion24Qty;
  268. rule.Torsion48Qty = torsion48Qty;
  269. rule.Torsion72Qty = 0;
  270. rule.TorsionErrRange = torsionErrRange;
  271. rule.TorsChkValue = decimal.Parse(reqDto.TorsionTargetval);
  272. rule.TorsChkValueRange = decimal.Parse(reqDto.TorsionTargetscope);
  273. rule.ZXStateCode = 0;
  274. rule.BlackCount = 0;
  275. rule.ReturnCount = 0;
  276. rule.EmptyCountQty = item.EmptyCount;
  277. rule.TorsionMaxQty = 4;
  278. rule.TorsionMinQty = 1;
  279. rule.SpoolType = packinfllist.First().Spool;
  280. rule.HoldTime = hold;
  281. rule.PackJsonContent = JsonConvert.SerializeObject(packinfllist);
  282. rule.Wind = item.Winding;
  283. rule.BatchNo = item.Batch;
  284. rule.Dryer = item.PackCode;
  285. rule.LR_TYPE_L = l.LR_TYPE;
  286. rule.SPOOL_MAJOR_COLOR_L = l.SPOOL_MAJOR_COLOR;
  287. rule.TAKEUP_SIDE_L = l.TAKEUP_SIDE;
  288. rule.LR_TYPE_R = r.LR_TYPE;
  289. rule.SPOOL_MAJOR_COLOR_R = r.SPOOL_MAJOR_COLOR;
  290. rule.TAKEUP_SIDE_R = r.TAKEUP_SIDE;
  291. if (reqDto.ListPackagelnfo.Sum(p => p.Weight) > 0)
  292. {
  293. rule.PackWeight = reqDto.ListPackagelnfo.Sum(p => p.Weight) / 1000;
  294. }
  295. else
  296. {
  297. rule.PackWeight = packinfllist.Sum(p => p.Weight) / 1000;
  298. }
  299. if (packinfllist.Where(p => p.MatCode.StartsWith("C06-02-09") || p.MatCode.StartsWith("C12-01-06-0009")).Any())
  300. {
  301. if (packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).Any())
  302. {
  303. rule.TrayCode = packinfllist.Where(p => reqDto.ListPackagelnfo.Select(p => p.MaterialCode).Contains(p.MatCode)).First().MatCode;
  304. //rule.TrayCode = "mutuopan";
  305. //rule.TrayCode = "rechulituopan";
  306. }
  307. }
  308. rulelist.Add(rule);
  309. }
  310. else
  311. {
  312. int solrder = Convert.ToInt32(reqDto.SolderJointMax);
  313. int perSolderMaxCount = Convert.ToInt32(reqDto.HuSolderJointMax);
  314. decimal torsion24Qty = 0;
  315. decimal torsion48Qty = 0;
  316. decimal torsionErrRange = 0;
  317. decimal hold = 0;
  318. //if (skuinfolist.Where(p => p.FieldCode == "QC_B02").Any())
  319. //{
  320. // solrder = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B02").First().FieldValue);
  321. //}
  322. //if (skuinfolist.Where(p => p.FieldCode == "QC_B03").Any())
  323. //{
  324. // perSolderMaxCount = int.Parse(skuinfolist.Where(p => p.FieldCode == "QC_B03").First().FieldValue);
  325. //}
  326. if (skuinfolist.Where(p => p.FieldCode == "QC_C03").Any() && !string.IsNullOrEmpty(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue))
  327. {
  328. hold = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C03").First().FieldValue);
  329. }
  330. if (skuinfolist.Where(p => p.FieldCode == "QC_C04").Any() && !string.IsNullOrWhiteSpace(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue))
  331. {
  332. torsion24Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C04").First().FieldValue);
  333. }
  334. if (skuinfolist.Where(p => p.FieldCode == "QC_C06").Any())
  335. {
  336. torsion48Qty = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C06").First().FieldValue);
  337. }
  338. if (skuinfolist.Where(p => p.FieldCode == "QC_C05").Any())
  339. {
  340. torsionErrRange = decimal.Parse(skuinfolist.Where(p => p.FieldCode == "QC_C05").First().FieldValue);
  341. }
  342. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule()
  343. {
  344. SkuCode = reqDto.SkuCode,
  345. PackRule = reqDto.PackRule,
  346. IsSolder = solrder > 0 ? 1 : 0,
  347. SolderMaxCount = solrder,
  348. PerSolderMaxCount = perSolderMaxCount,
  349. Torsion24Qty = torsion24Qty,
  350. Torsion48Qty = torsion48Qty,
  351. TorsChkValue = decimal.Parse(reqDto.TorsionTargetval),
  352. TorsChkValueRange = decimal.Parse(reqDto.TorsionTargetscope),
  353. EditWho = "MES重复推送",
  354. EditTime = DateTime.Now,
  355. LR_TYPE_L = l.LR_TYPE,
  356. SPOOL_MAJOR_COLOR_L = l.SPOOL_MAJOR_COLOR,
  357. TAKEUP_SIDE_L = l.TAKEUP_SIDE,
  358. LR_TYPE_R = r.LR_TYPE,
  359. SPOOL_MAJOR_COLOR_R = r.SPOOL_MAJOR_COLOR,
  360. TAKEUP_SIDE_R = r.TAKEUP_SIDE,
  361. }).Where(p => p.PBoxCode == rule.PBoxCode && p.ZXStateCode == 0).ExecuteCommand();
  362. }
  363. }
  364. _boxrulerepository.InsertRange(rulelist);
  365. return res;
  366. }
  367. /// <summary>
  368. /// 帘线工字轮信息传输接口
  369. /// </summary>
  370. /// <param name="reqDto"></param>
  371. /// <returns></returns>
  372. public SRes SpoolMaterialInfoTrans(SxSpoolMaterialInfoTransRequest reqDto)
  373. {
  374. var res = new SRes();
  375. try
  376. {
  377. //var materlist = AppSettings.GetConfig("MaterInfo").Split(",");
  378. if (!_sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == "MaterConfig").Any())
  379. {
  380. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  381. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  382. return res;
  383. }
  384. var materlist = _sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == "MaterConfig").First().Memo.Split(",");
  385. if (!materlist.Contains(reqDto.MatCode))
  386. {
  387. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  388. res.ResMsg = reqDto.MatCode + "需要先配置该物料基础信息";
  389. return res;
  390. }
  391. //var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);
  392. //if (container == null)
  393. //{
  394. // var insertcon = new BaseContinfo()
  395. // {
  396. // ContBarCode = reqDto.SpoolCode,
  397. // Name = reqDto.SpoolCode,
  398. // TypeCode = ContainerType.ContainerType_Spool.ToString(),
  399. // PrintQty = 1,
  400. // IsStop = 0,
  401. // WarehouseId = 0,
  402. // WeightQty = 0,
  403. // AddWho = "wms",
  404. // AddTime = DateTime.Now
  405. // };
  406. // if (!_baseContinfo.Insert(insertcon))
  407. // {
  408. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  409. // res.ResMsg = "工字轮载具初始化失败";
  410. // return res;
  411. // }
  412. //}
  413. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  414. var mater = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == reqDto.MatCode).First();
  415. if (mater == null)
  416. {
  417. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  418. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + reqDto.MatCode;
  419. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription() + ",物料编码:" + reqDto.MatCode, Time = DateTime.Now });
  420. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  421. return res;
  422. }
  423. var Winding = "";
  424. if (reqDto.SpoolCode.EndsWith("R"))
  425. {
  426. Winding = "R";
  427. }
  428. else
  429. {
  430. Winding = "L";
  431. }
  432. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  433. if (barstock == null)
  434. {
  435. var barinfo = new BillInvinit()
  436. {
  437. InvBarCode = reqDto.MatBarCode,
  438. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  439. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  440. ExecDocsNo = reqDto.WorkOrder,
  441. ExecDocsRowNo = reqDto.MatBarCode,
  442. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  443. InvInOut = InvInOutType.In,
  444. ExecWho = "MES",
  445. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  446. InDocsNo = reqDto.WorkOrder,
  447. InDocsRowNo = reqDto.MatBarCode,
  448. SuppCode = "",
  449. BomDocsNo = "",
  450. BomSetId = 0,
  451. SetGrpCode = "",
  452. BomMatCode = "",
  453. BomMatId = 0,
  454. BomMatName = "",
  455. MatId = mater.Id,
  456. MatCode = mater.Code,
  457. MatName = mater.Name,
  458. LengthQty = reqDto.Length,
  459. TareWQty = reqDto.Weight,
  460. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  461. RFIDBarCode = "",
  462. ProductMachCode = reqDto.WbCode,
  463. Grade = reqDto.Grade,
  464. HWBarCode = reqDto.SpoolCode,
  465. HWTypeCode = mater.SpoolCode, //BS80 大轮子 货物类型1
  466. ContGrpBarCode = reqDto.SpoolCode,
  467. ContGrpId = IdFactory.NewId(),
  468. IsFast = false,
  469. IsRework = reqDto.IsRework,
  470. CLBarCode = reqDto.MatBarCode,
  471. Size = 1,
  472. BackReason = "",
  473. IsBack = reqDto.IsBlack,
  474. IsCore = reqDto.IsCore,
  475. SolderCount = (int)reqDto.SolderCount,
  476. IsTorsChk = reqDto.IsTorsChk,
  477. WbGroupCode = reqDto.WbGroupCode,
  478. IsControlpanel = reqDto.IsControl,
  479. HoldTime = reqDto.HoldDuration,
  480. Wind = Winding,
  481. BatchNo = reqDto.Batch
  482. //IsMulti = reqDto.IsMulti
  483. };
  484. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  485. {
  486. barinfo.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  487. }
  488. _billInvinitrepository.Insert(barinfo);
  489. }
  490. else
  491. {
  492. }
  493. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  494. if (stock == null)
  495. {
  496. var inv = new BillInvnow()
  497. {
  498. InvBarCode = reqDto.MatBarCode,
  499. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  500. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  501. ExecDocsNo = reqDto.WorkOrder,
  502. ExecDocsRowNo = reqDto.MatBarCode,
  503. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  504. InvInOut = InvInOutType.In,
  505. ExecWho = "MES",
  506. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  507. InDocsNo = reqDto.WorkOrder,
  508. SuppCode = "",
  509. BomDocsNo = "",
  510. BomSetId = 0,
  511. SetGrpCode = "",
  512. BomMatCode = "",
  513. BomMatId = 0,
  514. BomMatName = "",
  515. MatId = mater.Id,
  516. MatCode = mater.Code,
  517. MatName = mater.Name,
  518. LengthQty = reqDto.Length,
  519. TareWQty = reqDto.Weight,
  520. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  521. RFIDBarCode = "",
  522. ProductMachCode = reqDto.WbCode,
  523. Grade = reqDto.Grade,
  524. HWBarCode = reqDto.SpoolCode,
  525. HWTypeCode = mater.SpoolCode,
  526. ContGrpBarCode = reqDto.SpoolCode,
  527. ContGrpId = IdFactory.NewId(),
  528. IsFast = false,
  529. IsRework = reqDto.IsRework,
  530. CLBarCode = reqDto.MatBarCode,
  531. ContGrpType = ContGrpType.Material,
  532. Size = 1,
  533. BackReason = "",
  534. IsBlack = reqDto.IsBlack,
  535. IsCore = reqDto.IsCore,
  536. WbGroupCode = reqDto.WbGroupCode,
  537. IsTorsChk = reqDto.IsTorsChk,
  538. IsControlpanel = reqDto.IsControl,
  539. HoldTime = reqDto.HoldDuration,
  540. SolderCount = reqDto.SolderCount,
  541. Wind = Winding,
  542. BatchNo = reqDto.Batch
  543. //IsMulti = reqDto.IsMulti
  544. };
  545. if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  546. {
  547. inv.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  548. }
  549. if (!string.IsNullOrEmpty(reqDto.OvcValue))//已经扭转过的
  550. {
  551. inv.TorsChkValue = decimal.Parse(reqDto.OvcValue);
  552. inv.Memo = "接收数据含有扭转值";
  553. inv.Ovced = 1;
  554. inv.TorsChkQty = 1;
  555. }
  556. _billInvnowrepository.Insert(inv);
  557. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  558. }
  559. else
  560. {
  561. if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  562. {
  563. //if (!string.IsNullOrEmpty(reqDto.ReAutoPackFlag))
  564. //{
  565. // stoc.IsMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  566. //}
  567. bool isMulti = reqDto.ReAutoPackFlag == "1" ? true : false;
  568. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  569. {
  570. IsBlack = reqDto.IsBlack,
  571. IsCore = reqDto.IsCore,
  572. WbGroupCode = reqDto.WbGroupCode,
  573. IsTorsChk = reqDto.IsTorsChk,
  574. IsControlpanel = reqDto.IsControl,
  575. HoldTime = reqDto.HoldDuration,
  576. SolderCount = reqDto.SolderCount,
  577. IsRework = reqDto.IsRework,
  578. CLBarCode = reqDto.MatBarCode,
  579. MatCode = mater.Code,
  580. MatName = mater.Name,
  581. LengthQty = reqDto.Length,
  582. TareWQty = reqDto.Weight,
  583. ProductTime = DateTime.ParseExact(reqDto.ProductDate, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture),
  584. RFIDBarCode = "",
  585. ProductMachCode = reqDto.WbCode,
  586. Grade = reqDto.Grade,
  587. InDocsNo = reqDto.WorkOrder,
  588. Wind = Winding,
  589. EditTime = DateTime.Now,
  590. IsMulti = isMulti
  591. }, p => p.ContGrpBarCode == reqDto.SpoolCode && p.Id == stock.Id);
  592. }
  593. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  594. {
  595. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  596. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  597. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription(), Time = DateTime.Now });
  598. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  599. return res;
  600. }
  601. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  602. {
  603. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  604. res.ResMsg = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  605. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成", Time = DateTime.Now });
  606. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  607. return res;
  608. }
  609. }
  610. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  611. if (task != null && task.Type == TaskType.OutDepot)
  612. {
  613. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  614. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  615. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务", Time = DateTime.Now });
  616. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  617. return res;
  618. }
  619. if (task != null)
  620. {
  621. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  622. res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  623. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription(), Time = DateTime.Now });
  624. return res;
  625. }
  626. var wcs = new WCS_TaskInfo()
  627. {
  628. Status = TaskStatus.NewBuild,
  629. Type = TaskType.EnterDepot,
  630. Priority = 0,
  631. Device = "",
  632. SrmStation = "",
  633. AddrFrom = "root",
  634. BarCode = reqDto.SpoolCode,
  635. AddWho = "wms",
  636. EditWho = "wms",
  637. WarehouseCode = wareHosue.Code,
  638. AddrTo = "",
  639. Tunnel = "",
  640. MaterialCode = mater.Code,
  641. MatCode = mater.Code,
  642. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  643. Floor = 0,
  644. Grade = reqDto.Grade,
  645. Length = reqDto.Length,
  646. WorkBench = reqDto.WbCode,
  647. WorkOrder = reqDto.WorkOrder
  648. };
  649. _db.BeginTran();
  650. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  651. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  652. var wcsdtl = new WCS_TaskDtl()
  653. {
  654. ID = Guid.NewGuid(),
  655. CurPoint = reqDto.SpoolCode,
  656. AddTime = DateTime.Now,
  657. AddWho = "wms",
  658. Enabled = true,
  659. ParentTaskCode = wcstask.ID,
  660. Desc = wcstask.BusType
  661. };
  662. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  663. _db.CommitTran();
  664. }
  665. catch (Exception ex)
  666. {
  667. _db.RollbackTran();
  668. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  669. res.ResMsg = ex.Message;
  670. InsertErrorinfo(reqDto.SpoolCode, "帘线下线异常|" + res.ResMsg + "自动排出" + DateTime.Now);
  671. //RedisHelper.Set("Sx:WMSErrorInfo:MESEquip1", new RedisErrorInfo() { Equip = "MESEquip1", Con = reqDto.SpoolCode + ex.Message, Time = DateTime.Now });
  672. }
  673. return res;
  674. }
  675. /// <summary>
  676. /// 关闭工单
  677. /// </summary>
  678. /// <returns></returns>
  679. public SRes CloseWorkOrder(CloseWorkOrderRequest reqDto)
  680. {
  681. var res = new SRes();
  682. try
  683. {
  684. foreach (var item in reqDto.listinfo)
  685. {
  686. var boxrule = _boxrulerepository.AsQueryable().Where(x => x.DocsNo.Contains(item)).ToList();
  687. var boxruleId = boxrule.Where(x => x.ZXStateCode == 0).Select(x => x.Id).ToList();
  688. if (boxruleId.Any())
  689. {
  690. _db.BeginTran();
  691. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  692. {
  693. ZXStateCode = 2,
  694. Memo = "工单终止,自动停用"
  695. }, x => boxruleId.Contains(x.Id) && x.ZXStateCode == 0);
  696. _db.CommitTran();
  697. }
  698. }
  699. }
  700. catch (Exception e)
  701. {
  702. _db.RollbackTran();
  703. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  704. res.ResMsg = e.Message;
  705. return res;
  706. }
  707. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  708. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  709. return res;
  710. }
  711. /// <summary>
  712. /// 同步箱号状态
  713. /// </summary>
  714. /// <param name="reqDto"></param>
  715. /// <returns></returns>
  716. public SRes SynchronizeBoxStatus(SynchronizeBoxStatusRequest reqDto)
  717. {
  718. var res = new SRes();
  719. try
  720. {
  721. var boxrule = _boxrulerepository.AsQueryable().First(x => x.PBoxCode == reqDto.HuNr && x.ZXStateCode == 0);
  722. if (boxrule != null)
  723. {
  724. _db.BeginTran();
  725. var result = _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  726. {
  727. ZXStateCode = 2,
  728. Memo = "MES通知停用此箱号"
  729. }, x => boxrule.Id == x.Id && x.ZXStateCode == 0);
  730. if (!result)
  731. {
  732. _db.RollbackTran();
  733. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  734. res.ResMsg = "箱号正在使用";
  735. return res;
  736. }
  737. _db.CommitTran();
  738. }
  739. }
  740. catch (Exception e)
  741. {
  742. _db.RollbackTran();
  743. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  744. res.ResMsg = e.Message;
  745. return res;
  746. }
  747. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  748. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  749. return res;
  750. }
  751. /// <summary>
  752. /// 扭转出库申请
  753. /// </summary>
  754. /// <param name="request"></param>
  755. /// <returns></returns>
  756. public SRes TorsChkStockOut(TorsChkStockOutRequest request)
  757. {
  758. var res = new SRes();
  759. try
  760. {
  761. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  762. 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
  763. && !p.ProductMachCode.Contains("R") && p.Grade == "A")
  764. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  765. select new
  766. {
  767. stock.MatCode,
  768. stock.InvBarCode,
  769. stock.Grade,
  770. stock.InvStateCode,
  771. stock.ProductTime,
  772. stock.SkuCode,
  773. stock.WbGroupCode,
  774. stock.IsTorsChk,
  775. stock.TorsChkQty,
  776. stock.TorsChkValue,
  777. stock.HoldTime,
  778. stock.ProductMachCode,
  779. stock.HWTypeCode,
  780. loc.Col,
  781. loc.Layer,
  782. loc.Shelf,
  783. loc.Depth,
  784. loc.Code,
  785. loc.Tunnel,
  786. loc.SCRel,
  787. loc.Floor,
  788. loc.WarehouseCode,
  789. loc.ContGrpBarCode,
  790. loc.Id,
  791. loc.StateNum,
  792. };
  793. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  794. if (tunlist.Any())
  795. {
  796. if (tunlist.Where(p => p.Default2 == "1").Any())
  797. {
  798. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  799. invlist = invlist.Except(inv).Distinct(); //过滤1层被禁用的出库巷道
  800. }
  801. if (tunlist.Where(p => p.Default2 == "2").Any())
  802. {
  803. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  804. invlist = invlist.Except(inv).Distinct(); //过滤2层被禁用的出库巷道
  805. }
  806. if (tunlist.Where(p => p.Default2 == "3").Any())
  807. {
  808. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  809. invlist = invlist.Except(inv).Distinct(); //过滤3层被禁用的出库巷道
  810. }
  811. }
  812. var TorschkDate = _sysconfigrepository.GetSingle(p => p.Code == "TorsChkDateCount");
  813. int srarthour = int.Parse(TorschkDate.Default2);
  814. int endhour = int.Parse(TorschkDate.Default3);
  815. //2025-01-02 客户要求所有未扭转在库内的工字轮都要扭转
  816. //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);
  817. if (!invlist.Any())
  818. {
  819. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip1", new RedisErrorInfo() { Equip = "TorsChkEquip1", Con = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮", Time = DateTime.Now });
  820. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  821. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有需要扭转检测的工字轮";
  822. return res;
  823. }
  824. var startTime = DateTime.Now.Date.AddDays(-1).AddMilliseconds(-1);
  825. invlist = invlist.Where(x => x.ProductTime <= startTime).ToList().OrderBy(p => p.Depth).ThenByDescending(p => p.ProductTime.Day);
  826. var tasklist = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription() && p.Type == TaskType.OutDepot).ToList();
  827. var torTaskCount = _sysconfigrepository.GetFirst(p => p.Code == "TorTaskCount").SContent;
  828. if (tasklist.Any() && tasklist.Count > int.Parse(torTaskCount))
  829. {
  830. res.ResMsg = "任务已经超最大数量";
  831. return res;
  832. }
  833. //var taskcount = (from task in tasklist.GroupBy(p => p.Floor)
  834. // select new FloorCountTemp
  835. // {
  836. // Floor = task.Key,//楼层的任务数量
  837. // Count = task.Count()
  838. // }).ToList();
  839. #region 按照堆垛机平均分配任务
  840. var tempcount = 12;//还可以创建的任务数量
  841. var mastinvlist = tasklist.Where(p => p.Status < TaskStatus.StackerCompleted);
  842. var tempinvlist = invlist;
  843. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  844. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.Device)
  845. select new SrmTaskTmep
  846. {
  847. Srm = x.Key,
  848. TaskCount = x.Count(),
  849. LocList = x.Select(q => q.AddrFrom).ToList()
  850. };
  851. var srmtasktobe = new List<SrmTaskTmep>();
  852. foreach (var srmlistitem in srmlist)
  853. {
  854. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  855. {
  856. srmtasktobe.Add(new SrmTaskTmep()
  857. {
  858. Srm = srmlistitem,
  859. TaskCount = 0,
  860. LocList = new List<string>()
  861. });
  862. }
  863. }
  864. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量
  865. var srmtasktobetemplocs = new List<string>();
  866. for (int i = 0; i < tempcount; i++)
  867. {
  868. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  869. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  870. foreach (var srmtasktobeitem in srmtasktobe)
  871. {
  872. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  873. {
  874. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  875. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  876. srmtasktobetemplocs.Add(first.Code);
  877. break;
  878. }
  879. }
  880. }
  881. #endregion 按照堆垛机平均分配任务
  882. invlist = invlist.Where(p => srmtasktobetemplocs.Contains(p.Code));
  883. //for (int floor = 1; floor <= 3; floor++)
  884. //{
  885. int pp = 0;
  886. //invlist = invlist.Where(p => p.Floor == floor);
  887. foreach (var item in invlist)
  888. {
  889. if (item.TorsChkValue != null)
  890. {
  891. continue;
  892. }
  893. //if (pp == 4)
  894. //{
  895. // break;
  896. //}
  897. var time1 = item.HoldTime + decimal.Parse(TorschkDate.SContent); //时效上限
  898. var time2 = item.HoldTime - decimal.Parse(TorschkDate.Default1); //时效下限
  899. //|| (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > 72 && decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > item.HoldTime)
  900. //if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) >= time2) //按小时判断是否扭转的方式应客户要求停用-2024-12-24
  901. if (item.ProductTime <= startTime) //时间在此范围即可流转,例:3号标记的检测盘(00:00到23:59之间),5号全部出库进行检测(7点开始出
  902. {
  903. var inv = _billInvnowrepository.GetSingle(p =>
  904. p.ContGrpBarCode == item.ContGrpBarCode &&
  905. p.InvStateCode == InvState.InvEcecState_In.ToString());
  906. if (inv == null)
  907. {
  908. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  909. new RedisErrorInfo
  910. {
  911. Equip = "TorsChkEquip2",
  912. Con = item.ContGrpBarCode +
  913. ResponseStatusCodeEnum.StockNotExist.GetDescription(),
  914. Time = DateTime.Now
  915. });
  916. continue;
  917. }
  918. if (item.Depth == 2)
  919. {
  920. var taskold = _wcstaskoldrepository.AsQueryable()
  921. .Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish)
  922. .SplitTable(p => p.Take(2)).First();
  923. if (taskold != null)
  924. {
  925. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  926. new RedisErrorInfo
  927. {
  928. Equip = "TorsChkEquip2",
  929. Con = item.ContGrpBarCode +
  930. ResponseStatusCodeEnum.StockNotExist.GetDescription(),
  931. Time = DateTime.Now
  932. });
  933. continue;
  934. }
  935. var respon = MoveTask(item.Code);
  936. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1") continue;
  937. }
  938. else
  939. {
  940. //判断存不存在任务
  941. var taskoldexist = _wcstaskoldrepository.AsQueryable()
  942. .Where(p => p.BarCode == item.ContGrpBarCode && p.Status < TaskStatus.Finish)
  943. .SplitTable(p => p.Take(2)).First();
  944. if (taskoldexist != null)
  945. {
  946. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2",
  947. new RedisErrorInfo
  948. {
  949. Equip = "TorsChkEquip2",
  950. Con = item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务",
  951. Time = DateTime.Now
  952. });
  953. _logger.LogInformation(item.ContGrpBarCode + "已经存在任务,不能再创建扭转出库任务");
  954. continue;
  955. }
  956. }
  957. var wcs = new WCS_TaskInfo
  958. {
  959. Status = TaskStatus.NewBuild,
  960. Type = TaskType.OutDepot,
  961. Priority = 0,
  962. Device = item.SCRel,
  963. SrmStation = item.SCRel,
  964. AddrFrom = item.Code,
  965. BarCode = inv.ContGrpBarCode,
  966. AddWho = "wms",
  967. EditWho = "wms",
  968. WarehouseCode = item.WarehouseCode,
  969. AddrTo = "",
  970. Tunnel = item.Tunnel.ToString(),
  971. MaterialCode = item.MatCode,
  972. MatCode = item.MatCode,
  973. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription(),
  974. Floor = item.Floor,
  975. Grade = item.Grade,
  976. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2
  977. };
  978. _db.BeginTran();
  979. if (decimal.Parse((DateTime.Now - item.ProductTime).TotalHours.ToString("f2")) > time1)
  980. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  981. {
  982. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  983. //ContUsageQty = 2, //扭转超时异常盘,2024-11-29客户要求不再更新异常
  984. EditTime = DateTime.Now
  985. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  986. else
  987. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  988. {
  989. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  990. EditTime = DateTime.Now
  991. }, p => p.ContGrpBarCode == inv.ContGrpBarCode);
  992. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell
  993. {
  994. StateNum = LocationState.LocationState_StockOut,
  995. EditTime = DateTime.Now
  996. }, p => p.Code == item.Code);
  997. var flow = _mapper.Map<BillInvflow>(inv);
  998. flow.Id = GetId();
  999. flow.AddTime = DateTime.Now;
  1000. flow.EditTime = DateTime.Now;
  1001. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  1002. flow.Memo = "扭转出库";
  1003. _billInvflow.Insert(flow);
  1004. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  1005. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  1006. var wcsdtl = new WCS_TaskDtl
  1007. {
  1008. ID = Guid.NewGuid(),
  1009. CurPoint = wcstask.AddrFrom,
  1010. AddTime = DateTime.Now,
  1011. AddWho = "wms",
  1012. Enabled = true,
  1013. ParentTaskCode = wcstask.ID,
  1014. Desc = wcstask.BusType
  1015. };
  1016. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  1017. _db.CommitTran();
  1018. //return res;
  1019. pp++;
  1020. }
  1021. }
  1022. //}
  1023. }
  1024. catch (Exception ex)
  1025. {
  1026. _db.RollbackTran();
  1027. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1028. res.ResMsg = ResponseStatusCodeEnum.InnerServerErr.GetDescription() + ex.Message;
  1029. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip2", new RedisErrorInfo() { Equip = "TorsChkEquip2", Con = ex.Message, Time = DateTime.Now });
  1030. return res;
  1031. }
  1032. return res;
  1033. }
  1034. public SRes<int> TorsChkComplete(TorsChkCompleteRequest request)
  1035. {
  1036. var res = new SRes<int>();
  1037. try
  1038. {
  1039. if (string.IsNullOrEmpty(request.TaskNo))
  1040. {
  1041. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  1042. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  1043. return res;
  1044. }
  1045. var ware = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  1046. if (ware == null)
  1047. {
  1048. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  1049. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  1050. return res;
  1051. }
  1052. 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();
  1053. if (task == null)
  1054. {
  1055. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1056. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  1057. return res;
  1058. }
  1059. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() && p.IsTorsChk == true && p.TorsChkQty > 0);
  1060. if (stock == null)
  1061. {
  1062. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1063. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  1064. return res;
  1065. }
  1066. _db.BeginTran();
  1067. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  1068. var flow = _mapper.Map<BillInvflow>(stock);
  1069. flow.Id = GetId();
  1070. flow.AddTime = DateTime.Now;
  1071. flow.EditTime = DateTime.Now;
  1072. flow.Memo = "扭转出库任务完成";
  1073. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1074. _billInvflow.Insert(flow);
  1075. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  1076. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  1077. {
  1078. Status = TaskStatus.Finish,
  1079. EditTime = DateTime.Now,
  1080. ManualRemarks = "扭转完成"
  1081. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  1082. var wcsdtl = new WCS_TaskDtl()
  1083. {
  1084. ID = Guid.NewGuid(),
  1085. CurPoint = stock.TorsChkMachCode,
  1086. AddTime = DateTime.Now,
  1087. AddWho = "wms",
  1088. Enabled = true,
  1089. ParentTaskCode = task.Id,
  1090. Desc = "扭转完成"
  1091. };
  1092. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  1093. var inv = stock;
  1094. inv.Id = GetId();
  1095. inv.ContGrpId = GetId();
  1096. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  1097. inv.Memo = "扭转回库";
  1098. _billInvnowrepository.Insert(inv);
  1099. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  1100. var wcs = new WCS_TaskInfo()
  1101. {
  1102. Status = TaskStatus.NewBuild,
  1103. Type = TaskType.EnterDepot,
  1104. Priority = 0,
  1105. Device = "",
  1106. SrmStation = "",
  1107. AddrFrom = inv.TorsChkMachCode,
  1108. BarCode = stock.ContGrpBarCode,
  1109. AddWho = "wms",
  1110. EditWho = "wms",
  1111. WarehouseCode = ware.Code,
  1112. AddrTo = "",
  1113. Tunnel = "",
  1114. MaterialCode = inv.MatCode,
  1115. MatCode = inv.MatCode,
  1116. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  1117. Grade = inv.Grade
  1118. };
  1119. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  1120. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  1121. var wcsdtls = new WCS_TaskDtl()
  1122. {
  1123. ID = Guid.NewGuid(),
  1124. CurPoint = wcstask.AddrFrom,
  1125. AddTime = DateTime.Now,
  1126. AddWho = "wms",
  1127. Enabled = true,
  1128. ParentTaskCode = wcstask.ID,
  1129. Desc = wcstask.BusType
  1130. };
  1131. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  1132. res.ResData = wcstask.ID;
  1133. _db.CommitTran();
  1134. }
  1135. catch (Exception ex)
  1136. {
  1137. _db.RollbackTran();
  1138. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1139. res.ResMsg = ex.Message;
  1140. return res;
  1141. }
  1142. return res;
  1143. }
  1144. private long GetId()
  1145. {
  1146. return IdFactory.NewId();
  1147. }
  1148. /// <summary>
  1149. /// sku信息传输
  1150. /// </summary>
  1151. /// <param name="reqDto"></param>
  1152. /// <returns></returns>
  1153. public SRes SKUInfoTrans(SKUInfoTransRequest reqDto)
  1154. {
  1155. var res = new SRes();
  1156. foreach (var item in reqDto.ListInfo)
  1157. {
  1158. var model = _skuInforepository.GetSingle(p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1159. if (model == null)
  1160. {
  1161. _skuInforepository.Insert(new BillSkuInfo()
  1162. {
  1163. SkuCode = reqDto.SkuCode,
  1164. TypeCode = item.TypeCode,
  1165. TypeName = item.TypeName,
  1166. FieldCode = item.FieldCode,
  1167. FieldName = item.FieldName,
  1168. FieldUnit = item.FieldUnit,
  1169. FieldValue = item.FieldValue
  1170. });
  1171. }
  1172. else
  1173. {
  1174. //if (model.FieldCode == "QC_B02" || model.FieldCode == "QC_B03")
  1175. //{
  1176. _skuInforepository.UpdateSetColumnsTrue(p => new BillSkuInfo()
  1177. {
  1178. //TypeCode = item.TypeCode,
  1179. //TypeName = item.TypeName,
  1180. //FieldCode = item.FieldCode,
  1181. //FieldName = item.FieldName,
  1182. FieldUnit = item.FieldUnit,
  1183. FieldValue = item.FieldValue,
  1184. EditTime = DateTime.Now
  1185. }, p => p.SkuCode == reqDto.SkuCode && p.FieldCode == item.FieldCode);
  1186. //}
  1187. }
  1188. }
  1189. return res;
  1190. }
  1191. /// <summary>
  1192. /// 包装信息传输
  1193. /// </summary>
  1194. /// <param name="reqDto"></param>
  1195. /// <returns></returns>
  1196. public SRes PackInfoTrans(PackInfoTrans reqDto)
  1197. {
  1198. var res = new SRes();
  1199. foreach (var item in reqDto.ListInfo)
  1200. {
  1201. var model = _packInforepository.GetSingle(p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1202. if (model == null)
  1203. {
  1204. _packInforepository.Insert(new BillPackInfo()
  1205. {
  1206. PackCode = reqDto.PackCode,
  1207. MatCode = item.MatCode,
  1208. MatName = item.MatName,
  1209. Count = item.Count,
  1210. UnitName = item.UnitName,
  1211. Weight = item.Weight,
  1212. PackDesc = reqDto.PackDesc,
  1213. PackMethodCode = reqDto.PackMethodCode,
  1214. PackMethod = reqDto.PackMethod,
  1215. EmptySpoolNum = reqDto.EmptySpoolNum,
  1216. Spool = reqDto.Spool,
  1217. SpoolNum = reqDto.SpoolNum,
  1218. LayersSpoolNum = reqDto.LayersSpoolNum,
  1219. LayersNum = reqDto.LayersNum,
  1220. AddWho = "MES",
  1221. EditWho = ""
  1222. });
  1223. }
  1224. else
  1225. {
  1226. _packInforepository.UpdateSetColumnsTrue(p => new BillPackInfo()
  1227. {
  1228. Count = item.Count,
  1229. UnitName = item.UnitName,
  1230. Weight = item.Weight,
  1231. PackDesc = reqDto.PackDesc,
  1232. PackMethodCode = reqDto.PackMethodCode,
  1233. PackMethod = reqDto.PackMethod,
  1234. EmptySpoolNum = reqDto.EmptySpoolNum,
  1235. Spool = reqDto.Spool,
  1236. SpoolNum = reqDto.SpoolNum,
  1237. LayersSpoolNum = reqDto.LayersSpoolNum,
  1238. LayersNum = reqDto.LayersNum,
  1239. EditWho = "MES"
  1240. }, p => p.PackCode == reqDto.PackCode && p.MatCode == item.MatCode);
  1241. }
  1242. }
  1243. return res;
  1244. }
  1245. /// <summary>
  1246. /// 异常信息通用方法
  1247. /// </summary>
  1248. /// <param name="Code"></param>
  1249. /// <param name="Message"></param>
  1250. /// <returns></returns>
  1251. private SRes InsertErrorinfo(string Code, string Message)
  1252. {
  1253. var res = new SRes();
  1254. var error = new BaseErrorinfo()
  1255. {
  1256. ContBarCode = Code,
  1257. Message = Message,
  1258. AddWho = "",
  1259. EditWho = "",
  1260. Count = 1
  1261. };
  1262. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == Code && p.Message == Message);
  1263. if (errorinfo != null)
  1264. {
  1265. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  1266. {
  1267. Count = errorinfo.Count + 1
  1268. }, p => p.ContBarCode == errorinfo.ContBarCode);
  1269. }
  1270. else
  1271. {
  1272. _errorinforepository.Insert(error);
  1273. }
  1274. return res;
  1275. }
  1276. /// <summary>
  1277. /// 分配楼层
  1278. /// </summary>
  1279. /// <param name="reqDto"></param>
  1280. /// <returns></returns>
  1281. public SRes<ApplyFloorResponse> ApplyFloor(ApplyFloorRequest reqDto)
  1282. {
  1283. var time = new Stopwatch();
  1284. time.Restart();
  1285. var result = new SRes<ApplyFloorResponse>()
  1286. {
  1287. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  1288. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  1289. ResData = new ApplyFloorResponse(),
  1290. };
  1291. if (!Const.SxFloorEquip.Contains(reqDto.EquNo))
  1292. {
  1293. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1294. result.ResMsg = reqDto.EquNo + "没有当前扫码设备";
  1295. InsertErrorinfo(reqDto.Code, "异常口:" + result.ResMsg + "自动排出" + DateTime.Now);
  1296. return result;
  1297. }
  1298. //C质量异常排出处理
  1299. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  1300. if (stock == null)
  1301. {
  1302. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1303. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  1304. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  1305. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1306. return result;
  1307. }
  1308. else
  1309. {
  1310. if (stock.Grade == "C" || stock.Grade == "D" || stock.Grade == "B")
  1311. {
  1312. try
  1313. {
  1314. _db.BeginTran();
  1315. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1316. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1317. var flow = _mapper.Map<BillInvflow>(stock);
  1318. flow.Id = GetId();
  1319. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1320. flow.AddTime = DateTime.Now;
  1321. flow.EditTime = DateTime.Now;
  1322. flow.Memo = "BCD质量异常排出";
  1323. _billInvflow.Insert(flow);
  1324. _db.CommitTran();
  1325. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1326. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1327. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1328. return result;
  1329. }
  1330. catch (Exception ex)
  1331. {
  1332. _db.RollbackTran();
  1333. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1334. result.ResMsg = reqDto.Code + "当前BCD质量工字轮不允许入库";
  1335. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1336. return result;
  1337. }
  1338. }
  1339. }
  1340. //由于重绕盘间隔时间太长,所以查当前任务表
  1341. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(3)).First();
  1342. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqDto.Code && p.Status < TaskStatus.Finish).First();
  1343. if (wcstask == null)
  1344. {
  1345. try
  1346. {
  1347. _db.BeginTran();
  1348. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1349. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1350. if (stocks != null)
  1351. {
  1352. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1353. var flow = _mapper.Map<BillInvflow>(stocks);
  1354. flow.Id = GetId();
  1355. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1356. flow.AddTime = DateTime.Now;
  1357. flow.EditTime = DateTime.Now;
  1358. flow.Memo = "任务异常排出";
  1359. _billInvflow.Insert(flow);
  1360. }
  1361. _db.CommitTran();
  1362. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1363. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1364. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1365. return result;
  1366. }
  1367. catch (Exception ex)
  1368. {
  1369. _db.RollbackTran();
  1370. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1371. result.ResMsg = reqDto.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1372. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1373. return result;
  1374. }
  1375. }
  1376. if (wcstask.Type != TaskType.EnterDepot)
  1377. {
  1378. _billInvinitrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1379. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.Code);
  1380. if (stocks != null)
  1381. {
  1382. _billInvnowrepository.Delete(p => p.ContGrpBarCode == reqDto.Code);
  1383. var flow = _mapper.Map<BillInvflow>(stocks);
  1384. flow.Id = GetId();
  1385. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  1386. flow.AddTime = DateTime.Now;
  1387. flow.EditTime = DateTime.Now;
  1388. flow.Memo = "任务异常排出";
  1389. _billInvflow.Insert(flow);
  1390. }
  1391. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1392. result.ResMsg = reqDto.Code + "不是入库任务,不允许分配楼层";
  1393. InsertErrorinfo(reqDto.Code, "异常口:" + reqDto.EquNo + "|" + result.ResMsg + "自动排出" + DateTime.Now);
  1394. return result;
  1395. }
  1396. result.ResData.TaskNo = wcstask.ID;
  1397. if (stock.HWTypeCode == "BS60" || stock.HWTypeCode == "BS40")
  1398. {
  1399. result.Memo1 = "1";
  1400. }
  1401. else
  1402. {
  1403. result.Memo1 = "2";
  1404. }
  1405. 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();
  1406. //去掉禁用巷道
  1407. List<int> distuns = new List<int>();
  1408. var time1 = new Stopwatch();
  1409. time1.Restart();
  1410. var time2 = new Stopwatch();
  1411. time2.Restart();
  1412. // 提前查询并返回符合条件的 cell 列表
  1413. var cellQuery = _basewarecellrepository.AsQueryable()
  1414. .With(SqlWith.NoLock)
  1415. .Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty); ;
  1416. var cell = new List<BaseWarecell>();
  1417. // 获取禁用的巷道信息
  1418. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  1419. if (disabletunnels != null && disabletunnels.Any())
  1420. {
  1421. foreach (var item in disabletunnels)
  1422. {
  1423. var distun = int.Parse(item.Default1);
  1424. var disfloor = int.Parse(item.Default2);
  1425. cellQuery.Where(x => !(x.Tunnel == distun && x.Floor == disfloor));
  1426. }
  1427. // 执行查询,获取最终的 cell 列表
  1428. cell = cellQuery.Clone().ToList();
  1429. }
  1430. else cell = cellQuery.ToList();
  1431. time2.Stop();
  1432. bool isTobeTors = false;
  1433. int tun = 2;
  1434. int row = 8;
  1435. if (stock.IsTorsChk == true && stock.IsControlpanel == true && stock.TorsChkQty <= 0 && stock.Ovced == 0)
  1436. {
  1437. isTobeTors = true;
  1438. }
  1439. #region 检测库存占比是否符合要求
  1440. if (isTobeTors)
  1441. {
  1442. //扭转检测库存最大比
  1443. var torsInventoryRate = _sysconfigrepository.GetFirst(p => p.Code == "TorsInventoryRate").SContent;
  1444. var torsInventoryRateValue = decimal.Parse(torsInventoryRate) / 100;
  1445. //计算已使用货位占比
  1446. decimal cellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Tunnel <= 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()).Count();
  1447. decimal fullCellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock)
  1448. .Where(p => p.Tunnel <= 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()
  1449. && p.StateNum != LocationState.LocationState_Empty).Count(); //所有不是空的货位都算作满货位
  1450. var fullCellRate = fullCellCount / cellCount;
  1451. if (fullCellRate >= torsInventoryRateValue)
  1452. {
  1453. result.ResData.TaskNo = 0;
  1454. result.ResMsg = reqDto.Code + $"扭转库存占比已达{ToPercentage(fullCellRate)},根据系统配置开始禁止入库";
  1455. return result;
  1456. }
  1457. }
  1458. else
  1459. {
  1460. //码垛库存最大比
  1461. var palletizingInventoryRate = _sysconfigrepository.GetFirst(p => p.Code == "PalletizingInventoryRate").SContent;
  1462. var palletizingInventoryRateValue = decimal.Parse(palletizingInventoryRate) / 100;
  1463. //计算已使用货位占比
  1464. decimal cellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Tunnel > 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()).Count();
  1465. decimal fullCellCount = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock)
  1466. .Where(p => p.Tunnel > 2 && p.IsStop == LocationStop.LocationInvoke.GetHashCode()
  1467. && p.StateNum != LocationState.LocationState_Empty).Count(); //所有不是空的货位都算作满货位
  1468. var fullCellRate = fullCellCount / cellCount;
  1469. if (fullCellRate >= palletizingInventoryRateValue)
  1470. {
  1471. result.ResData.TaskNo = 0;
  1472. result.ResMsg = reqDto.Code + $"码垛库存占比已达{ToPercentage(fullCellRate)},根据系统配置开始禁止入库";
  1473. return result;
  1474. }
  1475. }
  1476. #endregion 检测库存占比是否符合要求
  1477. // 最小有效货位数量,用于保留移库
  1478. const int MinAvailableCells = 30;
  1479. var forbidLayer = wms.util.AppSettings.GetConfig("ForbidLayer");
  1480. // 定义楼层信息结构
  1481. var floors = Enumerable.Range(1, 3).Select(floorNumber =>
  1482. {
  1483. // 获取货位数
  1484. var cellQuery = cell.Where(p => p.Floor == floorNumber);
  1485. var cellCount = isTobeTors ? cellQuery.Count(p => p.Tunnel <= tun) : cellQuery.Count(p => p.Tunnel > tun);
  1486. if (!string.IsNullOrEmpty(forbidLayer) && forbidLayer.Contains(floorNumber.ToString())) cellCount = 0;
  1487. // 获取同规格库存数
  1488. var (minLayer, maxLayer) = floorNumber switch
  1489. {
  1490. 1 => (1, 4),
  1491. 2 => (5, 8),
  1492. 3 => (9, 12),
  1493. _ => (0, 0)
  1494. };
  1495. var stockQuery = existstock.Where(p => p.PutLayer >= minLayer && p.PutLayer <= maxLayer && (isTobeTors ? p.PutRow <= row : p.PutRow > row));
  1496. // 计算库存比率
  1497. var stockRatio = cellCount > 0 ? stockQuery.Count() / (double)cellCount : 0;
  1498. // 获取任务限制数
  1499. var taskLimit = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == $"FloorTaskCount{floorNumber}").SContent);
  1500. return new
  1501. {
  1502. Floor = floorNumber,
  1503. CellCount = cellCount,
  1504. StockRatio = stockRatio,
  1505. TaskLimit = taskLimit
  1506. };
  1507. })
  1508. // 排序:库存比例低优先 > 货位数高优先
  1509. .OrderBy(f => f.StockRatio)
  1510. .ThenByDescending(f => f.CellCount)
  1511. .ToList();
  1512. // 获取各楼层当前任务数
  1513. var floorTasks = _taskrepository.AsQueryable()
  1514. .Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.BusType == "帘线工字轮入库")
  1515. .ToList()
  1516. .GroupBy(p => p.Floor).ToDictionary(x => x.Key, x => x.Count());
  1517. var time10 = new Stopwatch();
  1518. time10.Restart();
  1519. // 选择楼层的策略
  1520. var selectedFloor = floors.FirstOrDefault(f =>
  1521. f.CellCount > MinAvailableCells &&
  1522. floorTasks.GetValueOrDefault(f.Floor, 0) < f.TaskLimit
  1523. );
  1524. // 次选策略:允许货位较少但未超限的楼层
  1525. selectedFloor ??= floors.FirstOrDefault(f =>
  1526. f.CellCount > 0 &&
  1527. floorTasks.GetValueOrDefault(f.Floor, 0) < f.TaskLimit
  1528. );
  1529. // 返回结果处理
  1530. if (selectedFloor != null)
  1531. {
  1532. result.ResData.Floor = selectedFloor.Floor;
  1533. }
  1534. else
  1535. {
  1536. result.ResData.TaskNo = 0;
  1537. result.ResMsg = $"{reqDto.Code} 所有楼层任务配额已满,当前各楼层任务数:" + string.Join("", floors.Select(f =>
  1538. $"{f.Floor}层({floorTasks.GetValueOrDefault(f.Floor)}/{f.TaskLimit}) "));
  1539. }
  1540. //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楼层可用的货位数
  1541. //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楼层可用的货位数
  1542. //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楼层可用的货位数
  1543. //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楼层同规格数量
  1544. //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楼层同规格数量
  1545. //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楼层同规格数量
  1546. //var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent);
  1547. //var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  1548. //if (!string.IsNullOrEmpty(forbidlayer))
  1549. //{
  1550. // if (forbidlayer.Contains("1")) cellfloor1count = 0;
  1551. // if (forbidlayer.Contains("2")) cellfloor2count = 0;
  1552. // if (forbidlayer.Contains("3")) cellfloor3count = 0;
  1553. //}
  1554. ////cellfloor2count = 0;//临时修改,限制楼层分配
  1555. //var tempcells = new List<Tuple<int, int, double, int>>() {
  1556. // new Tuple<int, int,double,int>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count*1.0),int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount1").SContent)),
  1557. // new Tuple<int, int,double,int>(2,cellfloor2count,cellfloor2stockcount / (cellfloor2count*1.0),int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount2").SContent)),
  1558. // new Tuple<int, int,double,int>(3,cellfloor3count,cellfloor3stockcount / (cellfloor3count*1.0),int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount3").SContent)),
  1559. //};
  1560. ////tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();//按照空位数排序
  1561. //tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  1562. ////每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  1563. //var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  1564. //var time10 = new Stopwatch();
  1565. //time10.Restart();
  1566. //if (tempcells[0].Item2 > 30)
  1567. //{
  1568. // if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > tempcells[0].Item4 || tempcells[0].Item2 == 0)
  1569. // {
  1570. // if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > tempcells[1].Item4 || tempcells[1].Item2 == 0)
  1571. // {
  1572. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > tempcells[2].Item4 || tempcells[2].Item2 == 0)
  1573. // {
  1574. // var it1 = taskcount.Where(p => p.Floor == tempcells[0].Item1).Count();
  1575. // var it2 = taskcount.Where(p => p.Floor == tempcells[1].Item1).Count();
  1576. // var it3 = taskcount.Where(p => p.Floor == tempcells[2].Item1).Count();
  1577. // result.ResData.TaskNo = 0;
  1578. // result.ResMsg = reqDto.Code + $"当前环线三个楼层执行中的任务数已满,不允许分配楼层1-{tempcells[0].Item1}:{it1}:{tempcells[0].Item2}--{tempcells[1].Item1}:{it2}:{tempcells[1].Item2}--{tempcells[2].Item1}:{it3}:{tempcells[2].Item2}";
  1579. // result.ResData.Floor = 0;
  1580. // return result;
  1581. // }
  1582. // else
  1583. // {
  1584. // result.ResData.Floor = tempcells[2].Item1;
  1585. // }
  1586. // }
  1587. // else
  1588. // {
  1589. // result.ResData.Floor = tempcells[1].Item1;
  1590. // }
  1591. // }
  1592. // else
  1593. // {
  1594. // result.ResData.Floor = tempcells[0].Item1;
  1595. // }
  1596. //}
  1597. //else
  1598. //{
  1599. // if (tempcells[1].Item2 > 30)
  1600. // {
  1601. // if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  1602. // {
  1603. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  1604. // {
  1605. // result.ResData.TaskNo = 0;
  1606. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层2";
  1607. // result.ResData.Floor = 0;
  1608. // return result;
  1609. // }
  1610. // else
  1611. // {
  1612. // result.ResData.Floor = tempcells[2].Item1;
  1613. // }
  1614. // }
  1615. // else
  1616. // {
  1617. // result.ResData.Floor = tempcells[1].Item1;
  1618. // }
  1619. // }
  1620. // else
  1621. // {
  1622. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  1623. // {
  1624. // result.ResData.Floor = tempcells[2].Item1;
  1625. // }
  1626. // else
  1627. // {
  1628. // result.ResData.TaskNo = 0;
  1629. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层3";
  1630. // result.ResData.Floor = 0;
  1631. // return result;
  1632. // }
  1633. // }
  1634. //}
  1635. time10.Stop();
  1636. time1.Stop();
  1637. time.Stop();
  1638. _logger.LogInformation($"ApplyFloor:{reqDto.Code}--总耗时{time.ElapsedMilliseconds}-可用楼层计算耗时{time1.ElapsedMilliseconds}-排除禁用巷道{time2.ElapsedMilliseconds}-计算目标楼层耗时{time2.ElapsedMilliseconds}");
  1639. #region 逻辑暂时不用(不换楼层优先)
  1640. //switch (reqDto.EquNo)
  1641. //{
  1642. // case "2134": //一号分层扫码器
  1643. // if (cellfloor1count > 30)
  1644. // {
  1645. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1646. // {
  1647. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1648. // {
  1649. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1650. // {
  1651. // result.ResData.TaskNo = 0;
  1652. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1653. // result.ResData.Floor = 0;
  1654. // return result;
  1655. // }
  1656. // else
  1657. // {
  1658. // result.ResData.Floor = 3;
  1659. // }
  1660. // }
  1661. // else
  1662. // {
  1663. // result.ResData.Floor = 2;
  1664. // }
  1665. // }
  1666. // else
  1667. // {
  1668. // result.ResData.Floor = 1;
  1669. // }
  1670. // }
  1671. // else
  1672. // {
  1673. // if (cellfloor2count > 30)
  1674. // {
  1675. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1676. // {
  1677. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1678. // {
  1679. // result.ResData.TaskNo = 0;
  1680. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1681. // result.ResData.Floor = 0;
  1682. // return result;
  1683. // }
  1684. // else
  1685. // {
  1686. // result.ResData.Floor = 3;
  1687. // }
  1688. // }
  1689. // else
  1690. // {
  1691. // result.ResData.Floor = 2;
  1692. // }
  1693. // }
  1694. // else
  1695. // {
  1696. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1697. // {
  1698. // result.ResData.Floor = 3;
  1699. // }
  1700. // else
  1701. // {
  1702. // result.ResData.TaskNo = 0;
  1703. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1704. // result.ResData.Floor = 0;
  1705. // return result;
  1706. // }
  1707. // }
  1708. // }
  1709. // break;
  1710. // case "2258": //二号分层扫码器
  1711. // if (cellfloor2count > 30)
  1712. // {
  1713. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1714. // {
  1715. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1716. // {
  1717. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1718. // {
  1719. // result.ResData.TaskNo = 0;
  1720. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1721. // result.ResData.Floor = 0;
  1722. // return result;
  1723. // }
  1724. // else
  1725. // {
  1726. // result.ResData.Floor = 3;
  1727. // }
  1728. // }
  1729. // else
  1730. // {
  1731. // result.ResData.Floor = 1;
  1732. // }
  1733. // }
  1734. // else
  1735. // {
  1736. // result.ResData.Floor = 2;
  1737. // }
  1738. // }
  1739. // else
  1740. // {
  1741. // if (cellfloor1count > 30)
  1742. // {
  1743. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1744. // {
  1745. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1746. // {
  1747. // result.ResData.TaskNo = 0;
  1748. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1749. // result.ResData.Floor = 0;
  1750. // return result;
  1751. // }
  1752. // else
  1753. // {
  1754. // result.ResData.Floor = 3;
  1755. // }
  1756. // }
  1757. // else
  1758. // {
  1759. // result.ResData.Floor = 1;
  1760. // }
  1761. // }
  1762. // else
  1763. // {
  1764. // if (taskcount.Where(p => p.Floor == 3).Count() < 32 && cellfloor3count > 30)
  1765. // {
  1766. // result.ResData.Floor = 3;
  1767. // }
  1768. // else
  1769. // {
  1770. // result.ResData.TaskNo = 0;
  1771. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1772. // result.ResData.Floor = 0;
  1773. // return result;
  1774. // }
  1775. // }
  1776. // }
  1777. // break;
  1778. // case "2419": //三号分层扫码器
  1779. // if (cellfloor3count > 30)
  1780. // {
  1781. // if (taskcount.Where(p => p.Floor == 3).Count() > 32)
  1782. // {
  1783. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1784. // {
  1785. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1786. // {
  1787. // result.ResData.TaskNo = 0;
  1788. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1789. // result.ResData.Floor = 0;
  1790. // return result;
  1791. // }
  1792. // else
  1793. // {
  1794. // result.ResData.Floor = 1;
  1795. // }
  1796. // }
  1797. // else
  1798. // {
  1799. // result.ResData.Floor = 2;
  1800. // }
  1801. // }
  1802. // else
  1803. // {
  1804. // result.ResData.Floor = 3;
  1805. // }
  1806. // }
  1807. // else
  1808. // {
  1809. // if (cellfloor1count > 30)
  1810. // {
  1811. // if (taskcount.Where(p => p.Floor == 1).Count() > 32)
  1812. // {
  1813. // if (taskcount.Where(p => p.Floor == 2).Count() > 32)
  1814. // {
  1815. // result.ResData.TaskNo = 0;
  1816. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1817. // result.ResData.Floor = 0;
  1818. // return result;
  1819. // }
  1820. // else
  1821. // {
  1822. // result.ResData.Floor = 2;
  1823. // }
  1824. // }
  1825. // else
  1826. // {
  1827. // result.ResData.Floor = 1;
  1828. // }
  1829. // }
  1830. // else
  1831. // {
  1832. // if (taskcount.Where(p => p.Floor == 2).Count() < 32 && cellfloor2count > 30)
  1833. // {
  1834. // result.ResData.Floor = 2;
  1835. // }
  1836. // else
  1837. // {
  1838. // result.ResData.TaskNo = 0;
  1839. // result.ResMsg = reqDto.Code + "当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  1840. // result.ResData.Floor = 0;
  1841. // return result;
  1842. // }
  1843. // }
  1844. // }
  1845. // break;
  1846. // default:
  1847. // break;
  1848. //}
  1849. #endregion 逻辑暂时不用(不换楼层优先)
  1850. //var maxcount = cellfloor1count > cellfloor2count ? (cellfloor1count > cellfloor3count ? cellfloor1count : cellfloor3count) : (cellfloor2count > cellfloor3count ? cellfloor2count : cellfloor3count);
  1851. //if (maxcount == cellfloor1count)
  1852. //{
  1853. // result.ResData.Floor = 1;
  1854. //}
  1855. //else if (maxcount == cellfloor2count)
  1856. //{
  1857. // result.ResData.Floor = 2;
  1858. //}
  1859. //else if (maxcount == cellfloor3count)
  1860. //{
  1861. // result.ResData.Floor = 3;
  1862. //}
  1863. //楼层禁用
  1864. //var floorlist = _sysconfigrepository.GetList(p => p.SType == "FloorType" && !string.IsNullOrEmpty(p.SContent));
  1865. //if (floorlist.Any())
  1866. //{
  1867. // if (floorlist.Select(p => p.Code).ToList().Contains(result.ResData.Floor.ToString()))
  1868. // {
  1869. // result.ResData.Floor = 0;
  1870. // }
  1871. //}
  1872. result.Memo2 = stock.Grade;
  1873. return result;
  1874. }
  1875. /// <summary>
  1876. /// 获取巷道
  1877. /// </summary>
  1878. /// <param name="reqEntity"></param>
  1879. /// <returns></returns>
  1880. public SRes<string> GetTunnelPriorityList(GetSxTunnelPriorityListRequest reqEntity)
  1881. {
  1882. var result = new SRes<string>();
  1883. if (reqEntity.Floor <= 0 || reqEntity.Floor > 3)
  1884. {
  1885. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1886. result.ResMsg = reqEntity.Code + "楼层参数不能为0或大于3";
  1887. result.ResData = "";
  1888. return result;
  1889. }
  1890. var wcstask = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == reqEntity.Code && p.Status < TaskStatus.Finish).First();
  1891. if (wcstask == null)
  1892. {
  1893. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  1894. result.ResMsg = reqEntity.Code + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  1895. return result;
  1896. }
  1897. if (wcstask.Type != TaskType.EnterDepot)
  1898. {
  1899. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1900. result.ResMsg = reqEntity.Code + "不是入库任务,不允许分配巷道";
  1901. return result;
  1902. }
  1903. //获取任务数占用最少的
  1904. 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);
  1905. var tunnelcountlist = new List<TunnelCountTemp>();
  1906. var runningtasks = wcstasks.ToList();
  1907. if (runningtasks.Any())
  1908. {
  1909. tunnelcountlist = (from task in runningtasks.GroupBy(p => p.Tunnel)
  1910. select new TunnelCountTemp
  1911. {
  1912. Tunnel = task.Key,
  1913. Count = task.Count()
  1914. }).ToList();
  1915. }
  1916. //获取库位所有巷道列表
  1917. var alltunnels = _basewarecellrepository.GetList(p => p.Floor == reqEntity.Floor).Select(p => p.Tunnel).Distinct();
  1918. foreach (var item in alltunnels)
  1919. {
  1920. if (!tunnelcountlist.Where(p => p.Tunnel == item.ToString()).Any())
  1921. {
  1922. tunnelcountlist.Add(new TunnelCountTemp()
  1923. {
  1924. Tunnel = item.ToString(),
  1925. Count = 0
  1926. });
  1927. }
  1928. }
  1929. var tasktunnelcountlist = tunnelcountlist.OrderBy(p => p.Count).ToList();
  1930. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  1931. //获取已占用库位最少的货架
  1932. var threshold = 5; //int.Parse(ConfigUtil.GetConfiguration["Threshold"]);//阈值
  1933. 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);
  1934. 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() });
  1935. List<TunnelCountTemp> tempProportion = new List<TunnelCountTemp>();
  1936. if (locationsreturn == null || !locationsreturn.Any())
  1937. {
  1938. result.ResData = string.Join(",", tasktunnelcountlist.OrderBy(p => p.Count).Select(p => p.Tunnel));
  1939. }
  1940. else
  1941. {
  1942. var grouplocationtunnels = (from location in locationsreturn.GroupBy(p => p.Tunnel)
  1943. select new TunnelCountTemp
  1944. {
  1945. Tunnel = location.Key.ToString(),
  1946. Count = location.Count(),
  1947. 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)
  1948. }).ToList().OrderBy(p => p.Count).ToList();
  1949. foreach (var item in alltunnels)
  1950. {
  1951. if (!grouplocationtunnels.Where(p => p.Tunnel == item.ToString()).Any())
  1952. {
  1953. grouplocationtunnels.Add(new TunnelCountTemp()
  1954. {
  1955. Tunnel = item.ToString(),
  1956. Count = 0,
  1957. Proportion = 0
  1958. });
  1959. }
  1960. }
  1961. tempProportion = grouplocationtunnels;
  1962. grouplocationtunnels = grouplocationtunnels.OrderBy(p => p.Proportion).ToList();
  1963. var sorttunnels = grouplocationtunnels.OrderBy(p => p.Proportion).Select(p => p.Tunnel).ToList();
  1964. for (var i = 0; i < grouplocationtunnels.Count - 1; i++)
  1965. {
  1966. if (tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i].Tunnel).First().Count - threshold > tasktunnelcountlist.Where(p => p.Tunnel == grouplocationtunnels[i + 1].Tunnel).First().Count)
  1967. {
  1968. sorttunnels[i] = grouplocationtunnels[i + 1].Tunnel;
  1969. sorttunnels[i + 1] = grouplocationtunnels[i].Tunnel;
  1970. i++;
  1971. }
  1972. else
  1973. {
  1974. sorttunnels[i] = grouplocationtunnels[i].Tunnel;
  1975. }
  1976. }
  1977. result.ResData = string.Join(",", sorttunnels);
  1978. }
  1979. //删除没有空闲货位的货架
  1980. var arrresultTunnels = result.ResData.Split(',');
  1981. 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);
  1982. var resultTunenls = new List<string>();
  1983. foreach (var sorttunnel in arrresultTunnels)
  1984. {
  1985. //获取巷道的入库任务数
  1986. 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();
  1987. int left = 0;
  1988. if (emptylocationsreturn.Where(p => p.Tunnel == int.Parse(sorttunnel)).Count() - tunneltaskcount > left)
  1989. {
  1990. resultTunenls.Add(sorttunnel);
  1991. }
  1992. result.ResData = string.Join(",", resultTunenls);
  1993. }
  1994. //已分巷道的按巷道、物料编码分组,凑齐两个物料
  1995. var materTunenls = new List<string>();
  1996. var evenlist = new List<string>();
  1997. foreach (var item in result.ResData.Split(','))
  1998. {
  1999. var ss = runningtasks.Where(p => p.Tunnel == item);
  2000. var code = (from mat in ss.GroupBy(p => p.MatCode)
  2001. select new MaterCodeItems
  2002. {
  2003. MaterCode = mat.Key,
  2004. Count = mat.Count()
  2005. }).ToList();
  2006. if (code.Where(p => p.MaterCode == wcstask.MatCode).Any())
  2007. {
  2008. if (code.Where(p => p.MaterCode == wcstask.MatCode).First().Count % 2 == 1)
  2009. {
  2010. materTunenls.Add(item);
  2011. }
  2012. else
  2013. {
  2014. evenlist.Add(item);
  2015. }
  2016. }
  2017. else
  2018. {
  2019. evenlist.Add(item);
  2020. }
  2021. }
  2022. if (materTunenls.Any())
  2023. {
  2024. var tunlist = materTunenls.Union(evenlist).ToList();
  2025. result.ResData = string.Join(",", tunlist);
  2026. }
  2027. else
  2028. {
  2029. result.ResData = string.Join(",", evenlist);
  2030. }
  2031. //每条巷道最多允许存在2组任务
  2032. var MaxtaskcountTunnels = result.ResData.Split(',');
  2033. var tunnellist = new List<string>();
  2034. foreach (var item in MaxtaskcountTunnels)
  2035. {
  2036. if (runningtasks.Where(p => p.Tunnel == item).Count() > 5)
  2037. {
  2038. continue;
  2039. }
  2040. else
  2041. {
  2042. tunnellist.Add(item);
  2043. }
  2044. result.ResData = string.Join(",", tunnellist);
  2045. }
  2046. //根据配置过滤禁用的巷道
  2047. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent) && p.Default2 == reqEntity.Floor.ToString());
  2048. if (disabletunnels != null && disabletunnels.Any())
  2049. {
  2050. var resultTunenlsNew = new List<string>();
  2051. var resultTunenlsTemp = result.ResData.Split(',');
  2052. foreach (var tun in resultTunenlsTemp)
  2053. {
  2054. if (!disabletunnels.Select(p => p.Default1).Contains(tun))
  2055. {
  2056. resultTunenlsNew.Add(tun);
  2057. }
  2058. }
  2059. result.ResData = string.Join(",", resultTunenlsNew);
  2060. }
  2061. if (!string.IsNullOrEmpty(reqEntity.Memo1))
  2062. {
  2063. if (result.ResData.Contains(reqEntity.Memo1))
  2064. {
  2065. result.ResData = reqEntity.Memo1;
  2066. }
  2067. }
  2068. result.Memo1 = wcstask.ID.ToString();
  2069. //待检测的优先1-2巷道,检测过的或者不需要检测的优先3-8巷道
  2070. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode);
  2071. var tunellist = result.ResData.Split(',');
  2072. var tunlen2list = tunellist.Where(p => int.Parse(p) < 4);
  2073. var tunthen2list = tunellist.Where(p => int.Parse(p) >= 4);
  2074. if (stock.IsTorsChk == true && stock.TorsChkQty == 0 && stock.Ovced == 0)
  2075. {
  2076. if (tunlen2list.Any())
  2077. {
  2078. result.ResData = string.Join(",", tunlen2list);
  2079. }
  2080. }
  2081. else if ((stock.IsTorsChk == true && stock.TorsChkQty == 1) || stock.IsTorsChk == false)
  2082. {
  2083. var torsTunelEnable = _sysconfigrepository.GetFirst(p => p.Code == "TorsTunelEnable");
  2084. //如果扭转任务数量小于20,并且库容量小于0.5的可以使用
  2085. 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)
  2086. {
  2087. foreach (var item in tunlen2list.OrderByDescending(p => int.Parse(p)))
  2088. {
  2089. if (tempProportion.Where(p => p.Tunnel == item).Any() && tempProportion.Where(p => p.Tunnel == item).First().Proportion < decimal.Parse(torsTunelEnable.Default1))
  2090. {
  2091. tunthen2list = tunthen2list.Prepend(item);
  2092. }
  2093. }
  2094. }
  2095. if (tunthen2list.Any())
  2096. {
  2097. result.ResData = string.Join(",", tunthen2list);
  2098. }
  2099. else
  2100. {
  2101. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2102. result.ResMsg = reqEntity.Code + "没有可用巷道";
  2103. return result;
  2104. }
  2105. }
  2106. if (string.IsNullOrEmpty(result.ResData))
  2107. {
  2108. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2109. result.ResMsg = reqEntity.Code + "没有可用巷道";
  2110. return result;
  2111. }
  2112. return result;
  2113. }
  2114. /// <summary>
  2115. /// 分配货位
  2116. /// </summary>
  2117. /// <param name="request"></param>
  2118. /// <returns></returns>
  2119. public SRes<List<ApplyStockInLocResponse>> ApplyStockInLoc(SxApplyStockInLocRequest reqEntity)
  2120. {
  2121. var res = new SRes<List<ApplyStockInLocResponse>>();
  2122. if (reqEntity.Floor == 0 || reqEntity.Floor > 3)
  2123. {
  2124. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2125. res.ResMsg = string.Join(',', reqEntity.TaskNum) + "楼层参数传递错误";
  2126. res.ResData = new List<ApplyStockInLocResponse>();
  2127. return res;
  2128. }
  2129. if (reqEntity.TunnelNum <= 0)
  2130. {
  2131. res.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();
  2132. res.ResMsg = string.Join(',', reqEntity.TaskNum) + ResponseStatusCodeEnum.NotTunnelNum.GetDescription();
  2133. return res;
  2134. }
  2135. if (reqEntity.TaskNum.Count > 2)
  2136. {
  2137. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2138. res.ResMsg = "当前申请分配货位的任务数大于2";
  2139. return res;
  2140. }
  2141. if (reqEntity.TaskNum.Count == 0)
  2142. {
  2143. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  2144. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  2145. return res;
  2146. }
  2147. lock (lockerApplyLoc)
  2148. {
  2149. res = reqEntity.ApplyStockInLocTemp(_wcstaskoldrepository, _basewarehouserepository, _billInvnowrepository, _basewarecellrepository, _db, _mapper, _logger);
  2150. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2151. {
  2152. if (res.ResData.Any())
  2153. {
  2154. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  2155. {
  2156. StateNum = LocationState.LocationState_Empty
  2157. }, p => res.ResData.Select(p => p.CellNo).Contains(p.Code));
  2158. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  2159. {
  2160. AddrTo = "",
  2161. Fork = 0
  2162. }).Where(p => reqEntity.TaskNum.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  2163. res.ResData = new List<ApplyStockInLocResponse>();
  2164. }
  2165. else
  2166. {
  2167. }
  2168. return res;
  2169. }
  2170. }
  2171. return res;
  2172. }
  2173. /// <summary>
  2174. /// 完成出库任务
  2175. /// </summary>
  2176. /// <param name="reqDto"></param>
  2177. /// <returns></returns>
  2178. public SRes<int> CompleteTask(SxCompleteTaskRequest reqDto)
  2179. {
  2180. var result = new SRes<int>()
  2181. {
  2182. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2183. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  2184. };
  2185. //var tasklist = _wcstaskoldrepository.AsQueryable().Where(p => p.AddrTo == reqDto.Equip && p.Status < TaskStatus.Finish && p.Type < TaskType.OutDepot).SplitTable(p => p.Take(2));
  2186. //if (!tasklist.Any())
  2187. //{
  2188. // result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2189. // result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2190. // return result;
  2191. //}
  2192. ////处理时效库存
  2193. //var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2194. //if (!stocklist.Any())
  2195. //{
  2196. // result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2197. // result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2198. // return result;
  2199. //}
  2200. //var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2201. //foreach (var flow in flowlist)
  2202. //{
  2203. // flow.Id = IdFactory.NewId();
  2204. // flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2205. // flow.AddTime = DateTime.Now;
  2206. // flow.EditTime = DateTime.Now;
  2207. // flow.Memo = "码垛装箱完成";
  2208. //}
  2209. //var palletizing = _palletizrepository.GetSingle(p => p.Id == tasklist.First().PalletizingId && p.PalletizState == 0 && p.Equip == reqDto.Equip);
  2210. //if (palletizing == null)
  2211. //{
  2212. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2213. // result.ResMsg = "没有找到符合条件的码垛信息";
  2214. // return result;
  2215. //}
  2216. //var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  2217. //if (!pallctdetail.Any())
  2218. //{
  2219. // result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2220. // result.ResMsg = "未找到码垛明细数据";
  2221. // return result;
  2222. //}
  2223. ////转向成品
  2224. //try
  2225. //{
  2226. // _db.BeginTran();
  2227. // _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  2228. // _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  2229. // _palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  2230. // {
  2231. // PalletizState = 1
  2232. // }, p => p.Equip == reqDto.Equip && p.Id == palletizing.Id);
  2233. // _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  2234. // _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2235. // p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  2236. // _billInvflow.InsertRange(flowlist);
  2237. // _db.CommitTran();
  2238. //}
  2239. //catch (Exception ex)
  2240. //{
  2241. // _db.RollbackTran();
  2242. // _logger.LogInformation(ex.ToString());
  2243. // result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2244. // result.ResMsg = "完成码垛任务异常";
  2245. //}
  2246. return result;
  2247. }
  2248. /// <summary>
  2249. /// 堆垛机放完
  2250. /// </summary>
  2251. /// <param name="reqDto"></param>
  2252. /// <returns></returns>
  2253. public SRes<int> SrmCompleted(SxCompleteTaskRequest reqDto)
  2254. {
  2255. var result = new SRes<int>()
  2256. {
  2257. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2258. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  2259. ResData = reqDto.TaskNum
  2260. };
  2261. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  2262. if (wcstask == null || wcstask.Id <= 0)
  2263. {
  2264. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2265. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  2266. return result;
  2267. }
  2268. if (wcstask.Type == TaskType.EnterDepot)
  2269. {
  2270. //库存,货位
  2271. try
  2272. {
  2273. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == wcstask.WarehouseCode);
  2274. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2275. if (stock == null)
  2276. {
  2277. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2278. if (stocks != null)
  2279. {
  2280. return result;
  2281. }
  2282. else
  2283. {
  2284. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2285. result.ResMsg = wcstask.BarCode + "没有已组盘的信息";
  2286. return result;
  2287. }
  2288. }
  2289. int row = int.Parse(wcstask.AddrTo.Split('-')[0]);
  2290. int col = int.Parse(wcstask.AddrTo.Split('-')[1]);
  2291. int layer = int.Parse(wcstask.AddrTo.Split('-')[2]);
  2292. int depth = int.Parse(wcstask.AddrTo.Split('-')[4]);
  2293. _db.BeginTran();
  2294. //更新库存
  2295. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { InvStateCode = InvState.InvEcecState_In.ToString(), PutRow = row, PutCol = col, PutLayer = layer, Depth = depth, OneInTime = DateTime.Now, EditTime = DateTime.Now },
  2296. p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  2297. //更新货位
  2298. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = stock.ContGrpBarCode, ContGrpId = stock.ContGrpId, EditTime = DateTime.Now },
  2299. p => p.Row == row && p.Col == col && p.Layer == layer);
  2300. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2301. foreach (var flow in stocklist)
  2302. {
  2303. flow.Id = IdFactory.NewId();
  2304. flow.AddTime = DateTime.Now;
  2305. flow.EditTime = DateTime.Now;
  2306. flow.Memo = "入库任务完成";
  2307. }
  2308. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(stocklist));
  2309. //单据
  2310. var list = new List<BillPushinfo>();
  2311. string pushtype = SxFackbeekType.InterfaceType_SX_CurtainStockIn.ToString();
  2312. //回调数据
  2313. foreach (var push in stocklist)
  2314. {
  2315. list.Add(new BillPushinfo
  2316. {
  2317. DocsNo = stock.ExecDocsNo,
  2318. TypeCode = pushtype,
  2319. RFIDBarCode = stock.ContGrpBarCode,
  2320. HWBarCode = stock.ContGrpBarCode,
  2321. CLBarCode = push.CLBarCode,
  2322. WarehouseId = warehouse.Id,
  2323. WarehouseCode = warehouse.Code,
  2324. WareCellId = 0,
  2325. WareCellCode = wcstask.AddrTo,
  2326. MatId = push.MatId,
  2327. MatCode = push.MatCode,
  2328. MatName = push.MatName,
  2329. TolWQty = push.TolWQty,
  2330. NetWQty = push.NetWQty,
  2331. TareWQty = push.TareWQty,
  2332. ReqNo = Guid.NewGuid().ToString()
  2333. });
  2334. }
  2335. _billPushinforepository.InsertRange(list);
  2336. _db.CommitTran();
  2337. }
  2338. catch (Exception ex)
  2339. {
  2340. _db.RollbackTran();
  2341. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2342. result.ResMsg = wcstask.Id + "完成入库任务异常";
  2343. _logger.LogInformation("完成入库任务异常" + ex.ToString());
  2344. }
  2345. }
  2346. else if (wcstask.Type == TaskType.OutDepot)
  2347. {
  2348. //库存删除
  2349. var stocklist = _billInvnowrepository.GetList(p => p.ContGrpBarCode == wcstask.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2350. if (stocklist == null || !stocklist.Any())
  2351. {
  2352. //result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2353. //result.ResMsg = wcstask.Id + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2354. return result;
  2355. }
  2356. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == wcstask.BarCode && p.StateNum == LocationState.LocationState_StockOut);
  2357. if (cell == null)
  2358. {
  2359. //result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2360. //result.ResMsg = wcstask.Id + "货位清除不符合条件";
  2361. return result;
  2362. }
  2363. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2364. foreach (var flow in flowlist)
  2365. {
  2366. flow.Id = IdFactory.NewId();
  2367. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2368. flow.AddTime = DateTime.Now;
  2369. flow.EditTime = DateTime.Now;
  2370. flow.Memo = "出库任务堆垛机放货完成";
  2371. }
  2372. try
  2373. {
  2374. _db.BeginTran();
  2375. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2376. p => p.StateNum == LocationState.LocationState_StockOut && p.Code.Contains(wcstask.AddrFrom));
  2377. if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription())
  2378. {
  2379. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2380. {
  2381. PutRow = 0,
  2382. PutCol = 0,
  2383. PutLayer = 0
  2384. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2385. var purch = new BillPushinfo()
  2386. {
  2387. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2388. TypeCode = SxFackbeekType.InterfaceType_SX_CurtainStockOut.ToString(),
  2389. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2390. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2391. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2392. WarehouseId = cell.WarehouseId,
  2393. WarehouseCode = "sxhouse",
  2394. WareCellId = cell.Id,
  2395. WareCellCode = wcstask.AddrFrom,
  2396. MatId = stocklist.FirstOrDefault().MatId,
  2397. MatCode = stocklist.FirstOrDefault().MatCode,
  2398. MatName = stocklist.FirstOrDefault().MatName,
  2399. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2400. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2401. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2402. ReqNo = Guid.NewGuid().ToString()
  2403. };
  2404. _billPushinforepository.Insert(purch);
  2405. }
  2406. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription())
  2407. {
  2408. var purch = new BillPushinfo()
  2409. {
  2410. DocsNo = stocklist.FirstOrDefault().InDocsNo,
  2411. TypeCode = SxFackbeekType.InterfaceType_SX_ErrorStockOut.ToString(),
  2412. RFIDBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2413. HWBarCode = stocklist.FirstOrDefault().ContGrpBarCode,
  2414. CLBarCode = stocklist.FirstOrDefault().CLBarCode,
  2415. WarehouseId = cell.WarehouseId,
  2416. WarehouseCode = "sxhouse",
  2417. WareCellId = cell.Id,
  2418. WareCellCode = wcstask.AddrFrom,
  2419. MatId = stocklist.FirstOrDefault().MatId,
  2420. MatCode = stocklist.FirstOrDefault().MatCode,
  2421. MatName = stocklist.FirstOrDefault().MatName,
  2422. TolWQty = stocklist.FirstOrDefault().TolWQty,
  2423. NetWQty = stocklist.FirstOrDefault().NetWQty,
  2424. TareWQty = stocklist.FirstOrDefault().TareWQty,
  2425. ReqNo = Guid.NewGuid().ToString()
  2426. };
  2427. _billPushinforepository.Insert(purch);
  2428. }
  2429. else if (wcstask.BusType == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription())
  2430. {
  2431. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  2432. {
  2433. PutRow = 0,
  2434. PutCol = 0,
  2435. PutLayer = 0
  2436. }, p => p.ContGrpBarCode == wcstask.BarCode);
  2437. }
  2438. else if (wcstask.BusType == "Test" || wcstask.BusType == "异常出库")
  2439. {
  2440. _billInvnowrepository.Delete(p => p.ContGrpBarCode == wcstask.BarCode);
  2441. _billInvflow.InsertRange(flowlist);
  2442. }
  2443. //_taskrepository.Delete(p => p.BarCode == wcstask.BarCode);
  2444. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld() { Status = TaskStatus.Finish }).Where(p => p.Id == wcstask.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  2445. _db.CommitTran();
  2446. }
  2447. catch (Exception ex)
  2448. {
  2449. _db.RollbackTran();
  2450. _logger.LogInformation(ex.ToString());
  2451. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2452. result.ResMsg = wcstask.Id + "出库任务堆垛机放货完成异常";
  2453. }
  2454. }
  2455. else if (wcstask.Type == TaskType.TransferDepot)
  2456. {
  2457. var fromcell = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom);
  2458. if (string.IsNullOrEmpty(fromcell.ContGrpBarCode) || fromcell.ContGrpBarCode != wcstask.BarCode)
  2459. {
  2460. _logger.LogInformation(wcstask.Id + "移库任务重复完成");
  2461. return result;
  2462. }
  2463. var grcontid = fromcell.ContGrpId;
  2464. var grcontcode = fromcell.ContGrpBarCode;
  2465. var fromcellno = fromcell.Code;
  2466. var tocellno = wcstask.AddrTo;
  2467. try
  2468. {
  2469. _db.BeginTran();
  2470. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now }, p => p.Code == fromcellno);
  2471. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Full, ContGrpBarCode = grcontcode, ContGrpId = grcontid, EditTime = DateTime.Now }, p => p.Code == tocellno);
  2472. int row = int.Parse(tocellno.Split('-')[0]);
  2473. int col = int.Parse(tocellno.Split('-')[1]);
  2474. int layer = int.Parse(tocellno.Split('-')[2]);
  2475. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow() { PutRow = row, PutCol = col, PutLayer = layer }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2476. _db.CommitTran();
  2477. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2478. //流水表
  2479. var flow = _mapper.Map<BillInvflow>(stock);
  2480. flow.Id = IdFactory.NewId();
  2481. flow.AddTime = DateTime.Now;
  2482. flow.EditTime = DateTime.Now;
  2483. flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";
  2484. _billInvflow.Insert(flow);
  2485. //推送表
  2486. var purch = new BillPushinfo()
  2487. {
  2488. DocsNo = stock.InDocsNo,
  2489. TypeCode = SxFackbeekType.InterfaceType_SX_CellMove.ToString(),
  2490. RFIDBarCode = stock.ContGrpBarCode,
  2491. HWBarCode = stock.ContGrpBarCode,
  2492. CLBarCode = stock.CLBarCode,
  2493. WarehouseId = fromcell.WarehouseId,
  2494. WarehouseCode = "sxhouse",
  2495. WareCellId = 0,
  2496. WareCellCode = wcstask.AddrFrom,
  2497. RodBarCode = wcstask.AddrTo,
  2498. MatId = stock.MatId,
  2499. MatCode = stock.MatCode,
  2500. MatName = stock.MatName,
  2501. TolWQty = stock.TolWQty,
  2502. NetWQty = stock.NetWQty,
  2503. TareWQty = stock.TareWQty,
  2504. ReqNo = Guid.NewGuid().ToString()
  2505. };
  2506. _billPushinforepository.Insert(purch);
  2507. }
  2508. catch (Exception ex)
  2509. {
  2510. _db.RollbackTran();
  2511. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2512. result.ResMsg = wcstask.Id + "完成移库任务异常";
  2513. _logger.LogInformation("完成移库任务异常" + ex.ToString());
  2514. }
  2515. }
  2516. return result;
  2517. }
  2518. /// <summary>
  2519. /// 完成码垛任务
  2520. /// </summary>
  2521. /// <param name="reqDto"></param>
  2522. /// <returns></returns>
  2523. public SRes<int> CompletePalletizingTask(SxPalletizingCompleteRequest reqDto)
  2524. {
  2525. var res = new SRes<int>()
  2526. {
  2527. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  2528. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  2529. };
  2530. var palletizing = _palletizrepository.GetFirst(p => p.PalletizState == 0 && p.Equip == reqDto.Equip);
  2531. if (palletizing == null)
  2532. {
  2533. //兼容wcs任务没有清掉的情况
  2534. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2535. if (lefttask != null)
  2536. {
  2537. var pazid = lefttask.PalletizingId;
  2538. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2539. {
  2540. res.Memo1 = lefttask.PalletizingId.ToString();
  2541. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2542. return res;
  2543. }
  2544. }
  2545. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2546. res.ResMsg = reqDto.Equip + "没有找到正在码垛的信息";
  2547. return res;
  2548. }
  2549. 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();
  2550. if (!tasklist.Any())
  2551. {
  2552. //兼容wcs任务没有清掉的情况
  2553. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2554. if (lefttask != null)
  2555. {
  2556. var pazid = lefttask.PalletizingId;
  2557. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2558. {
  2559. res.Memo1 = lefttask.PalletizingId.ToString();
  2560. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2561. return res;
  2562. }
  2563. }
  2564. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  2565. res.ResMsg = reqDto.Equip + "不存在该码垛工位的出库任务";
  2566. return res;
  2567. }
  2568. //处理时效库存
  2569. var stocklist = _billInvnowrepository.GetList(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  2570. if (!stocklist.Any())
  2571. {
  2572. if (!_palletizrepository.IsAny(p => p.Equip == reqDto.Equip && p.PalletizState == 0))
  2573. {
  2574. return res;
  2575. }
  2576. else
  2577. {
  2578. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2579. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2580. return res;
  2581. }
  2582. }
  2583. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  2584. foreach (var flow in flowlist)
  2585. {
  2586. flow.Id = IdFactory.NewId();
  2587. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  2588. flow.AddTime = DateTime.Now;
  2589. flow.EditTime = DateTime.Now;
  2590. flow.Memo = "码垛装箱完成";
  2591. }
  2592. var pallctdetail = _palletizdetailrepository.GetList(p => p.PalletizingId == palletizing.Id);
  2593. if (!pallctdetail.Any())
  2594. {
  2595. //兼容wcs任务没有清掉的情况
  2596. var lefttask = _taskrepository.GetFirst(p => p.AddrTo == reqDto.Equip && p.Status == TaskStatus.码垛抓取完成);
  2597. if (lefttask != null)
  2598. {
  2599. var pazid = lefttask.PalletizingId;
  2600. if (_palletizrepository.IsAny(p => p.Id == pazid && p.PalletizState == 1) && !_palletizdetailrepository.IsAny(p => p.PalletizingId == pazid) && !_palletlayerMathrepository.IsAny(p => p.PalletizingId == pazid))
  2601. {
  2602. res.Memo1 = lefttask.PalletizingId.ToString();
  2603. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2604. return res;
  2605. }
  2606. }
  2607. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2608. res.ResMsg = reqDto.Equip + "未找到码垛明细数据";
  2609. return res;
  2610. }
  2611. if (palletizing.Finish == 0)
  2612. {
  2613. if (palletizing.PalletMax != pallctdetail.Count)
  2614. {
  2615. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2616. res.ResMsg = reqDto.Equip + "已码数量不符最大码垛数量";
  2617. return res;
  2618. }
  2619. }
  2620. var boxcode = _boxrulerepository.GetSingle(p => p.Id == palletizing.BoxRuleId && p.ZXStateCode != 2);
  2621. if (boxcode == null)
  2622. {
  2623. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2624. res.ResMsg = reqDto.Equip + "跺型未找到关联的装箱信息";
  2625. return res;
  2626. }
  2627. var packinfo = _packInforepository.GetList(p => p.MatCode == boxcode.TrayCode).First();
  2628. var packlist = _packInforepository.GetList(p => p.PackCode == boxcode.Dryer);
  2629. decimal wqty = boxcode.BaoCaiWeight;
  2630. if (wqty == null || wqty <= 0)
  2631. {
  2632. wqty = TuoPan + SuLiaoDai + GeBan + ZhiXiang;
  2633. }
  2634. //if (packlist.Any())
  2635. //{
  2636. // decimal tuopanqty = 0;
  2637. // decimal packsqty = 0;
  2638. // decimal dituoqty = 0;
  2639. // decimal gebanqty = 0;
  2640. // if (packlist.Any(p => p.MatCode == "C06-02-09-0043"))
  2641. // {
  2642. // var tuopan = packlist.Where(p => p.MatCode == "C06-02-09-0043").FirstOrDefault();
  2643. // tuopanqty = tuopan.Count * tuopan.Weight / 1000;
  2644. // }
  2645. // if (packlist.Any(p => p.MatCode == "C12-01-08-0004"))
  2646. // {
  2647. // var packs = packlist.Where(p => p.MatCode == "C12-01-08-0004").FirstOrDefault();
  2648. // packsqty = packs.Count * packs.Weight / 1000;
  2649. // }
  2650. // if (packlist.Any(p => p.MatCode == "C12-01-10-0003"))
  2651. // {
  2652. // var dituo = packlist.Where(p => p.MatCode == "C12-01-10-0003").FirstOrDefault();
  2653. // dituoqty = dituo.Count * dituo.Weight / 1000;
  2654. // }
  2655. // if (packlist.Any(p => p.MatCode == "C12-01-09-0003"))
  2656. // {
  2657. // var geban = packlist.Where(p => p.MatCode == "C12-01-09-0003").FirstOrDefault();
  2658. // gebanqty = 1 * geban.Weight / 1000;
  2659. // }
  2660. // wqty = tuopanqty + packsqty + dituoqty + gebanqty;
  2661. //}
  2662. //if (wqty == 0)
  2663. //{
  2664. // wqty = 16;
  2665. //}
  2666. //判断托盘号是否一致
  2667. //var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == palletizing.TaskNum).SplitTable(tabs => tabs.Take(2)).First(); ;
  2668. //if (wcstask == null)
  2669. //{
  2670. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2671. // res.ResMsg = reqDto.Equip + "码垛主表的托盘任务id不存在任务信息";
  2672. // return res;
  2673. //}
  2674. var tray = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code = " + palletizing.Equip).First();
  2675. //if (wcstask.BarCode != tray.Code)
  2676. //{
  2677. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2678. // res.ResMsg = reqDto.Equip + "托盘号不匹配";
  2679. // return res;
  2680. //}
  2681. //转向成品
  2682. var info = _mapper.Map<List<PalletinfoDetail>>(pallctdetail);
  2683. info.ForEach(p => p.HuNr = boxcode.PBoxCode);
  2684. var product = new PalletBoxCodeinfoRequest()
  2685. {
  2686. TaskNum = palletizing.TaskNum,
  2687. Equip = tray.Code,
  2688. BoxCode = boxcode.PBoxCode,
  2689. TrayCode = tray.SContent,
  2690. HwType = stocklist.First().HWTypeCode,
  2691. TrayType = packinfo.MatName,
  2692. Wqty = wqty,
  2693. PackWeight = boxcode.PackWeight,
  2694. list = info
  2695. };
  2696. try
  2697. {
  2698. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/PalletAutoInTask", JsonConvert.SerializeObject(product));
  2699. var resp = JsonConvert.DeserializeObject<SRes>(response);
  2700. if (resp.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  2701. {
  2702. res.ResCode = resp.ResCode;
  2703. res.ResMsg = reqDto.Equip + resp.ResMsg;
  2704. return res;
  2705. }
  2706. _db.BeginTran();
  2707. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).Contains(p.Id));
  2708. _billInvinitrepository.Delete(p => tasklist.Select(p => p.BarCode).ToList().Contains(p.ContGrpBarCode));
  2709. _palletlayerMathrepository.Delete(p => p.PboxruleId == boxcode.Id);
  2710. _palletizrepository.AsUpdateable()
  2711. .SetColumns(p => new Palletizing() { PalletizState = 1, EditTime = DateTime.Now })
  2712. .Where(p => p.Equip == reqDto.Equip && p.Id == palletizing.Id)
  2713. .ExecuteCommand();
  2714. _palletizrepository.AsUpdateable()
  2715. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  2716. .Where(p => p.Equip == reqDto.Equip && p.PalletizState == 2)
  2717. .ExecuteCommand();
  2718. //_palletizrepository.UpdateSetColumnsTrue(p => new Palletizing()
  2719. //{
  2720. // PalletizState = 0
  2721. //}, p => p.Equip == reqDto.Equip && p.PalletizState == 2);
  2722. _boxrulerepository.AsUpdateable().SetColumns(p => new BillPboxrule() { ZXStateCode = 2, EditTime = DateTime.Now }).Where(p => p.Id == boxcode.Id).ExecuteCommand();
  2723. _palletizdetailrepository.Delete(p => p.PalletizingId == palletizing.Id);
  2724. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  2725. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == flowlist.First().ContGrpId && tasklist.Select(p => p.AddrFrom).ToList().Contains(p.Code));
  2726. _billInvflow.InsertRange(flowlist);
  2727. //_boxrulerepository.Delete(p => p.Id == boxcode.Id);
  2728. _db.CommitTran();
  2729. }
  2730. catch (Exception ex)
  2731. {
  2732. _db.RollbackTran();
  2733. _logger.LogInformation(ex.ToString());
  2734. res.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  2735. res.ResMsg = "完成码垛任务异常" + ex.Message;
  2736. }
  2737. return res;
  2738. }
  2739. /// <summary>
  2740. /// 码垛层配装箱出库
  2741. /// </summary>
  2742. /// <param name="request"></param>
  2743. /// <returns></returns>
  2744. public SRes PalletizingLayerPackStockOut(PalletizingPackStockOutRequest request)
  2745. {
  2746. var res = new SRes();
  2747. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "CP");
  2748. if (palletlist.Any())
  2749. {
  2750. foreach (var item in palletlist)
  2751. {
  2752. 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));
  2753. if (tasklist.Any())
  2754. {
  2755. continue;
  2756. }
  2757. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip);
  2758. if (equips == null)
  2759. {
  2760. continue;
  2761. }
  2762. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0 && p.PboxruleId == item.BoxRuleId).OrderBy(p => p.Layer);
  2763. if (!palletMach.Any())
  2764. {
  2765. continue;
  2766. }
  2767. //var layers = (from aa in match.GroupBy(p => p.Layer)
  2768. // select new LayerCount
  2769. // {
  2770. // Layer = aa.Key,
  2771. // Count = aa.Count()
  2772. // }).ToList();
  2773. #region 分层出库
  2774. if (palletMach.Where(p => p.Layer == 1).Any())
  2775. {
  2776. var pallectMachs = palletMach.Where(p => p.Layer == 1);
  2777. foreach (var pallets in pallectMachs)
  2778. {
  2779. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  2780. if (cell == null)
  2781. {
  2782. continue;
  2783. }
  2784. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2785. if (invs == null)
  2786. {
  2787. continue;
  2788. }
  2789. var root = DetermineRoot(pallets.Palletequip);
  2790. //先判断二升位是否能出库
  2791. if (cell.Depth == 2)
  2792. {
  2793. var respon = MoveTask(cell.Code);
  2794. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  2795. {
  2796. continue;
  2797. }
  2798. }
  2799. PalletizingPackTask(new PalletizingPackTaskRequest()
  2800. {
  2801. Code = pallets.ContBarCode,
  2802. CellCode = cell.Code,
  2803. Srm = cell.SCRel,
  2804. Tunnel = cell.Tunnel.ToString(),
  2805. Floor = cell.Floor,
  2806. Grade = invs.Grade,
  2807. Mater = invs.MatCode,
  2808. SkuCode = invs.SkuCode,
  2809. PalletLayer = pallets.Layer,
  2810. ProductMachCode = invs.ProductMachCode,
  2811. Equip = item.Equip,
  2812. PalletizingId = item.Id,
  2813. Robot = root,
  2814. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  2815. });
  2816. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  2817. {
  2818. Istask = 1
  2819. }, p => p.ContBarCode == invs.ContGrpBarCode);
  2820. }
  2821. return res;
  2822. }
  2823. else if (palletMach.Where(p => p.Layer == 2).Any())
  2824. {
  2825. var pallectMachs = palletMach.Where(p => p.Layer == 2);
  2826. foreach (var pallets in pallectMachs)
  2827. {
  2828. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  2829. if (cell == null)
  2830. {
  2831. continue;
  2832. }
  2833. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2834. if (invs == null)
  2835. {
  2836. continue;
  2837. }
  2838. var root = DetermineRoot(pallets.Palletequip);
  2839. //先判断二升位是否能出库
  2840. if (cell.Depth == 2)
  2841. {
  2842. var respon = MoveTask(cell.Code);
  2843. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  2844. {
  2845. continue;
  2846. }
  2847. }
  2848. PalletizingPackTask(new PalletizingPackTaskRequest()
  2849. {
  2850. Code = pallets.ContBarCode,
  2851. CellCode = cell.Code,
  2852. Srm = cell.SCRel,
  2853. Tunnel = cell.Tunnel.ToString(),
  2854. Floor = cell.Floor,
  2855. Grade = invs.Grade,
  2856. Mater = invs.MatCode,
  2857. SkuCode = invs.SkuCode,
  2858. PalletLayer = pallets.Layer,
  2859. ProductMachCode = invs.ProductMachCode,
  2860. Equip = item.Equip,
  2861. PalletizingId = item.Id,
  2862. Robot = root,
  2863. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  2864. });
  2865. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  2866. {
  2867. Istask = 1
  2868. }, p => p.ContBarCode == invs.ContGrpBarCode);
  2869. }
  2870. return res;
  2871. }
  2872. else if (palletMach.Where(p => p.Layer == 3).Any())
  2873. {
  2874. var pallectMachs = palletMach.Where(p => p.Layer == 3);
  2875. foreach (var pallets in pallectMachs)
  2876. {
  2877. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  2878. if (cell == null)
  2879. {
  2880. continue;
  2881. }
  2882. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2883. if (invs == null)
  2884. {
  2885. continue;
  2886. }
  2887. var root = DetermineRoot(pallets.Palletequip);
  2888. //先判断二升位是否能出库
  2889. if (cell.Depth == 2)
  2890. {
  2891. var respon = MoveTask(cell.Code);
  2892. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  2893. {
  2894. continue;
  2895. }
  2896. }
  2897. PalletizingPackTask(new PalletizingPackTaskRequest()
  2898. {
  2899. Code = pallets.ContBarCode,
  2900. CellCode = cell.Code,
  2901. Srm = cell.SCRel,
  2902. Tunnel = cell.Tunnel.ToString(),
  2903. Floor = cell.Floor,
  2904. Grade = invs.Grade,
  2905. Mater = invs.MatCode,
  2906. SkuCode = invs.SkuCode,
  2907. PalletLayer = pallets.Layer,
  2908. ProductMachCode = invs.ProductMachCode,
  2909. Equip = item.Equip,
  2910. PalletizingId = item.Id,
  2911. Robot = root,
  2912. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  2913. });
  2914. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  2915. {
  2916. Istask = 1
  2917. }, p => p.ContBarCode == invs.ContGrpBarCode);
  2918. }
  2919. return res;
  2920. }
  2921. else if (palletMach.Where(p => p.Layer == 4).Any())
  2922. {
  2923. var pallectMachs = palletMach.Where(p => p.Layer == 4);
  2924. foreach (var pallets in pallectMachs)
  2925. {
  2926. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  2927. if (cell == null)
  2928. {
  2929. continue;
  2930. }
  2931. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2932. if (invs == null)
  2933. {
  2934. continue;
  2935. }
  2936. var root = DetermineRoot(pallets.Palletequip);
  2937. //先判断二升位是否能出库
  2938. if (cell.Depth == 2)
  2939. {
  2940. var respon = MoveTask(cell.Code);
  2941. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  2942. {
  2943. continue;
  2944. }
  2945. }
  2946. PalletizingPackTask(new PalletizingPackTaskRequest()
  2947. {
  2948. Code = pallets.ContBarCode,
  2949. CellCode = cell.Code,
  2950. Srm = cell.SCRel,
  2951. Tunnel = cell.Tunnel.ToString(),
  2952. Floor = cell.Floor,
  2953. Grade = invs.Grade,
  2954. Mater = invs.MatCode,
  2955. SkuCode = invs.SkuCode,
  2956. PalletLayer = pallets.Layer,
  2957. ProductMachCode = invs.ProductMachCode,
  2958. Equip = item.Equip,
  2959. PalletizingId = item.Id,
  2960. Robot = root,
  2961. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  2962. });
  2963. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  2964. {
  2965. Istask = 1
  2966. }, p => p.ContBarCode == invs.ContGrpBarCode);
  2967. }
  2968. return res;
  2969. }
  2970. else if (palletMach.Where(p => p.Layer == 5).Any())
  2971. {
  2972. var pallectMachs = palletMach.Where(p => p.Layer == 5);
  2973. foreach (var pallets in pallectMachs)
  2974. {
  2975. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  2976. if (cell == null)
  2977. {
  2978. continue;
  2979. }
  2980. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2981. if (invs == null)
  2982. {
  2983. continue;
  2984. }
  2985. var root = DetermineRoot(pallets.Palletequip);
  2986. //先判断二升位是否能出库
  2987. if (cell.Depth == 2)
  2988. {
  2989. var respon = MoveTask(cell.Code);
  2990. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  2991. {
  2992. continue;
  2993. }
  2994. }
  2995. PalletizingPackTask(new PalletizingPackTaskRequest()
  2996. {
  2997. Code = pallets.ContBarCode,
  2998. CellCode = cell.Code,
  2999. Srm = cell.SCRel,
  3000. Tunnel = cell.Tunnel.ToString(),
  3001. Floor = cell.Floor,
  3002. Grade = invs.Grade,
  3003. Mater = invs.MatCode,
  3004. SkuCode = invs.SkuCode,
  3005. PalletLayer = pallets.Layer,
  3006. ProductMachCode = invs.ProductMachCode,
  3007. Equip = item.Equip,
  3008. PalletizingId = item.Id,
  3009. Robot = root,
  3010. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3011. });
  3012. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3013. {
  3014. Istask = 1
  3015. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3016. }
  3017. return res;
  3018. }
  3019. else if (palletMach.Where(p => p.Layer == 6).Any())
  3020. {
  3021. var pallectMachs = palletMach.Where(p => p.Layer == 6);
  3022. foreach (var pallets in pallectMachs)
  3023. {
  3024. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3025. if (cell == null)
  3026. {
  3027. continue;
  3028. }
  3029. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3030. if (invs == null)
  3031. {
  3032. continue;
  3033. }
  3034. var root = DetermineRoot(pallets.Palletequip);
  3035. //先判断二升位是否能出库
  3036. if (cell.Depth == 2)
  3037. {
  3038. var respon = MoveTask(cell.Code);
  3039. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3040. {
  3041. continue;
  3042. }
  3043. }
  3044. PalletizingPackTask(new PalletizingPackTaskRequest()
  3045. {
  3046. Code = pallets.ContBarCode,
  3047. CellCode = cell.Code,
  3048. Srm = cell.SCRel,
  3049. Tunnel = cell.Tunnel.ToString(),
  3050. Floor = cell.Floor,
  3051. Grade = invs.Grade,
  3052. Mater = invs.MatCode,
  3053. SkuCode = invs.SkuCode,
  3054. PalletLayer = pallets.Layer,
  3055. ProductMachCode = invs.ProductMachCode,
  3056. Equip = item.Equip,
  3057. PalletizingId = item.Id,
  3058. Robot = root,
  3059. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  3060. });
  3061. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3062. {
  3063. Istask = 1
  3064. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3065. }
  3066. return res;
  3067. }
  3068. #endregion 分层出库
  3069. }
  3070. }
  3071. var palletLayerList = _palletizrepository.GetList(p => p.PalletizState != 1 && p.BoxRule == "CP");
  3072. if (palletLayerList.Any())
  3073. {
  3074. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3075. res.ResMsg = "已有层配装箱任务";
  3076. return res;
  3077. }
  3078. //取视图码垛设备号
  3079. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  3080. equiplist = equiplist.GetAvailablePalletizingStationsByConfiguration(_sysconfigrepository, "CP_Palletizing");
  3081. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  3082. {
  3083. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3084. res.ResMsg = "没有空闲的码垛工位";
  3085. return res;
  3086. }
  3087. //var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  3088. //var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  3089. var devices = new List<DevincePh>() { new DevincePh() { deviceCode = "8019", pH_STATUS = true }, new DevincePh() { deviceCode = "8011", pH_STATUS = true }, new DevincePh() { deviceCode = "8003", pH_STATUS = true } };
  3090. if (!devices.Where(p => p.pH_STATUS == true).Any())
  3091. {
  3092. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3093. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  3094. return res;
  3095. }
  3096. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  3097. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  3098. 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)
  3099. && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.TorsChkValueIsGood == "OK" && p.ContUsageQty <= 0)
  3100. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  3101. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "CP")
  3102. on stock.InDocsNo equals rule1.DocsNo
  3103. select new
  3104. {
  3105. stock.MatCode,
  3106. stock.InvBarCode,
  3107. stock.Grade,
  3108. stock.InvStateCode,
  3109. stock.ProductTime,
  3110. stock.WbGroupCode,
  3111. stock.IsTorsChk,
  3112. stock.TorsChkQty,
  3113. stock.TorsChkValue,
  3114. stock.HoldTime,
  3115. stock.ProductMachCode,
  3116. stock.IsRework,
  3117. stock.IsBlack,
  3118. stock.SolderCount,
  3119. stock.HWTypeCode,
  3120. stock.TorsChkChord,
  3121. stock.TorsChkFlatness,
  3122. loc.Col,
  3123. loc.Layer,
  3124. loc.Shelf,
  3125. loc.Depth,
  3126. loc.Code,
  3127. loc.Tunnel,
  3128. loc.SCRel,
  3129. loc.Floor,
  3130. loc.WarehouseCode,
  3131. loc.ContGrpBarCode,
  3132. loc.ContGrpId,
  3133. loc.Id,
  3134. loc.StateNum,
  3135. rule1.SkuCode
  3136. };
  3137. if (!invlist.Any())
  3138. {
  3139. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3140. res.ResMsg = "库存不足";
  3141. return res;
  3142. }
  3143. invlist = invlist.Distinct();
  3144. var invlist2 = invlist;
  3145. var sku = invlist.GroupBy(p => p.SkuCode).ToList();
  3146. if (!sku.Any())
  3147. {
  3148. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3149. res.ResMsg = "库中没有SKU或SKU不能为空";
  3150. return res;
  3151. }
  3152. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "CP");
  3153. if (!rulelist.Any())
  3154. {
  3155. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  3156. res.ResMsg = "层配装箱" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  3157. return res;
  3158. }
  3159. foreach (var item in sku)
  3160. {
  3161. var rules = rulelist.Where(p => p.SkuCode == item.Key && p.ZXStateCode == 0 && p.PackRule == "CP").OrderBy(p => p.AddTime);
  3162. if (!rules.Any())
  3163. {
  3164. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3165. res.ResMsg = $"没有可用箱号,SKU:{item.Key}";
  3166. continue;
  3167. }
  3168. foreach (var rule in rules)
  3169. {
  3170. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  3171. List<string> equips = new List<string>();
  3172. foreach (var pp in sys)
  3173. {
  3174. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  3175. {
  3176. equips.Add(pp.Code);
  3177. }
  3178. }
  3179. if (!equips.Any())
  3180. {
  3181. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  3182. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  3183. //自动更新子托盘配置
  3184. foreach (var item1 in sys)
  3185. {
  3186. if (!item1.SContent.Contains(rule.TrayCode))
  3187. {
  3188. string con = item1.SContent + "," + rule.TrayCode;
  3189. _sysconfigrepository.AsUpdateable()
  3190. .SetColumns(p => new sxSysConfig() { SContent = con })
  3191. .Where(p => p.Id == item1.Id)
  3192. .ExecuteCommand();
  3193. }
  3194. }
  3195. }
  3196. var dev = devices.Where(p => sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  3197. if (!dev.Any())
  3198. {
  3199. //_logger.LogInformation(rule.TrayCode + "没有可用拆盘机");
  3200. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3201. res.ResMsg = $"没有可用拆盘机,SKU:{item.Key},箱号:{rule.PBoxCode}";
  3202. continue;
  3203. }
  3204. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).GroupBy(p => p.WbGroupCode);
  3205. if (!wbgrouplist.Any())
  3206. {
  3207. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3208. res.ResMsg = $"不存在可用SKU产品,SKU:{item.Key},箱号:{rule.PBoxCode}";
  3209. continue;
  3210. }
  3211. foreach (var wbgroup in wbgrouplist)
  3212. {
  3213. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType);
  3214. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  3215. {
  3216. break;
  3217. }
  3218. }
  3219. //焊点、返工盘、黑盘一些基本属性筛选
  3220. if (!string.IsNullOrEmpty(rule.SpoolType))
  3221. {
  3222. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  3223. }
  3224. if (rule.PerSolderMaxCount > 0) //允许焊点盘
  3225. {
  3226. var tt = invlist2.Where(p => p.SolderCount <= rule.PerSolderMaxCount).OrderByDescending(p => p.SolderCount).Take(rule.SolderMaxCount);
  3227. invlist2 = tt.Union(invlist2.Where(p => p.SolderCount == 0));
  3228. }
  3229. else
  3230. {
  3231. //不允许焊点盘
  3232. invlist2 = invlist2.Where(p => p.SolderCount == 0);
  3233. }
  3234. if (rule.ReturnCount > 0)
  3235. {
  3236. var tt = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount);
  3237. invlist2 = tt.Union(invlist2);
  3238. }
  3239. else
  3240. {
  3241. invlist2 = invlist2.Where(p => p.IsRework == false);
  3242. }
  3243. //黑盘
  3244. if (rule.SpoolType == "BS60" || rule.SpoolType == "BS40")
  3245. {
  3246. rule.BlackCount = 3;
  3247. }
  3248. else
  3249. {
  3250. rule.BlackCount = 1;
  3251. }
  3252. if (rule.BlackCount > 0)
  3253. {
  3254. var tt = invlist2.Where(p => p.IsBlack == true).Take(rule.BlackCount);
  3255. invlist2 = tt.Union(invlist2);
  3256. }
  3257. else
  3258. {
  3259. invlist2 = invlist2.Where(p => p.IsBlack == false);
  3260. }
  3261. if (!invlist2.Any())
  3262. {
  3263. continue;
  3264. }
  3265. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1)).OrderBy(p => p.EditTime).First();
  3266. //码垛信息校验
  3267. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  3268. {
  3269. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3270. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  3271. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  3272. return res;
  3273. }
  3274. //if (invlist2.Count() < rule.FullCountQty)
  3275. //{
  3276. // continue;
  3277. //}
  3278. int layer = rule.FullCountQty / 12;
  3279. int num = 12;
  3280. #region 计算扭转层工字轮
  3281. for (int i = 0; i < layer; i++)
  3282. {
  3283. #region 计算扭转
  3284. var torslist = invlist2.OrderBy(p => p.ProductTime).ToList().GetRange(0, num);
  3285. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3286. {
  3287. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3288. #region 记录码垛的每层工字轮明细
  3289. foreach (var palletla in torslist)
  3290. {
  3291. var palletlayer = new PalletLayerMath()
  3292. {
  3293. ContGrpId = (long)palletla.ContGrpId,
  3294. ContBarCode = palletla.ContGrpBarCode,
  3295. Layer = i + 1,
  3296. SkuCode = palletla.SkuCode,
  3297. Finish = 0,
  3298. PboxruleId = rule.Id,
  3299. Istask = 0,
  3300. Palletequip = palletequip.Code
  3301. };
  3302. _palletlayerMathrepository.Insert(palletlayer);
  3303. }
  3304. #endregion 记录码垛的每层工字轮明细
  3305. invlist2 = invlist2.Except(torslist);
  3306. }
  3307. else
  3308. {
  3309. //记下头尾元素
  3310. var start = torslist.First();
  3311. var end = torslist.Last();
  3312. List<string> code = new List<string>() { start.ContGrpBarCode, end.ContGrpBarCode };
  3313. //去掉头尾
  3314. torslist = torslist.Skip(1).Take(torslist.Count - 2).ToList();
  3315. //追加两个筹齐12个重新计算
  3316. torslist.AddRange(invlist2.Where(p => !code.Contains(p.ContGrpBarCode)).OrderBy(p => p.ProductTime).Take(2));
  3317. if (Math.Abs((decimal)(rule.Torsion48Qty - torslist.Average(p => p.TorsChkValue))) < rule.TorsionErrRange)
  3318. {
  3319. //barcode.AddRange(torslist.Select(p => p.ContGrpBarCode));
  3320. #region 记录码垛的每层工字轮明细
  3321. foreach (var palletla in torslist)
  3322. {
  3323. var palletlayer = new PalletLayerMath()
  3324. {
  3325. ContGrpId = (long)palletla.ContGrpId,
  3326. ContBarCode = palletla.ContGrpBarCode,
  3327. Layer = i + 1,
  3328. SkuCode = palletla.SkuCode,
  3329. Finish = 0,
  3330. PboxruleId = rule.Id,
  3331. Istask = 0,
  3332. Palletequip = palletequip.Code
  3333. };
  3334. _palletlayerMathrepository.Insert(palletlayer);
  3335. }
  3336. #endregion 记录码垛的每层工字轮明细
  3337. invlist2 = invlist2.Except(torslist);
  3338. }
  3339. }
  3340. #endregion 计算扭转
  3341. }
  3342. #endregion 计算扭转层工字轮
  3343. var palletCodelist = _palletlayerMathrepository.GetList(p => p.PboxruleId == rule.Id);
  3344. if (!palletCodelist.Any())
  3345. {
  3346. continue;
  3347. }
  3348. if (palletCodelist.Count != rule.FullCountQty)
  3349. {
  3350. _palletlayerMathrepository.Delete(p => p.PboxruleId == rule.Id);
  3351. continue;
  3352. }
  3353. var palletCode = palletCodelist.OrderBy(p => p.Layer).Take(12);
  3354. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode };
  3355. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  3356. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  3357. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3358. {
  3359. res.ResCode = trayres.ResCode;
  3360. res.ResMsg = trayres.ResMsg;
  3361. return res;
  3362. }
  3363. var pallet = new Palletizing()
  3364. {
  3365. PalletMax = rule.FullCountQty,
  3366. PalletizState = 0,
  3367. Equip = palletequip.Code,
  3368. Finish = 0,
  3369. AddWho = "",
  3370. EditWho = "",
  3371. BoxRule = rule.PackRule,
  3372. BoxRuleId = rule.Id,
  3373. IsControlpanel = true,
  3374. TaskNum = int.Parse(trayres.Memo1),
  3375. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3376. };
  3377. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  3378. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  3379. {
  3380. ZXStateCode = 1
  3381. }, p => p.Id == rule.Id);
  3382. foreach (var code in palletCode)
  3383. {
  3384. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  3385. if (cell == null)
  3386. {
  3387. continue;
  3388. }
  3389. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3390. if (invs == null)
  3391. {
  3392. continue;
  3393. }
  3394. var inv = invlist2.Where(p => p.ContGrpBarCode == code.ContBarCode && p.ContGrpId == code.ContGrpId).First();
  3395. var root = DetermineRoot(palletequip.Code);
  3396. //先判断二升位是否能出库
  3397. if (cell.Depth == 2)
  3398. {
  3399. var respon = MoveTask(cell.Code);
  3400. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3401. {
  3402. continue;
  3403. }
  3404. }
  3405. PalletizingPackTask(new PalletizingPackTaskRequest()
  3406. {
  3407. Code = code.ContBarCode,
  3408. Equip = pallects.Equip,
  3409. Mater = inv.MatCode,
  3410. Srm = inv.SCRel,
  3411. PalletLayer = code.Layer,
  3412. Grade = inv.Grade,
  3413. Tunnel = inv.Tunnel.ToString(),
  3414. CellCode = inv.Code,
  3415. SkuCode = rule.SkuCode,
  3416. ProductMachCode = inv.ProductMachCode,
  3417. Floor = inv.Floor,
  3418. PalletizingId = pallects.Id,
  3419. Robot = root,
  3420. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2
  3421. });
  3422. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3423. {
  3424. Istask = 1
  3425. }, p => p.ContBarCode == code.ContBarCode);
  3426. }
  3427. return res;
  3428. }
  3429. }
  3430. return res;
  3431. }
  3432. /// <summary>
  3433. /// 层配装箱预锁库存
  3434. /// </summary>
  3435. /// <param name="request"></param>
  3436. /// <returns></returns>
  3437. public SRes PreLockInventoryForLayerPacking(PalletizingPackStockOutRequest request)
  3438. {
  3439. var res = new SRes();
  3440. try
  3441. {
  3442. // 1. 验证预占箱数
  3443. var validationResult = SxPackingHelp.ValidatePreBoxCount(_sysconfigrepository, _boxrulerepository);
  3444. if (!validationResult.IsSuccess)
  3445. {
  3446. return new SRes { ResMsg = validationResult.Message };
  3447. }
  3448. var sxLayerPackingHelp = new SxLayerPackingHelp(_basewarecellrepository,
  3449. _billInvnowrepository, _boxrulerepository, _sysconfigrepository,
  3450. _timeoutrecord, _logger, _palletlayerMathrepository, _billInvflow,
  3451. _wcstaskoldrepository, _basewarehouserepository, _taskdetailrepository,
  3452. _taskrepository, _palletizrepository, _db, _mapper, lockerPalletizingPackTask, lockerApplyLoc);
  3453. // 2. 获取可用库存
  3454. var inventory = sxLayerPackingHelp.GetAvailableInventory();
  3455. if (!inventory.Any())
  3456. {
  3457. _logger.LogError("库存不足");
  3458. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo { Equip = "NoControlOut6", Con = "层配盘库存不足", Time = DateTime.Now });
  3459. return new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "库存不足" };
  3460. }
  3461. // 3. 获取可用箱号规则
  3462. var boxRules = SxPackingHelp.GetAvailableBoxRules("CP", _boxrulerepository);
  3463. if (!boxRules.Any())
  3464. {
  3465. return sxLayerPackingHelp.HandleNoBoxRuleError(inventory);
  3466. }
  3467. // 4. 按SKU分组处理
  3468. var skuGroups = inventory.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  3469. foreach (var skuGroup in skuGroups)
  3470. {
  3471. var result = sxLayerPackingHelp.ProcessSkuGroup(skuGroup, boxRules, inventory);
  3472. if (result.ResCode == ResponseStatusCodeEnum.Sucess.GetHashCode())
  3473. {
  3474. return result;
  3475. }
  3476. else
  3477. {
  3478. res.ResMsg += $"[{skuGroup.Key}:[{result.ResMsg}]]";
  3479. }
  3480. }
  3481. }
  3482. catch (Exception ex)
  3483. {
  3484. return new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = ex.Message + ":" + ex.StackTrace };
  3485. }
  3486. return res;
  3487. }
  3488. /// <summary>
  3489. /// 层配装箱出库及缓存托盘
  3490. /// </summary>
  3491. /// <param name="request"></param>
  3492. /// <returns></returns>
  3493. public SRes ProcessLayerPackingOutboundAndCachePallets(PalletizingPackStockOutRequest request)
  3494. {
  3495. var res = new SRes();
  3496. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "CP" && p.IsControlpanel == false);
  3497. if (palletlist.Any())
  3498. {
  3499. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  3500. if (maxtaskStemp.Any())
  3501. {
  3502. var maxtaskcount = (from tas in maxtaskStemp
  3503. select new TunnelCountTemp()
  3504. {
  3505. Tunnel = tas.Key,
  3506. Count = tas.Count()
  3507. }).ToList();
  3508. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  3509. }
  3510. //箱之间状态卡控限制标识
  3511. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  3512. //某个机械手最大下发的限制状态任务数量
  3513. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  3514. int robotMaxLayerCount = 5;
  3515. foreach (var item in palletlist)
  3516. {
  3517. //判断任务数量
  3518. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  3519. {
  3520. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  3521. continue;
  3522. }
  3523. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  3524. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  3525. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  3526. {
  3527. //判断是不是第3箱
  3528. //判断是否是第三箱
  3529. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  3530. {
  3531. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  3532. if (item.Id == thirdbox)//第3箱子
  3533. {
  3534. 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())
  3535. {
  3536. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  3537. continue;
  3538. }
  3539. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  3540. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  3541. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  3542. {
  3543. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  3544. continue;
  3545. }
  3546. }
  3547. else if (item.Id > thirdbox)
  3548. {
  3549. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  3550. continue;
  3551. }
  3552. }
  3553. }
  3554. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  3555. if (equips == null)
  3556. {
  3557. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  3558. continue;
  3559. }
  3560. // 判断层数是否超出限制
  3561. // 获取当前机械手正在处理的任务中涉及的层数
  3562. var currentProcessingLayers = _taskrepository.AsQueryable()
  3563. .With(SqlWith.NoLock)
  3564. .Where(p => p.Status < TaskStatus.码垛抓取完成 &&
  3565. p.Robot == item.Robot &&
  3566. p.BusType == "装箱码垛")
  3567. .Select(p => new { PalletizingId = p.PalletizingId, Layer = p.Layer })
  3568. .Distinct()
  3569. .Count();
  3570. //判断层是否超出限制
  3571. if (currentProcessingLayers >= robotMaxLayerCount)
  3572. {
  3573. _logger.LogInformation($"{item.Robot} 当前机械手正在处理的层数已达到最大值 {robotMaxLayerCount}");
  3574. continue;
  3575. }
  3576. var availableLayer = robotMaxLayerCount - currentProcessingLayers;
  3577. var availableTaskCount = availableLayer * 12;
  3578. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(x => x.Layer).ThenBy(x => x.Depth).Take(availableTaskCount);
  3579. if (!palletMach.Any())
  3580. {
  3581. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  3582. continue;
  3583. }
  3584. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  3585. var curdocid = maxdocid + 1;
  3586. if (palletMach.Any())
  3587. {
  3588. var pid = palletMach.First().PalletizingId;
  3589. 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)
  3590. {
  3591. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  3592. }
  3593. }
  3594. foreach (var pallets in palletMach)
  3595. {
  3596. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3597. if (cell == null)
  3598. {
  3599. continue;
  3600. }
  3601. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3602. if (invs == null)
  3603. {
  3604. continue;
  3605. }
  3606. var root = DetermineRoot(pallets.Palletequip);
  3607. //先判断二升位是否能出库
  3608. if (cell.Depth == 2)
  3609. {
  3610. var respon = MoveTask(cell.Code);
  3611. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3612. {
  3613. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  3614. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  3615. continue;
  3616. }
  3617. }
  3618. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  3619. {
  3620. Code = pallets.ContBarCode,
  3621. CellCode = cell.Code,
  3622. Srm = cell.SCRel,
  3623. Tunnel = cell.Tunnel.ToString(),
  3624. Floor = cell.Floor,
  3625. Grade = invs.Grade,
  3626. Mater = invs.MatCode,
  3627. SkuCode = pallets.SkuCode,
  3628. PalletLayer = invs.PackingLayer,
  3629. ProductMachCode = invs.ProductMachCode,
  3630. Equip = item.Equip,
  3631. PalletizingId = item.Id,
  3632. Robot = root,
  3633. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  3634. DocId = curdocid
  3635. });
  3636. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3637. {
  3638. continue;
  3639. }
  3640. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3641. {
  3642. Istask = 1,
  3643. Layer = 0
  3644. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3645. }
  3646. //下完任务后将标识值加1
  3647. 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);
  3648. taskflag = taskflag + 1;
  3649. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  3650. }
  3651. }
  3652. //待码垛箱任务下发
  3653. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "CP" && p.IsControlpanel == false);
  3654. if (palletlisttobe.Any())
  3655. {
  3656. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  3657. {
  3658. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  3659. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  3660. {
  3661. _palletizrepository.AsUpdateable()
  3662. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  3663. .Where(p => p.Id == item.Id)
  3664. .ExecuteCommand();
  3665. }
  3666. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  3667. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  3668. {
  3669. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  3670. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  3671. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  3672. {
  3673. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  3674. continue;
  3675. }
  3676. //箱之间状态卡控限制标识
  3677. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  3678. //判断任务数量
  3679. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  3680. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  3681. {
  3682. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  3683. continue;
  3684. }
  3685. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  3686. var robotMaxLayerCount = 5;
  3687. 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()
  3688. {
  3689. //判断是否是第三箱
  3690. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  3691. {
  3692. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  3693. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  3694. if (item.Id == thirdbox)//第3箱子
  3695. {
  3696. 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())
  3697. {
  3698. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  3699. continue;
  3700. }
  3701. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  3702. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  3703. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  3704. {
  3705. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  3706. continue;
  3707. }
  3708. }
  3709. else if (item.Id > thirdbox)
  3710. {
  3711. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  3712. continue;
  3713. }
  3714. }
  3715. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  3716. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  3717. {
  3718. // 判断层数是否超出限制
  3719. // 获取当前机械手正在处理的任务中涉及的层数
  3720. var currentProcessingLayers = _taskrepository.AsQueryable()
  3721. .With(SqlWith.NoLock)
  3722. .Where(p => p.Status < TaskStatus.码垛抓取完成 &&
  3723. p.Robot == item.Robot &&
  3724. p.BusType == "装箱码垛")
  3725. .Select(p => new { PalletizingId = p.PalletizingId, Layer = p.Layer })
  3726. .Distinct()
  3727. .Count();
  3728. //判断层是否超出限制
  3729. if (currentProcessingLayers >= robotMaxLayerCount)
  3730. {
  3731. _logger.LogInformation($"{item.Robot} 当前机械手正在处理的层数已达到最大值 {robotMaxLayerCount}");
  3732. continue;
  3733. }
  3734. var availableLayer = robotMaxLayerCount - currentProcessingLayers;
  3735. var availableTaskCount = availableLayer * 12;
  3736. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(x => x.Layer).ThenBy(x => x.Depth).Take(availableTaskCount);
  3737. if (!palletMach.Any())
  3738. {
  3739. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  3740. continue;
  3741. }
  3742. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  3743. var curdocid = maxdocid + 1;
  3744. if (palletMach.Any())
  3745. {
  3746. var pid = palletMach.First().PalletizingId;
  3747. 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)
  3748. {
  3749. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  3750. }
  3751. }
  3752. foreach (var pallets in palletMach)
  3753. {
  3754. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  3755. if (cell == null)
  3756. {
  3757. continue;
  3758. }
  3759. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3760. if (invs == null)
  3761. {
  3762. continue;
  3763. }
  3764. var root = DetermineRoot(pallets.Palletequip);
  3765. //先判断二升位是否能出库
  3766. if (cell.Depth == 2)
  3767. {
  3768. var respon = MoveTask(cell.Code);
  3769. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  3770. {
  3771. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  3772. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  3773. continue;
  3774. }
  3775. }
  3776. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  3777. {
  3778. Code = pallets.ContBarCode,
  3779. CellCode = cell.Code,
  3780. Srm = cell.SCRel,
  3781. Tunnel = cell.Tunnel.ToString(),
  3782. Floor = cell.Floor,
  3783. Grade = invs.Grade,
  3784. Mater = invs.MatCode,
  3785. SkuCode = pallets.SkuCode,
  3786. PalletLayer = invs.PackingLayer,
  3787. ProductMachCode = invs.ProductMachCode,
  3788. Equip = item.Equip,
  3789. PalletizingId = item.Id,
  3790. Robot = root,
  3791. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  3792. DocId = curdocid
  3793. });
  3794. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  3795. {
  3796. continue;
  3797. }
  3798. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  3799. {
  3800. Istask = 1,
  3801. Layer = 0
  3802. }, p => p.ContBarCode == invs.ContGrpBarCode);
  3803. }
  3804. //下完任务后将标识值加1
  3805. 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);
  3806. taskflag = taskflag + 1;
  3807. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  3808. }
  3809. }
  3810. }
  3811. else
  3812. {
  3813. _palletizrepository.AsUpdateable()
  3814. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  3815. .Where(p => p.Id == item.Id)
  3816. .ExecuteCommand();
  3817. }
  3818. }
  3819. }
  3820. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  3821. equiplist = equiplist.GetAvailablePalletizingStationsByConfiguration(_sysconfigrepository, "CP_Palletizing");
  3822. var iscontinue = false;
  3823. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  3824. {
  3825. if (string.IsNullOrEmpty(palletequip.Default1))
  3826. {
  3827. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  3828. {
  3829. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  3830. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3831. if (preinvlist.Any())
  3832. {
  3833. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  3834. 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)
  3835. {
  3836. //如果较小的工位已经没有任务那么,则继续下该工位任务
  3837. 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();
  3838. if (minequ != null)
  3839. {
  3840. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  3841. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  3842. {
  3843. }
  3844. else
  3845. {
  3846. iscontinue = false;
  3847. continue;
  3848. }
  3849. }
  3850. }
  3851. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  3852. {
  3853. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3854. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  3855. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  3856. return res;
  3857. }
  3858. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  3859. //码垛信息校验
  3860. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  3861. {
  3862. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3863. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  3864. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  3865. return res;
  3866. }
  3867. var root = DetermineRoot(palletequip.Code);
  3868. var pallet = new Palletizing()
  3869. {
  3870. PalletMax = rule.FullCountQty,
  3871. PalletizState = 0,
  3872. Equip = palletequip.Code,
  3873. Finish = 0,
  3874. AddWho = "",
  3875. EditWho = "",
  3876. BoxRule = rule.PackRule,
  3877. BoxRuleId = rule.Id,
  3878. IsControlpanel = false,
  3879. TaskNum = int.Parse(palletequip.Default3),
  3880. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  3881. Robot = root
  3882. };
  3883. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  3884. if (pallects.Id == 0)
  3885. {
  3886. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3887. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  3888. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  3889. return res;
  3890. }
  3891. var palletizId = pallects.Id;
  3892. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  3893. {
  3894. ZXStateCode = 1
  3895. }, p => p.Id == rule.Id);
  3896. List<PalletLayerMath> math = new List<PalletLayerMath>();
  3897. foreach (var invs in preinvlist)
  3898. {
  3899. var palletlayer = new PalletLayerMath()
  3900. {
  3901. PalletizingId = palletizId,
  3902. ContGrpId = (long)invs.ContGrpId,
  3903. ContBarCode = invs.ContGrpBarCode,
  3904. Layer = invs.PackingLayer,
  3905. SkuCode = rule.SkuCode,
  3906. Finish = 0,
  3907. PboxruleId = rule.Id,
  3908. Istask = 0,
  3909. Palletequip = palletequip.Code,
  3910. Depth = invs.Depth,
  3911. IsBlack = invs.IsBlack,
  3912. SolderCount = invs.SolderCount,
  3913. BoxCode = rule.PBoxCode,
  3914. Wbgroup = invs.WbGroupCode,
  3915. StockDonse = invs.InDocsNo,
  3916. BoxDonse = rule.DocsNo
  3917. };
  3918. math.Add(palletlayer);
  3919. }
  3920. _palletlayerMathrepository.InsertRange(math);
  3921. //把库存预锁标志更新掉
  3922. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  3923. {
  3924. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  3925. BomMatCode = "",
  3926. PreStock = "1"
  3927. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  3928. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  3929. res.ResMsg = "非控制捞取预锁库存处理成功";
  3930. return res;
  3931. }
  3932. else
  3933. {
  3934. iscontinue = false;
  3935. continue;
  3936. }
  3937. }
  3938. if (string.IsNullOrEmpty(palletequip.Cache1State))
  3939. {
  3940. iscontinue = true;
  3941. break;
  3942. }
  3943. else
  3944. {
  3945. iscontinue = false;
  3946. continue;
  3947. }
  3948. }
  3949. else
  3950. {
  3951. if (!string.IsNullOrEmpty(palletequip.Default3))
  3952. {
  3953. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  3954. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  3955. if (preinvlist.Any())
  3956. {
  3957. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  3958. 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)
  3959. {
  3960. //如果较小的工位已经没有任务那么,则继续下该工位任务
  3961. 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();
  3962. if (minequ != null)
  3963. {
  3964. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  3965. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  3966. {
  3967. }
  3968. else
  3969. {
  3970. iscontinue = false;
  3971. continue;
  3972. }
  3973. }
  3974. }
  3975. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  3976. {
  3977. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3978. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  3979. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  3980. return res;
  3981. }
  3982. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  3983. //码垛信息校验
  3984. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  3985. {
  3986. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3987. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  3988. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  3989. return res;
  3990. }
  3991. var root = DetermineRoot(palletequip.Code);
  3992. var pallet = new Palletizing()
  3993. {
  3994. PalletMax = rule.FullCountQty,
  3995. PalletizState = 2,
  3996. Equip = palletequip.Code,
  3997. Finish = 0,
  3998. AddWho = "",
  3999. EditWho = "",
  4000. BoxRule = rule.PackRule,
  4001. BoxRuleId = rule.Id,
  4002. IsControlpanel = false,
  4003. TaskNum = int.Parse(palletequip.Default3),
  4004. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4005. Robot = root
  4006. };
  4007. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4008. if (pallects.Id == 0)
  4009. {
  4010. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4011. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4012. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4013. return res;
  4014. }
  4015. var palletizId = pallects.Id;
  4016. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4017. {
  4018. ZXStateCode = 1
  4019. }, p => p.Id == rule.Id);
  4020. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4021. foreach (var invs in preinvlist)
  4022. {
  4023. var palletlayer = new PalletLayerMath()
  4024. {
  4025. PalletizingId = palletizId,
  4026. ContGrpId = (long)invs.ContGrpId,
  4027. ContBarCode = invs.ContGrpBarCode,
  4028. Layer = invs.PackingLayer,
  4029. SkuCode = rule.SkuCode,
  4030. Finish = 0,
  4031. PboxruleId = rule.Id,
  4032. Istask = 0,
  4033. Palletequip = palletequip.Code,
  4034. Depth = invs.Depth,
  4035. IsBlack = invs.IsBlack,
  4036. SolderCount = invs.SolderCount,
  4037. BoxCode = rule.PBoxCode,
  4038. Wbgroup = invs.WbGroupCode,
  4039. StockDonse = invs.InDocsNo,
  4040. BoxDonse = rule.DocsNo
  4041. };
  4042. math.Add(palletlayer);
  4043. }
  4044. _palletlayerMathrepository.InsertRange(math);
  4045. //把库存预锁标志更新掉
  4046. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4047. {
  4048. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4049. BomMatCode = "",
  4050. PreStock = "1"
  4051. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4052. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4053. res.ResMsg = "非控制捞取预锁库存处理成功";
  4054. return res;
  4055. }
  4056. else
  4057. {
  4058. iscontinue = false;
  4059. continue;
  4060. }
  4061. }
  4062. else
  4063. {
  4064. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  4065. {
  4066. iscontinue = true;
  4067. break;
  4068. }
  4069. else
  4070. {
  4071. iscontinue = false;
  4072. continue;
  4073. }
  4074. }
  4075. }
  4076. }
  4077. if (!iscontinue)
  4078. {
  4079. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  4080. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  4081. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  4082. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097", "8306" };
  4083. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  4084. {
  4085. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4086. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4087. res.ResMsg = "没有空闲的码垛工位";
  4088. return res;
  4089. }
  4090. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  4091. {
  4092. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4093. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4094. res.ResMsg = "没有空闲的码垛工位";
  4095. return res;
  4096. }
  4097. }
  4098. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  4099. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  4100. if (!devices.Where(p => p.pH_STATUS == true).Any())
  4101. {
  4102. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  4103. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4104. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  4105. return res;
  4106. }
  4107. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  4108. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 3 && p.PackRule == "CP").OrderBy(p => p.EditTime);
  4109. if (prerules != null && prerules.Any())
  4110. {
  4111. foreach (var rule in prerules)
  4112. {
  4113. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  4114. List<string> equips = new List<string>();
  4115. foreach (var pp in sys)
  4116. {
  4117. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  4118. {
  4119. equips.Add(pp.Code);
  4120. }
  4121. }
  4122. if (!equips.Any())
  4123. {
  4124. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  4125. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  4126. //自动更新子托盘配置
  4127. foreach (var item1 in sys)
  4128. {
  4129. if (!item1.SContent.Contains(rule.TrayCode))
  4130. {
  4131. string con = item1.SContent + "," + rule.TrayCode;
  4132. _sysconfigrepository.AsUpdateable()
  4133. .SetColumns(p => new sxSysConfig() { SContent = con })
  4134. .Where(p => p.Id == item1.Id)
  4135. .ExecuteCommand();
  4136. }
  4137. }
  4138. }
  4139. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  4140. if (!invlist2.Any())
  4141. {
  4142. _logger.LogInformation(rule.Id + "规则表预占数据没有查到对应库存信息");
  4143. continue;
  4144. }
  4145. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  4146. if (!dev.Any())
  4147. {
  4148. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  4149. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  4150. continue;
  4151. }
  4152. var robotlist = new List<string>() { "Robot1", "Robot2", "Robot3" }.GetAvailablePalletizingRobotsByConfiguration(_sysconfigrepository, "CP_Palletizing");
  4153. sxSysConfig palletequip = null;
  4154. foreach (var robot in robotlist)
  4155. {
  4156. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  4157. {
  4158. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用")
  4159. .ToList().GetAvailablePalletizingStationsByConfiguration(_sysconfigrepository, "CP_Palletizing").OrderBy(p => p.TaskFlag).FirstOrDefault();
  4160. //码垛工位
  4161. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  4162. {
  4163. palletequip = palletequiptemp;
  4164. break;
  4165. }
  4166. //缓存工位1
  4167. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  4168. {
  4169. palletequip = palletequiptemp;
  4170. break;
  4171. }
  4172. //缓存工位2
  4173. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  4174. {
  4175. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  4176. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  4177. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  4178. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  4179. {
  4180. palletequip = palletequiptemp;
  4181. break;
  4182. }
  4183. }
  4184. }
  4185. }
  4186. if (palletequip == null)
  4187. {
  4188. res.ResMsg = "没有空闲的码垛工位";
  4189. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  4190. return res;
  4191. }
  4192. int acttype = 0;
  4193. //判断是缓存工位锁定库存还是码垛工位直接下任务
  4194. if (string.IsNullOrEmpty(palletequip.Default1))
  4195. {
  4196. if (string.IsNullOrEmpty(palletequip.Cache1State))
  4197. {
  4198. acttype = 1;//直接执行下任务
  4199. }
  4200. else
  4201. {
  4202. //等待下一轮循环,往math表插数据放在前面
  4203. res.ResMsg = "等待下一轮循环";
  4204. return res;
  4205. }
  4206. }
  4207. else
  4208. {
  4209. if (string.IsNullOrEmpty(palletequip.Cache1State))
  4210. {
  4211. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  4212. if (!string.IsNullOrEmpty(palletequip.Default3))
  4213. {
  4214. res.ResMsg = "等待下一轮循环";
  4215. return res;
  4216. }
  4217. else
  4218. {
  4219. acttype = 2;//预锁库存
  4220. }
  4221. }
  4222. else
  4223. {
  4224. //判断缓存工位2(缓存工位1的托盘要到位之后)
  4225. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  4226. {
  4227. //使用缓存2工位
  4228. acttype = 3;
  4229. }
  4230. else
  4231. {
  4232. res.ResMsg = "没有空闲的码垛工位";
  4233. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  4234. return res;
  4235. }
  4236. }
  4237. }
  4238. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode, ActType = acttype };
  4239. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  4240. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  4241. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4242. {
  4243. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  4244. res.ResCode = trayres.ResCode;
  4245. res.ResMsg = trayres.ResMsg;
  4246. return res;
  4247. }
  4248. if (acttype == 1)
  4249. {
  4250. //码垛信息校验
  4251. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  4252. {
  4253. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4254. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  4255. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  4256. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  4257. return res;
  4258. }
  4259. var root = DetermineRoot(palletequip.Code);
  4260. var pallet = new Palletizing()
  4261. {
  4262. PalletMax = rule.FullCountQty,
  4263. PalletizState = 0,
  4264. Equip = palletequip.Code,
  4265. Finish = 0,
  4266. AddWho = "",
  4267. EditWho = "",
  4268. BoxRule = rule.PackRule,
  4269. BoxRuleId = rule.Id,
  4270. IsControlpanel = false,
  4271. TaskNum = int.Parse(trayres.Memo1),
  4272. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4273. Robot = root
  4274. };
  4275. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4276. if (pallects.Id == 0)
  4277. {
  4278. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4279. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4280. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4281. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  4282. return res;
  4283. }
  4284. var palletizId = pallects.Id;
  4285. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4286. {
  4287. ZXStateCode = 1
  4288. }, p => p.Id == rule.Id);
  4289. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4290. foreach (var invs in invlist2)
  4291. {
  4292. var palletlayer = new PalletLayerMath()
  4293. {
  4294. PalletizingId = palletizId,
  4295. ContGrpId = (long)invs.ContGrpId,
  4296. ContBarCode = invs.ContGrpBarCode,
  4297. Layer = invs.PackingLayer,
  4298. SkuCode = rule.SkuCode,
  4299. Finish = 0,
  4300. PboxruleId = rule.Id,
  4301. Istask = 0,
  4302. Palletequip = palletequip.Code,
  4303. IsBlack = invs.IsBlack,
  4304. Depth = invs.Depth,
  4305. SolderCount = invs.SolderCount,
  4306. BoxCode = rule.PBoxCode,
  4307. StockDonse = invs.InDocsNo,
  4308. Wbgroup = invs.WbGroupCode,
  4309. BoxDonse = rule.DocsNo
  4310. };
  4311. math.Add(palletlayer);
  4312. }
  4313. _palletlayerMathrepository.InsertRange(math);
  4314. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4315. {
  4316. PreStock = "1"
  4317. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  4318. res.ResCode = 200;
  4319. res.ResMsg = "成功";
  4320. return res;
  4321. }
  4322. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  4323. {
  4324. var codes = new List<string>();
  4325. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  4326. if (codes.Any())
  4327. {
  4328. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4329. {
  4330. PreStock = "1",
  4331. BomMatCode = trayres.Memo1,//预锁托盘任务id
  4332. BomMatName = rule.PBoxCode, //预锁的箱号
  4333. BomSetId = 0 //代表非控制箱标识
  4334. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4335. //锁定缓存工位
  4336. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  4337. }
  4338. res.ResCode = 200;
  4339. res.ResMsg = "成功";
  4340. return res;
  4341. }
  4342. }
  4343. }
  4344. else
  4345. {
  4346. res.ResMsg = "没有预占状态的规则数据";
  4347. }
  4348. return res;
  4349. }
  4350. /// <summary>
  4351. /// 码垛SPC非控制装箱(缓存托盘)
  4352. /// </summary>
  4353. /// <param name="request"></param>
  4354. /// <returns></returns>
  4355. public SRes PalletizingSpcNotPackStockOut3(PalletizingPackStockOutRequest request)
  4356. {
  4357. var res = new SRes();
  4358. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  4359. if (palletlist.Any())
  4360. {
  4361. var maxtaskStemp = _palletlayerMathrepository.GetList(p => p.Istask == 0 && palletlist.Select(p => p.Id).Contains(p.PalletizingId)).GroupBy(p => p.Palletequip);
  4362. if (maxtaskStemp.Any())
  4363. {
  4364. var maxtaskcount = (from tas in maxtaskStemp
  4365. select new TunnelCountTemp()
  4366. {
  4367. Tunnel = tas.Key,
  4368. Count = tas.Count()
  4369. }).ToList();
  4370. palletlist = palletlist.OrderByDescending(p => maxtaskcount.Where(q => q.Tunnel == p.Equip).Any() ? maxtaskcount.Where(q => q.Tunnel == p.Equip).FirstOrDefault().Count : 0).ToList();
  4371. }
  4372. //箱之间状态卡控限制标识
  4373. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  4374. //某个机械手最大下发的限制状态任务数量
  4375. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  4376. foreach (var item in palletlist)
  4377. {
  4378. //判断任务数量
  4379. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  4380. {
  4381. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  4382. continue;
  4383. }
  4384. //找到当前机械手较早的码垛信息,然后判断是否已经过了某个点
  4385. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  4386. if (item.Id != prepalletid)//不是靠前的那一码垛信息
  4387. {
  4388. //判断是不是第3箱
  4389. //判断是否是第三箱
  4390. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  4391. {
  4392. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  4393. if (item.Id == thirdbox)//第3箱子
  4394. {
  4395. 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())
  4396. {
  4397. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4398. continue;
  4399. }
  4400. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  4401. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  4402. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  4403. {
  4404. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  4405. continue;
  4406. }
  4407. }
  4408. else if (item.Id > thirdbox)
  4409. {
  4410. _logger.LogInformation("同一机械手第3箱之后的任务不允许下发,码垛主表id:" + item.Id);
  4411. continue;
  4412. }
  4413. }
  4414. //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())
  4415. //{
  4416. // _logger.LogInformation("同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4417. // continue;
  4418. //}
  4419. }
  4420. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  4421. if (equips == null)
  4422. {
  4423. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut2", new RedisErrorInfo() { Equip = "NoControlOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  4424. continue;
  4425. }
  4426. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(72);
  4427. if (!palletMach.Any())
  4428. {
  4429. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  4430. continue;
  4431. }
  4432. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  4433. var curdocid = maxdocid + 1;
  4434. if (palletMach.Any())
  4435. {
  4436. var pid = palletMach.First().PalletizingId;
  4437. 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)
  4438. {
  4439. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  4440. }
  4441. }
  4442. foreach (var pallets in palletMach)
  4443. {
  4444. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4445. if (cell == null)
  4446. {
  4447. continue;
  4448. }
  4449. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4450. if (invs == null)
  4451. {
  4452. continue;
  4453. }
  4454. var root = DetermineRoot(pallets.Palletequip);
  4455. //先判断二升位是否能出库
  4456. if (cell.Depth == 2)
  4457. {
  4458. var respon = MoveTask(cell.Code);
  4459. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4460. {
  4461. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4462. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4463. continue;
  4464. }
  4465. }
  4466. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4467. {
  4468. Code = pallets.ContBarCode,
  4469. CellCode = cell.Code,
  4470. Srm = cell.SCRel,
  4471. Tunnel = cell.Tunnel.ToString(),
  4472. Floor = cell.Floor,
  4473. Grade = invs.Grade,
  4474. Mater = invs.MatCode,
  4475. SkuCode = pallets.SkuCode,
  4476. PalletLayer = 0,
  4477. ProductMachCode = invs.ProductMachCode,
  4478. Equip = item.Equip,
  4479. PalletizingId = item.Id,
  4480. Robot = root,
  4481. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4482. DocId = curdocid
  4483. });
  4484. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4485. {
  4486. continue;
  4487. }
  4488. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4489. {
  4490. Istask = 1,
  4491. Layer = 0
  4492. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4493. }
  4494. //下完任务后将标识值加1
  4495. 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);
  4496. taskflag = taskflag + 1;
  4497. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4498. }
  4499. }
  4500. //待码垛箱任务下发
  4501. var palletlisttobe = _palletizrepository.GetList(p => p.PalletizState == 2 && p.BoxRule == "SPC" && p.IsControlpanel == false);
  4502. if (palletlisttobe.Any())
  4503. {
  4504. foreach (var item in palletlisttobe.OrderBy(p => p.Id))
  4505. {
  4506. //判断当前工位有没有正在码垛的,没的话,则把待码垛的更新成正在码垛的
  4507. if (!_palletizrepository.GetList(p => p.PalletizState == 0 && p.Equip == item.Equip).Any())
  4508. {
  4509. _palletizrepository.AsUpdateable()
  4510. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4511. .Where(p => p.Id == item.Id)
  4512. .ExecuteCommand();
  4513. }
  4514. var temppalletlist = _palletizrepository.GetList(p => p.PalletizState == 0);
  4515. if (temppalletlist.Where(p => p.Robot == item.Robot).Any())
  4516. {
  4517. List<long> mdtempequiplist = temppalletlist.Where(p => p.Robot == item.Robot).Select(p => p.Id).ToList();
  4518. //判断当前机械手正在码垛的两个工位任务都已经下发完成
  4519. if (_palletlayerMathrepository.GetList(p => mdtempequiplist.Contains(p.PalletizingId) && p.Istask == 0).Any())
  4520. {
  4521. _logger.LogInformation(item.Robot + "正在码垛的任务没有下完,不允许下发待码垛任务");
  4522. continue;
  4523. }
  4524. //箱之间状态卡控限制标识
  4525. TaskStatus taskstatus = (TaskStatus)int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskStatus").SContent);
  4526. //判断任务数量
  4527. int robotmaxtaskcount = int.Parse(_sysconfigrepository.GetSingle(p => p.Code == "PreNextTaskCount").SContent);
  4528. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Status < TaskStatus.码垛抓取完成 && p.Robot == item.Robot && p.BusType == "装箱码垛").Count() >= robotmaxtaskcount)
  4529. {
  4530. _logger.LogInformation(item.Robot + "当前机械手任务数量已经超最大值" + robotmaxtaskcount);
  4531. continue;
  4532. }
  4533. //var curpalletid = temppalletlist.Where(p => p.Equip == item.Equip).First().Id;
  4534. 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()
  4535. {
  4536. //判断是否是第三箱
  4537. if (_palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).Count >= 3)
  4538. {
  4539. var prepalletid = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).FirstOrDefault().Id;
  4540. var thirdbox = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot).OrderBy(p => p.Id).Take(3).Last().Id;
  4541. if (item.Id == thirdbox)//第3箱子
  4542. {
  4543. 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())
  4544. {
  4545. _logger.LogInformation("第3箱卡控同一机械手最早的箱子的码垛任务没有全部过卡控点" + taskstatus.GetDescription());
  4546. continue;
  4547. }
  4548. //判断前两箱子如果都是同一目标地址,那么第三箱也不要下
  4549. var pre2list = _palletizrepository.GetList(p => p.PalletizState != 1 && p.Robot == item.Robot && p.Id < thirdbox);
  4550. if (pre2list.Count == 2 && pre2list.Select(p => p.Equip).Distinct().Count() == 1)
  4551. {
  4552. _logger.LogInformation("第3箱卡控同一机械手前面两箱都是同一目标地址,则不下第3箱任务" + taskstatus.GetDescription());
  4553. continue;
  4554. }
  4555. }
  4556. else if (item.Id > thirdbox)
  4557. {
  4558. _logger.LogInformation("同一机械手第3箱之后的待码垛任务不允许下发,码垛主表id:" + item.Id);
  4559. continue;
  4560. }
  4561. }
  4562. int takecount = int.Parse(AppSettings.GetConfig("FloorCount"));
  4563. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == item.Id).Count() < takecount)
  4564. {
  4565. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.Depth).Take(takecount);
  4566. if (!palletMach.Any())
  4567. {
  4568. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut3", new RedisErrorInfo() { Equip = "NoControlOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  4569. continue;
  4570. }
  4571. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  4572. var curdocid = maxdocid + 1;
  4573. if (palletMach.Any())
  4574. {
  4575. var pid = palletMach.First().PalletizingId;
  4576. 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)
  4577. {
  4578. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  4579. }
  4580. }
  4581. foreach (var pallets in palletMach)
  4582. {
  4583. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  4584. if (cell == null)
  4585. {
  4586. continue;
  4587. }
  4588. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4589. if (invs == null)
  4590. {
  4591. continue;
  4592. }
  4593. var root = DetermineRoot(pallets.Palletequip);
  4594. //先判断二升位是否能出库
  4595. if (cell.Depth == 2)
  4596. {
  4597. var respon = MoveTask(cell.Code);
  4598. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  4599. {
  4600. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut23", new RedisErrorInfo() { Equip = "NoControlOut23", Con = cell.Code + "库位下发移库任务失败,请检查一深货位状态", Time = DateTime.Now });
  4601. _logger.LogInformation(cell.Code + "库位下发移库任务失败,请检查一深货位状态");
  4602. continue;
  4603. }
  4604. }
  4605. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  4606. {
  4607. Code = pallets.ContBarCode,
  4608. CellCode = cell.Code,
  4609. Srm = cell.SCRel,
  4610. Tunnel = cell.Tunnel.ToString(),
  4611. Floor = cell.Floor,
  4612. Grade = invs.Grade,
  4613. Mater = invs.MatCode,
  4614. SkuCode = pallets.SkuCode,
  4615. PalletLayer = 0,
  4616. ProductMachCode = invs.ProductMachCode,
  4617. Equip = item.Equip,
  4618. PalletizingId = item.Id,
  4619. Robot = root,
  4620. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  4621. DocId = curdocid
  4622. });
  4623. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  4624. {
  4625. continue;
  4626. }
  4627. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  4628. {
  4629. Istask = 1,
  4630. Layer = 0
  4631. }, p => p.ContBarCode == invs.ContGrpBarCode);
  4632. }
  4633. //下完任务后将标识值加1
  4634. 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);
  4635. taskflag = taskflag + 1;
  4636. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set taskflag=" + taskflag + " where code='" + item.Equip + "'");
  4637. }
  4638. }
  4639. }
  4640. else
  4641. {
  4642. _palletizrepository.AsUpdateable()
  4643. .SetColumns(p => new Palletizing() { PalletizState = 0 })
  4644. .Where(p => p.Id == item.Id)
  4645. .ExecuteCommand();
  4646. }
  4647. }
  4648. }
  4649. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  4650. equiplist = equiplist.GetAvailablePalletizingStationsByConfiguration(_sysconfigrepository, "SPC_Palletizing");
  4651. var iscontinue = false;
  4652. foreach (var palletequip in equiplist.OrderByDescending(p => p.Default3).ThenBy(p => p.Default1))
  4653. {
  4654. if (string.IsNullOrEmpty(palletequip.Default1))
  4655. {
  4656. if (!string.IsNullOrEmpty(palletequip.Default3))//Default3是绑定的托盘搬运任务的id,对应预锁库存标识
  4657. {
  4658. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4659. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4660. if (preinvlist.Any())
  4661. {
  4662. //机械手交叉下任务需求
  4663. //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)
  4664. //{
  4665. // 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();
  4666. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4667. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4668. // {
  4669. // }
  4670. // else
  4671. // {
  4672. // iscontinue = false;
  4673. // continue;
  4674. // }
  4675. //}
  4676. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4677. 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)
  4678. {
  4679. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4680. 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();
  4681. if (minequ != null)
  4682. {
  4683. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4684. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4685. {
  4686. }
  4687. else
  4688. {
  4689. iscontinue = false;
  4690. continue;
  4691. }
  4692. }
  4693. }
  4694. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4695. {
  4696. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4697. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4698. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4699. return res;
  4700. }
  4701. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4702. //码垛信息校验
  4703. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  4704. {
  4705. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4706. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  4707. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  4708. return res;
  4709. }
  4710. var root = DetermineRoot(palletequip.Code);
  4711. var pallet = new Palletizing()
  4712. {
  4713. PalletMax = rule.FullCountQty,
  4714. PalletizState = 0,
  4715. Equip = palletequip.Code,
  4716. Finish = 0,
  4717. AddWho = "",
  4718. EditWho = "",
  4719. BoxRule = rule.PackRule,
  4720. BoxRuleId = rule.Id,
  4721. IsControlpanel = false,
  4722. TaskNum = int.Parse(palletequip.Default3),
  4723. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4724. Robot = root
  4725. };
  4726. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4727. if (pallects.Id == 0)
  4728. {
  4729. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4730. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4731. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4732. return res;
  4733. }
  4734. var palletizId = pallects.Id;
  4735. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4736. {
  4737. ZXStateCode = 1
  4738. }, p => p.Id == rule.Id);
  4739. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4740. foreach (var invs in preinvlist)
  4741. {
  4742. var palletlayer = new PalletLayerMath()
  4743. {
  4744. PalletizingId = palletizId,
  4745. ContGrpId = (long)invs.ContGrpId,
  4746. ContBarCode = invs.ContGrpBarCode,
  4747. Layer = 0,
  4748. SkuCode = rule.SkuCode,
  4749. Finish = 0,
  4750. PboxruleId = rule.Id,
  4751. Istask = 0,
  4752. Palletequip = palletequip.Code,
  4753. Depth = invs.Depth,
  4754. IsBlack = invs.IsBlack,
  4755. SolderCount = invs.SolderCount,
  4756. BoxCode = rule.PBoxCode,
  4757. Wbgroup = invs.WbGroupCode,
  4758. StockDonse = invs.InDocsNo,
  4759. BoxDonse = rule.DocsNo
  4760. };
  4761. math.Add(palletlayer);
  4762. }
  4763. _palletlayerMathrepository.InsertRange(math);
  4764. //把库存预锁标志更新掉
  4765. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4766. {
  4767. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4768. BomMatCode = "",
  4769. PreStock = "1"
  4770. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4771. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4772. res.ResMsg = "非控制捞取预锁库存处理成功";
  4773. return res;
  4774. }
  4775. else
  4776. {
  4777. iscontinue = false;
  4778. continue;
  4779. }
  4780. }
  4781. if (string.IsNullOrEmpty(palletequip.Cache1State))
  4782. {
  4783. iscontinue = true;
  4784. break;
  4785. }
  4786. else
  4787. {
  4788. iscontinue = false;
  4789. continue;
  4790. }
  4791. }
  4792. else
  4793. {
  4794. if (!string.IsNullOrEmpty(palletequip.Default3))
  4795. {
  4796. //根据码垛工位找任务,找到则下任务,找不到则继续执行
  4797. var preinvlist = _billInvnowrepository.GetList(p => p.BomMatCode == palletequip.Default3 && p.BomSetId == 0 && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  4798. if (preinvlist.Any())
  4799. {
  4800. //机械手交叉下任务需求
  4801. //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)
  4802. //{
  4803. // 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();
  4804. // if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4805. // && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4806. // {
  4807. // }
  4808. // else
  4809. // {
  4810. // iscontinue = false;
  4811. // continue;
  4812. // }
  4813. //}
  4814. //机械手交叉下任务需求,上一个码垛信息是该工位的,则跳过
  4815. 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)
  4816. {
  4817. //如果较小的工位已经没有任务那么,则继续下该工位任务
  4818. 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();
  4819. if (minequ != null)
  4820. {
  4821. if (string.IsNullOrEmpty(minequ.SContent) && string.IsNullOrEmpty(minequ.Default1) && string.IsNullOrEmpty(minequ.Default2) && string.IsNullOrEmpty(minequ.Default3)
  4822. && string.IsNullOrEmpty(minequ.Cache1State) && string.IsNullOrEmpty(minequ.Memo) && string.IsNullOrEmpty(minequ.Cache2State))
  4823. {
  4824. }
  4825. else
  4826. {
  4827. iscontinue = false;
  4828. continue;
  4829. }
  4830. }
  4831. }
  4832. if (preinvlist.Select(p => p.BomMatName).Distinct().Count() > 1)
  4833. {
  4834. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4835. res.ResMsg = palletequip.Code + "预锁库存中存在两个箱号,不允许下任务";
  4836. _logger.LogInformation(palletequip.Code + "预锁库存中存在两个箱号,不允许下任务");
  4837. return res;
  4838. }
  4839. var rule = _boxrulerepository.GetSingle(p => p.PBoxCode == preinvlist.First().BomMatName);
  4840. //码垛信息校验
  4841. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 2))
  4842. {
  4843. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4844. res.ResMsg = palletequip.Code + "已经存在待装箱未装箱中数据";
  4845. _logger.LogInformation(palletequip.Code + "已经存在待装箱未装箱中数据");
  4846. return res;
  4847. }
  4848. var root = DetermineRoot(palletequip.Code);
  4849. var pallet = new Palletizing()
  4850. {
  4851. PalletMax = rule.FullCountQty,
  4852. PalletizState = 2,
  4853. Equip = palletequip.Code,
  4854. Finish = 0,
  4855. AddWho = "",
  4856. EditWho = "",
  4857. BoxRule = rule.PackRule,
  4858. BoxRuleId = rule.Id,
  4859. IsControlpanel = false,
  4860. TaskNum = int.Parse(palletequip.Default3),
  4861. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  4862. Robot = root
  4863. };
  4864. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  4865. if (pallects.Id == 0)
  4866. {
  4867. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4868. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  4869. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  4870. return res;
  4871. }
  4872. var palletizId = pallects.Id;
  4873. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  4874. {
  4875. ZXStateCode = 1
  4876. }, p => p.Id == rule.Id);
  4877. List<PalletLayerMath> math = new List<PalletLayerMath>();
  4878. foreach (var invs in preinvlist)
  4879. {
  4880. var palletlayer = new PalletLayerMath()
  4881. {
  4882. PalletizingId = palletizId,
  4883. ContGrpId = (long)invs.ContGrpId,
  4884. ContBarCode = invs.ContGrpBarCode,
  4885. Layer = 0,
  4886. SkuCode = rule.SkuCode,
  4887. Finish = 0,
  4888. PboxruleId = rule.Id,
  4889. Istask = 0,
  4890. Palletequip = palletequip.Code,
  4891. Depth = invs.Depth,
  4892. IsBlack = invs.IsBlack,
  4893. SolderCount = invs.SolderCount,
  4894. BoxCode = rule.PBoxCode,
  4895. Wbgroup = invs.WbGroupCode,
  4896. StockDonse = invs.InDocsNo,
  4897. BoxDonse = rule.DocsNo
  4898. };
  4899. math.Add(palletlayer);
  4900. }
  4901. _palletlayerMathrepository.InsertRange(math);
  4902. //把库存预锁标志更新掉
  4903. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  4904. {
  4905. BomDocsNo = palletequip.Default3,//托盘的任务号,仅做记录使用,不参与逻辑;箱号记录在BomMatName
  4906. BomMatCode = "",
  4907. PreStock = "1"
  4908. }, p => preinvlist.Select(p => p.ContGrpBarCode).ToList().Contains(p.ContGrpBarCode));
  4909. _sysconfigrepository.Context.Ado.ExecuteCommand("update WMS_ZT_01CP.dbo.sys_config set default3='' where code='" + palletequip.Code + "'");
  4910. res.ResMsg = "非控制捞取预锁库存处理成功";
  4911. return res;
  4912. }
  4913. else
  4914. {
  4915. iscontinue = false;
  4916. continue;
  4917. }
  4918. }
  4919. else
  4920. {
  4921. if (string.IsNullOrEmpty(palletequip.Cache1State) && string.IsNullOrEmpty(palletequip.Memo))
  4922. {
  4923. iscontinue = true;
  4924. break;
  4925. }
  4926. else
  4927. {
  4928. iscontinue = false;
  4929. continue;
  4930. }
  4931. }
  4932. }
  4933. }
  4934. if (!iscontinue)
  4935. {
  4936. //判断缓存工位2是否有空余,并且缓存工位1的托盘要到位
  4937. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  4938. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  4939. var huancun1list = new List<string>() { "8089", "8091", "8095", "8097", "8306" };
  4940. if (!devices1.Where(p => huancun1list.Contains(p.deviceCode) && p.TaskCode > 0).Any())
  4941. {
  4942. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4943. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4944. res.ResMsg = "没有空闲的码垛工位";
  4945. return res;
  4946. }
  4947. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Cache2Task) && string.IsNullOrEmpty(p.Default3)).Any())
  4948. {
  4949. RedisHelper.Set("Sx:WMSErrorInfo:ControlOut4", new RedisErrorInfo() { Equip = "ControlOut4", Con = "没有空闲的码垛工位及缓存工位", Time = DateTime.Now });
  4950. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4951. res.ResMsg = "没有空闲的码垛工位";
  4952. return res;
  4953. }
  4954. }
  4955. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  4956. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  4957. if (!devices.Where(p => p.pH_STATUS == true).Any())
  4958. {
  4959. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut5", new RedisErrorInfo() { Equip = "NoControlOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  4960. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4961. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  4962. return res;
  4963. }
  4964. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  4965. var prerules = _boxrulerepository.GetList(p => p.ZXStateCode == 4 && p.PackRule == "SPC").OrderBy(p => p.EditTime);
  4966. if (prerules != null && prerules.Any())
  4967. {
  4968. foreach (var rule in prerules)
  4969. {
  4970. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  4971. List<string> equips = new List<string>();
  4972. foreach (var pp in sys)
  4973. {
  4974. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  4975. {
  4976. equips.Add(pp.Code);
  4977. }
  4978. }
  4979. if (!equips.Any())
  4980. {
  4981. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码", Time = DateTime.Now });
  4982. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码");
  4983. //自动更新子托盘配置
  4984. foreach (var item1 in sys)
  4985. {
  4986. if (!item1.SContent.Contains(rule.TrayCode))
  4987. {
  4988. string con = item1.SContent + "," + rule.TrayCode;
  4989. _sysconfigrepository.AsUpdateable()
  4990. .SetColumns(p => new sxSysConfig() { SContent = con })
  4991. .Where(p => p.Id == item1.Id)
  4992. .ExecuteCommand();
  4993. }
  4994. }
  4995. }
  4996. var invlist2 = _billInvnowrepository.GetList(p => p.PreStock == rule.Id.ToString() && p.InvStateCode == "InvEcecState_In");
  4997. if (!invlist2.Any())
  4998. {
  4999. _logger.LogInformation(rule.Id + "规则表预占数据没有查到对应库存信息");
  5000. continue;
  5001. }
  5002. var dev = devices.Where(p => equips.Contains(p.deviceCode)).ToList();
  5003. if (!dev.Any())
  5004. {
  5005. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut11", new RedisErrorInfo() { Equip = "NoControlOut11", Con = rule.TrayCode + "没有可用拆盘机", Time = DateTime.Now });
  5006. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), rule.TrayCode + "没有可用子托拆盘机,请及时补充子托盘;");
  5007. continue;
  5008. }
  5009. var robotlist = new List<string>() { "Robot1", "Robot2", "Robot3" }.GetAvailablePalletizingRobotsByConfiguration(_sysconfigrepository, "SPC_Palletizing");
  5010. sxSysConfig palletequip = null;
  5011. foreach (var robot in robotlist)
  5012. {
  5013. if (_sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用").Any())
  5014. {
  5015. var palletequiptemp = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack").Where(p => p.Robot == robot && p.AddWho != "禁用")
  5016. .ToList().GetAvailablePalletizingStationsByConfiguration(_sysconfigrepository, "SPC_Palletizing").OrderBy(p => p.TaskFlag).FirstOrDefault();
  5017. //码垛工位
  5018. if (string.IsNullOrEmpty(palletequiptemp.Default1) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5019. {
  5020. palletequip = palletequiptemp;
  5021. break;
  5022. }
  5023. //缓存工位1
  5024. else if (string.IsNullOrEmpty(palletequiptemp.Cache1State) && string.IsNullOrEmpty(palletequiptemp.Memo))
  5025. {
  5026. palletequip = palletequiptemp;
  5027. break;
  5028. }
  5029. //缓存工位2
  5030. else if (string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Cache2State) && string.IsNullOrEmpty(palletequiptemp.Default3))
  5031. {
  5032. var equlist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDevicePalletizingEquip", JsonConvert.SerializeObject(""));
  5033. var devices1 = JsonConvert.DeserializeObject<List<DevincePh1>>(equlist);
  5034. var code = (int.Parse(palletequiptemp.Code) - 1).ToString();
  5035. if (devices1.Where(p => p.deviceCode == code && p.TaskCode > 0).Any())//缓存工位1的托盘必须到位,防止托盘输送任务排序错乱
  5036. {
  5037. palletequip = palletequiptemp;
  5038. break;
  5039. }
  5040. }
  5041. }
  5042. }
  5043. if (palletequip == null)
  5044. {
  5045. res.ResMsg = "没有空闲的码垛工位";
  5046. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5047. return res;
  5048. }
  5049. int acttype = 0;
  5050. //判断是缓存工位锁定库存还是码垛工位直接下任务
  5051. if (string.IsNullOrEmpty(palletequip.Default1))
  5052. {
  5053. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5054. {
  5055. acttype = 1;//直接执行下任务
  5056. }
  5057. else
  5058. {
  5059. //等待下一轮循环,往math表插数据放在前面
  5060. res.ResMsg = "等待下一轮循环";
  5061. return res;
  5062. }
  5063. }
  5064. else
  5065. {
  5066. if (string.IsNullOrEmpty(palletequip.Cache1State))
  5067. {
  5068. //判断码垛工位的任务号是否锁定了库存,如果有则不做操作,等待下一轮循环
  5069. if (!string.IsNullOrEmpty(palletequip.Default3))
  5070. {
  5071. res.ResMsg = "等待下一轮循环";
  5072. return res;
  5073. }
  5074. else
  5075. {
  5076. acttype = 2;//预锁库存
  5077. }
  5078. }
  5079. else
  5080. {
  5081. //判断缓存工位2(缓存工位1的托盘要到位之后)
  5082. if (string.IsNullOrEmpty(palletequip.Cache2State) && string.IsNullOrEmpty(palletequip.Cache2Task))
  5083. {
  5084. //使用缓存2工位
  5085. acttype = 3;
  5086. }
  5087. else
  5088. {
  5089. res.ResMsg = "没有空闲的码垛工位";
  5090. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "没有空闲的码垛工位,无法出库码垛");
  5091. return res;
  5092. }
  5093. }
  5094. }
  5095. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = rule.TrayCode, WareHouse = "cphouse", Equip = palletequip.Code, Start = dev.First().deviceCode, ActType = acttype };
  5096. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  5097. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  5098. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5099. {
  5100. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut18", new RedisErrorInfo() { Equip = "NoControlOut18", Con = rule.TrayCode + trayres.ResMsg, Time = DateTime.Now });
  5101. res.ResCode = trayres.ResCode;
  5102. res.ResMsg = trayres.ResMsg;
  5103. return res;
  5104. }
  5105. if (acttype == 1)
  5106. {
  5107. //码垛信息校验
  5108. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  5109. {
  5110. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5111. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  5112. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  5113. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "已经存在未装箱中数据");
  5114. return res;
  5115. }
  5116. var root = DetermineRoot(palletequip.Code);
  5117. var pallet = new Palletizing()
  5118. {
  5119. PalletMax = rule.FullCountQty,
  5120. PalletizState = 0,
  5121. Equip = palletequip.Code,
  5122. Finish = 0,
  5123. AddWho = "",
  5124. EditWho = "",
  5125. BoxRule = rule.PackRule,
  5126. BoxRuleId = rule.Id,
  5127. IsControlpanel = false,
  5128. TaskNum = int.Parse(trayres.Memo1),
  5129. GoodsType = rule.SpoolType == "BS80/33" ? 1 : 2,
  5130. Robot = root
  5131. };
  5132. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  5133. if (pallects.Id == 0)
  5134. {
  5135. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5136. res.ResMsg = palletequip.Code + "装箱主表数据保存失败";
  5137. _logger.LogInformation(palletequip.Code + "装箱主表数据保存失败");
  5138. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), palletequip.Code + "装箱主表数据保存失败");
  5139. return res;
  5140. }
  5141. var palletizId = pallects.Id;
  5142. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5143. {
  5144. ZXStateCode = 1
  5145. }, p => p.Id == rule.Id);
  5146. List<PalletLayerMath> math = new List<PalletLayerMath>();
  5147. foreach (var invs in invlist2)
  5148. {
  5149. var palletlayer = new PalletLayerMath()
  5150. {
  5151. PalletizingId = palletizId,
  5152. ContGrpId = (long)invs.ContGrpId,
  5153. ContBarCode = invs.ContGrpBarCode,
  5154. Layer = 0,
  5155. SkuCode = rule.SkuCode,
  5156. Finish = 0,
  5157. PboxruleId = rule.Id,
  5158. Istask = 0,
  5159. Palletequip = palletequip.Code,
  5160. IsBlack = invs.IsBlack,
  5161. Depth = invs.Depth,
  5162. SolderCount = invs.SolderCount,
  5163. BoxCode = rule.PBoxCode,
  5164. StockDonse = invs.InDocsNo,
  5165. Wbgroup = invs.WbGroupCode,
  5166. BoxDonse = rule.DocsNo
  5167. };
  5168. math.Add(palletlayer);
  5169. }
  5170. _palletlayerMathrepository.InsertRange(math);
  5171. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5172. {
  5173. PreStock = "1"
  5174. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  5175. res.ResCode = 200;
  5176. res.ResMsg = "成功";
  5177. return res;
  5178. }
  5179. else if (acttype == 2 || acttype == 3)//缓存工位1,2
  5180. {
  5181. var codes = new List<string>();
  5182. codes.AddRange(invlist2.Select(p => p.ContGrpBarCode));
  5183. if (codes.Any())
  5184. {
  5185. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5186. {
  5187. PreStock = "1",
  5188. BomMatCode = trayres.Memo1,//预锁托盘任务id
  5189. BomMatName = rule.PBoxCode, //预锁的箱号
  5190. BomSetId = 0 //代表非控制箱标识
  5191. }, p => codes.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_In.ToString());
  5192. //锁定缓存工位
  5193. _logger.LogInformation(string.Format("非控制装箱预锁:托盘任务id{0},箱号{1},条码列表{2}", trayres.Memo1, rule.PBoxCode, JsonConvert.SerializeObject(codes)));
  5194. }
  5195. res.ResCode = 200;
  5196. res.ResMsg = "成功";
  5197. return res;
  5198. }
  5199. }
  5200. }
  5201. else
  5202. {
  5203. res.ResMsg = "没有预占状态的规则数据";
  5204. }
  5205. return res;
  5206. }
  5207. /// <summary>
  5208. /// 码垛SPC非控制装箱计算预占箱号-去掉黑盘和批次限制
  5209. /// </summary>
  5210. /// <param name="request"></param>
  5211. /// <returns></returns>
  5212. public SRes PalletizingSpcNotPackRulePre2(PalletizingPackStockOutRequest request)
  5213. {
  5214. var res = new SRes();
  5215. int precount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "PreBoxNum").SContent);
  5216. if (_boxrulerepository.Count(p => p.ZXStateCode > 2 && p.PackRule == "SPC") > precount)
  5217. {
  5218. res.ResMsg = "预占箱数已经大于设置值";
  5219. return res;
  5220. }
  5221. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));//超时时间配置
  5222. //获取库存列表
  5223. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  5224. 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")
  5225. && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  5226. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  5227. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  5228. on stock.InDocsNo equals rule1.DocsNo
  5229. select new StockTemp
  5230. {
  5231. MatCode = stock.MatCode,
  5232. InvBarCode = stock.InvBarCode,
  5233. Grade = stock.Grade,
  5234. InvStateCode = stock.InvStateCode,
  5235. ProductTime = stock.ProductTime,
  5236. WbGroupCode = stock.WbGroupCode,
  5237. IsTorsChk = stock.IsTorsChk,
  5238. TorsChkQty = stock.TorsChkQty,
  5239. TorsChkValue = stock.TorsChkValue,
  5240. HoldTime = stock.HoldTime,
  5241. ProductMachCode = stock.ProductMachCode,
  5242. IsControlpanel = stock.IsControlpanel,
  5243. HWTypeCode = stock.HWTypeCode,
  5244. SolderCount = stock.SolderCount,
  5245. IsRework = stock.IsRework,
  5246. IsBlack = stock.IsBlack,
  5247. Col = loc.Col,
  5248. Layer = loc.Layer,
  5249. Shelf = loc.Shelf,
  5250. Depth = loc.Depth,
  5251. Code = loc.Code,
  5252. Tunnel = loc.Tunnel,
  5253. SCRel = loc.SCRel,
  5254. Floor = loc.Floor,
  5255. WarehouseCode = loc.WarehouseCode,
  5256. ContGrpBarCode = loc.ContGrpBarCode,
  5257. ContGrpId = loc.ContGrpId,
  5258. Id = loc.Id,
  5259. StateNum = loc.StateNum,
  5260. SkuCode = rule1.SkuCode,
  5261. Wind = stock.Wind,
  5262. InDocsNo = stock.InDocsNo,
  5263. BatchNo = stock.BatchNo
  5264. };
  5265. var invlistchognrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  5266. 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")
  5267. && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  5268. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  5269. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  5270. on stock.InDocsNo equals rule1.DocsNo
  5271. select new StockTemp
  5272. {
  5273. MatCode = stock.MatCode,
  5274. InvBarCode = stock.InvBarCode,
  5275. Grade = stock.Grade,
  5276. InvStateCode = stock.InvStateCode,
  5277. ProductTime = stock.ProductTime,
  5278. WbGroupCode = stock.WbGroupCode,
  5279. IsTorsChk = stock.IsTorsChk,
  5280. TorsChkQty = stock.TorsChkQty,
  5281. TorsChkValue = stock.TorsChkValue,
  5282. HoldTime = stock.HoldTime,
  5283. ProductMachCode = stock.ProductMachCode,
  5284. IsControlpanel = stock.IsControlpanel,
  5285. HWTypeCode = stock.HWTypeCode,
  5286. SolderCount = stock.SolderCount,
  5287. IsRework = stock.IsRework,
  5288. IsBlack = stock.IsBlack,
  5289. Col = loc.Col,
  5290. Layer = loc.Layer,
  5291. Shelf = loc.Shelf,
  5292. Depth = loc.Depth,
  5293. Code = loc.Code,
  5294. Tunnel = loc.Tunnel,
  5295. SCRel = loc.SCRel,
  5296. Floor = loc.Floor,
  5297. WarehouseCode = loc.WarehouseCode,
  5298. ContGrpBarCode = loc.ContGrpBarCode,
  5299. ContGrpId = loc.ContGrpId,
  5300. Id = loc.Id,
  5301. StateNum = loc.StateNum,
  5302. SkuCode = rule1.SkuCode,
  5303. Wind = stock.Wind,
  5304. InDocsNo = stock.InDocsNo,
  5305. BatchNo = stock.BatchNo
  5306. };
  5307. //查找满足时效但是没有全部检测完成的盘所在的机器组
  5308. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  5309. 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")
  5310. && p.ContUsageQty <= 0 && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours)
  5311. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  5312. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  5313. on stock.InDocsNo equals rule1.DocsNo
  5314. select new StockTemp
  5315. {
  5316. MatCode = stock.MatCode,
  5317. InvBarCode = stock.InvBarCode,
  5318. Grade = stock.Grade,
  5319. InvStateCode = stock.InvStateCode,
  5320. ProductTime = stock.ProductTime,
  5321. WbGroupCode = stock.WbGroupCode,
  5322. IsTorsChk = stock.IsTorsChk,
  5323. TorsChkQty = stock.TorsChkQty,
  5324. TorsChkValue = stock.TorsChkValue,
  5325. HoldTime = stock.HoldTime,
  5326. ProductMachCode = stock.ProductMachCode,
  5327. IsControlpanel = stock.IsControlpanel,
  5328. HWTypeCode = stock.HWTypeCode,
  5329. SolderCount = stock.SolderCount,
  5330. IsRework = stock.IsRework,
  5331. IsBlack = stock.IsBlack,
  5332. Col = loc.Col,
  5333. Layer = loc.Layer,
  5334. Shelf = loc.Shelf,
  5335. Depth = loc.Depth,
  5336. Code = loc.Code,
  5337. Tunnel = loc.Tunnel,
  5338. SCRel = loc.SCRel,
  5339. Floor = loc.Floor,
  5340. WarehouseCode = loc.WarehouseCode,
  5341. ContGrpBarCode = loc.ContGrpBarCode,
  5342. ContGrpId = loc.ContGrpId,
  5343. Id = loc.Id,
  5344. StateNum = loc.StateNum,
  5345. SkuCode = rule1.SkuCode,
  5346. Wind = stock.Wind,
  5347. InDocsNo = stock.InDocsNo,
  5348. BatchNo = stock.BatchNo
  5349. };
  5350. var invlistTorschongrao = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  5351. 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")
  5352. && p.ContUsageQty <= 0 && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours)
  5353. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  5354. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  5355. on stock.InDocsNo equals rule1.DocsNo
  5356. select new StockTemp
  5357. {
  5358. MatCode = stock.MatCode,
  5359. InvBarCode = stock.InvBarCode,
  5360. Grade = stock.Grade,
  5361. InvStateCode = stock.InvStateCode,
  5362. ProductTime = stock.ProductTime,
  5363. WbGroupCode = stock.WbGroupCode,
  5364. IsTorsChk = stock.IsTorsChk,
  5365. TorsChkQty = stock.TorsChkQty,
  5366. TorsChkValue = stock.TorsChkValue,
  5367. HoldTime = stock.HoldTime,
  5368. ProductMachCode = stock.ProductMachCode,
  5369. IsControlpanel = stock.IsControlpanel,
  5370. HWTypeCode = stock.HWTypeCode,
  5371. SolderCount = stock.SolderCount,
  5372. IsRework = stock.IsRework,
  5373. IsBlack = stock.IsBlack,
  5374. Col = loc.Col,
  5375. Layer = loc.Layer,
  5376. Shelf = loc.Shelf,
  5377. Depth = loc.Depth,
  5378. Code = loc.Code,
  5379. Tunnel = loc.Tunnel,
  5380. SCRel = loc.SCRel,
  5381. Floor = loc.Floor,
  5382. WarehouseCode = loc.WarehouseCode,
  5383. ContGrpBarCode = loc.ContGrpBarCode,
  5384. ContGrpId = loc.ContGrpId,
  5385. Id = loc.Id,
  5386. StateNum = loc.StateNum,
  5387. SkuCode = rule1.SkuCode,
  5388. Wind = stock.Wind,
  5389. InDocsNo = stock.InDocsNo,
  5390. BatchNo = stock.BatchNo
  5391. };
  5392. invlist = invlist.Union(invlistchognrao);
  5393. invlist = invlist.Union(invlistTors);
  5394. invlist = invlist.Union(invlistTorschongrao);
  5395. if (!invlist.Any())
  5396. {
  5397. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  5398. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5399. res.ResMsg = "库存不足";
  5400. return res;
  5401. }
  5402. //invlist = invlist.Where(p => p.WbGroupCode == "A14" && p.Wind == "R");
  5403. invlist = invlist.Distinct(new CompareStock());
  5404. //禁用巷道过滤
  5405. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  5406. if (tunlist.Any())
  5407. {
  5408. if (tunlist.Where(p => p.Default2 == "1").Any())
  5409. {
  5410. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  5411. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  5412. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  5413. }
  5414. if (tunlist.Where(p => p.Default2 == "2").Any())
  5415. {
  5416. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  5417. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  5418. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  5419. }
  5420. if (tunlist.Where(p => p.Default2 == "3").Any())
  5421. {
  5422. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  5423. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  5424. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  5425. }
  5426. }
  5427. if (!invlist.Any())
  5428. {
  5429. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘禁用巷道后 | 库存不足", Time = DateTime.Now });
  5430. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5431. res.ResMsg = "禁用巷道后 | 库存不足";
  5432. return res;
  5433. }
  5434. var invlist2 = invlist;
  5435. var sku = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.SkuCode).ToList();
  5436. if (!sku.Any())
  5437. {
  5438. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut7", new RedisErrorInfo() { Equip = "NoControlOut7", Con = "库中没有SKU或SKU不能为空", Time = DateTime.Now });
  5439. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5440. res.ResMsg = "库中没有SKU或SKU不能为空";
  5441. return res;
  5442. }
  5443. var rulelist = _boxrulerepository.GetList(p => p.ZXStateCode == 0 && p.PackRule == "SPC" && !string.IsNullOrEmpty(p.Wind) && (p.FullCountQty == 72 || p.FullCountQty == 36));
  5444. if (!rulelist.Any())
  5445. {
  5446. string msg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  5447. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut8", new RedisErrorInfo() { Equip = "NoControlOut8", Con = msg, Time = DateTime.Now });
  5448. _logger.LogInformation("非控制不满足装箱:" + msg);
  5449. WreTimeOutRecord(invlist.Select(p => p.ContGrpBarCode).ToList(), "没有箱号可以使用,单号:" + JsonConvert.SerializeObject(invlist.GroupBy(v => v.InDocsNo).Select(p => p.Key).Distinct().ToList()));
  5450. res.ResCode = ResponseStatusCodeEnum.NotBoxRule.GetHashCode();
  5451. res.ResMsg = "SPC" + ResponseStatusCodeEnum.NotBoxRule.GetDescription();
  5452. return res;
  5453. }
  5454. //SKU循环
  5455. foreach (var item in sku)
  5456. {
  5457. //满足sku下的箱号列表
  5458. 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);
  5459. if (!rules.Any())
  5460. {
  5461. string msg = "SKU:" + item.Key + ",没有可用箱号";
  5462. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut9", new RedisErrorInfo() { Equip = "NoControlOut9", Con = msg, Time = DateTime.Now });
  5463. _logger.LogInformation("非控制不满足装箱:" + msg);
  5464. res.ResMsg = msg;
  5465. 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()));
  5466. continue;
  5467. }
  5468. var rulegroup = rules.GroupBy(p => new
  5469. {
  5470. p.Wind,
  5471. p.SpoolType,
  5472. p.FullCountQty
  5473. }).ToList();
  5474. //绕向、工字轮循环
  5475. foreach (var rulestem in rulegroup)
  5476. {
  5477. // 满足sku、绕向、工字轮规格、满箱个数的箱号列表
  5478. 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();
  5479. //拆盘机配置,可用于禁用拆盘机
  5480. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  5481. List<string> equips = new List<string>();
  5482. foreach (var pp in sys)
  5483. {
  5484. if (pp.SContent.Split(",").Contains(rule.TrayCode))
  5485. {
  5486. equips.Add(pp.Code);
  5487. }
  5488. }
  5489. if (!equips.Any())
  5490. {
  5491. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut10", new RedisErrorInfo() { Equip = "NoControlOut10", Con = rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key, Time = DateTime.Now });
  5492. _logger.LogInformation(rule.TrayCode + "当前子托盘没有配置,请先配置子托盘编码" + "SKU:" + item.Key);
  5493. //自动更新子托盘配置,不需要手动配置
  5494. foreach (var item1 in sys)
  5495. {
  5496. if (!item1.SContent.Contains(rule.TrayCode))
  5497. {
  5498. string con = item1.SContent + "," + rule.TrayCode;
  5499. _sysconfigrepository.AsUpdateable()
  5500. .SetColumns(p => new sxSysConfig() { SContent = con })
  5501. .Where(p => p.Id == item1.Id)
  5502. .ExecuteCommand();
  5503. }
  5504. }
  5505. continue;
  5506. }
  5507. if (rule.SkuCode == "6210010401" || rule.SkuCode == "6210120101")
  5508. {
  5509. var wbgroup = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime);
  5510. if (!wbgroup.Any())
  5511. {
  5512. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空1", Time = DateTime.Now });
  5513. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空1");
  5514. continue;
  5515. }
  5516. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  5517. //invlist2 = invlistchongrao.Union(invlist2);
  5518. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  5519. {
  5520. }
  5521. else
  5522. {
  5523. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + "999999999999" + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  5524. continue;
  5525. }
  5526. if (!string.IsNullOrEmpty(rule.SpoolType))
  5527. {
  5528. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  5529. }
  5530. if (!string.IsNullOrEmpty(rule.Wind))
  5531. {
  5532. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  5533. }
  5534. #region 焊点相关处理
  5535. var tempoutrecord = invlist2.ToList();
  5536. var solderinvlist = SxServiceHelp.ProcessWeldingPointsBoxing(rule, invlist2, out invlist2);
  5537. #endregion 焊点相关处理
  5538. var returninvlist = new List<StockTemp>();
  5539. if (rule.ReturnCount > 0)
  5540. {
  5541. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  5542. invlist2 = invlist2.Where(p => p.IsRework == false);
  5543. }
  5544. else
  5545. {
  5546. invlist2 = invlist2.Where(p => p.IsRework == false);
  5547. }
  5548. if (!invlist2.Any())
  5549. {
  5550. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  5551. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  5552. _logger.LogInformation("非控制不满足装箱:" + msg);
  5553. res.ResMsg = msg;
  5554. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + "999999999999" + ",绕向:" + rule.Wind);
  5555. continue;
  5556. }
  5557. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count) < rule.FullCountQty)
  5558. {
  5559. string msg = "sku:" + rule.SkuCode + ",机器组:" + "999999999999" + ",绕向:" + rule.Wind + ",型号:" + invlist2.First().HWTypeCode + ",SPC非控制箱不满足装箱数量,需要装" + rule.FullCountQty + "实际数量:" + (invlist2.Count() + solderinvlist.Count + returninvlist.Count) + ";普通盘" + invlist2.Count() + ",焊点盘" + solderinvlist.Count + ",返工盘" + returninvlist.Count;
  5560. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  5561. _logger.LogInformation("非控制不满足装箱:" + msg);
  5562. res.ResMsg = msg;
  5563. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  5564. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5565. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5566. continue;
  5567. }
  5568. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  5569. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 72); //72小时之内的按堆垛机平均分
  5570. #region 按照堆垛机平均分配任务,6小时之内
  5571. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count);//符合条件的普通盘数量
  5572. var mastinvlist = solderinvlist.Union(returninvlist);
  5573. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  5574. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  5575. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  5576. select new SrmTaskTmep
  5577. {
  5578. Srm = x.Key,
  5579. TaskCount = x.Count(),
  5580. LocList = x.Select(q => q.Code).ToList()
  5581. };
  5582. var srmtasktobe = new List<SrmTaskTmep>();
  5583. foreach (var srmlistitem in srmlist)
  5584. {
  5585. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  5586. {
  5587. srmtasktobe.Add(new SrmTaskTmep()
  5588. {
  5589. Srm = srmlistitem,
  5590. TaskCount = 0,
  5591. LocList = new List<string>()
  5592. });
  5593. }
  5594. }
  5595. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  5596. var srmtasktobetemplocs = new List<string>();
  5597. for (int i = 0; i < tempcount; i++)
  5598. {
  5599. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  5600. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  5601. foreach (var srmtasktobeitem in srmtasktobe)
  5602. {
  5603. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  5604. {
  5605. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  5606. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  5607. srmtasktobetemplocs.Add(first.Code);
  5608. break;
  5609. }
  5610. }
  5611. }
  5612. #endregion 按照堆垛机平均分配任务,6小时之内
  5613. var tempbuchong = new List<StockTemp>();
  5614. if (tempcount > srmtasktobetemplocs.Count())
  5615. {
  5616. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  5617. }
  5618. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count));
  5619. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist);
  5620. invlist2 = invlist2.Union(tempbuchong);
  5621. var finstocks = invlist2.ToList();
  5622. //最后验证数据
  5623. #region 最后验证数据
  5624. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  5625. {
  5626. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5627. continue;
  5628. }
  5629. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  5630. {
  5631. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5632. continue;
  5633. }
  5634. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  5635. {
  5636. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5637. continue;
  5638. }
  5639. //if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  5640. //{
  5641. // _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5642. // continue;
  5643. //}
  5644. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  5645. {
  5646. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5647. continue;
  5648. }
  5649. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  5650. {
  5651. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5652. continue;
  5653. }
  5654. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  5655. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  5656. {
  5657. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5658. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  5659. continue;
  5660. }
  5661. #endregion 最后验证数据
  5662. #region Mes箱号校验
  5663. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  5664. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  5665. var reqids = Guid.NewGuid().ToString();
  5666. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  5667. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  5668. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  5669. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  5670. if (mesresponse.success == false)
  5671. {
  5672. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5673. {
  5674. ZXStateCode = 2,
  5675. EditTime = DateTime.Now,
  5676. Memo = mesresponse.message
  5677. }, p => p.Id == rule.Id);
  5678. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  5679. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5680. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  5681. _logger.LogInformation(res.ResMsg);
  5682. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  5683. break;
  5684. }
  5685. else
  5686. {
  5687. try
  5688. {
  5689. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  5690. _db.BeginTran();
  5691. //非控制箱预占状态更新成4
  5692. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5693. {
  5694. ZXStateCode = 4,
  5695. EditTime = DateTime.Now,
  5696. Memo = mesresponse.message
  5697. }, p => p.Id == rule.Id);
  5698. var presign = rule.Id.ToString();
  5699. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5700. {
  5701. PreStock = presign,
  5702. EditTime = DateTime.Now,
  5703. Memo = "箱号预占用:" + rule.PBoxCode
  5704. }, p => listid.Contains(p.ContGrpId));
  5705. _db.CommitTran();
  5706. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  5707. }
  5708. catch (Exception ex)
  5709. {
  5710. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  5711. _db.RollbackTran();
  5712. }
  5713. return res;
  5714. }
  5715. #endregion Mes箱号校验
  5716. }
  5717. else
  5718. {
  5719. var wbgrouplist = invlist.Where(p => p.SkuCode == rule.SkuCode).OrderBy(p => p.ProductTime).GroupBy(p => p.WbGroupCode);
  5720. if (!wbgrouplist.Any())
  5721. {
  5722. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut12", new RedisErrorInfo() { Equip = "NoControlOut12", Con = "SKU:" + rule.SkuCode + "下的库存机器组不能为空", Time = DateTime.Now });
  5723. WreTimeOutRecord(invlist.Where(p => p.SkuCode == rule.SkuCode).Select(p => p.ContGrpBarCode).ToList(), "条码信息机器组为空");
  5724. continue;
  5725. }
  5726. ;
  5727. //机器组循环
  5728. foreach (var wbgroup in wbgrouplist)
  5729. {
  5730. invlist2 = invlist.Where(p => p.SkuCode == item.Key && p.WbGroupCode == wbgroup.Key && p.HWTypeCode == rule.SpoolType && p.Wind == rule.Wind);
  5731. //invlist2 = invlistchongrao.Union(invlist2);
  5732. if (invlist2.Any() && invlist2.Count() >= rule.FullCountQty)
  5733. {
  5734. }
  5735. else
  5736. {
  5737. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "不满足装箱数量,数量为" + invlist2.Count() + ",SKU:" + item.Key + ",机器组;" + wbgroup.Key + ",型号:" + rule.SpoolType + ",绕向:" + rule.Wind);
  5738. continue;
  5739. }
  5740. if (!string.IsNullOrEmpty(rule.SpoolType))
  5741. {
  5742. invlist2 = invlist2.Where(p => p.HWTypeCode == rule.SpoolType);
  5743. }
  5744. if (!string.IsNullOrEmpty(rule.Wind))
  5745. {
  5746. invlist2 = invlist2.Where(p => p.Wind == rule.Wind);
  5747. }
  5748. #region 焊点相关处理
  5749. var tempoutrecord = invlist2.ToList();
  5750. var solderinvlist = SxServiceHelp.ProcessWeldingPointsBoxing(rule, invlist2, out invlist2);
  5751. #endregion 焊点相关处理
  5752. var returninvlist = new List<StockTemp>();
  5753. if (rule.ReturnCount > 0)
  5754. {
  5755. returninvlist = invlist2.Where(p => p.IsRework == true).Take(rule.ReturnCount).ToList();
  5756. invlist2 = invlist2.Where(p => p.IsRework == false);
  5757. }
  5758. else
  5759. {
  5760. invlist2 = invlist2.Where(p => p.IsRework == false);
  5761. }
  5762. if (!invlist2.Any())
  5763. {
  5764. string msg = "SPC非控制箱不满足装箱规则,箱号:" + rule.PBoxCode + "sku:" + rule.SkuCode;
  5765. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut15", new RedisErrorInfo() { Equip = "NoControlOut15", Con = msg, Time = DateTime.Now });
  5766. _logger.LogInformation("非控制不满足装箱:" + msg);
  5767. res.ResMsg = msg;
  5768. WreTimeOutRecord(tempoutrecord.Select(p => p.ContGrpBarCode).ToList(), "焊点不满足," + "SKU:" + rule.SkuCode + ",机器组:" + tempoutrecord.First().WbGroupCode + ",绕向:" + rule.Wind);
  5769. continue;
  5770. }
  5771. if ((invlist2.Count() + solderinvlist.Count + returninvlist.Count) < rule.FullCountQty)
  5772. {
  5773. 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;
  5774. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut16", new RedisErrorInfo() { Equip = "NoControlOut16", Con = msg, Time = DateTime.Now });
  5775. _logger.LogInformation("非控制不满足装箱:" + msg);
  5776. res.ResMsg = msg;
  5777. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), msg);
  5778. WreTimeOutRecord(returninvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5779. WreTimeOutRecord(solderinvlist.Select(p => p.ContGrpBarCode).ToList(), msg);
  5780. continue;
  5781. }
  5782. var firstproducttime = invlist2.OrderBy(p => p.ProductTime).First().ProductTime;
  5783. var invlist2temp6hours = invlist2.ToList().Where(p => (p.ProductTime - firstproducttime).TotalHours <= 72); //72小时之内的按堆垛机平均分
  5784. #region 按照堆垛机平均分配任务,6小时之内
  5785. var tempcount = rule.FullCountQty - (solderinvlist.Count + returninvlist.Count);//符合条件的普通盘数量
  5786. var mastinvlist = solderinvlist.Union(returninvlist);
  5787. var tempinvlist = invlist2temp6hours.Union(mastinvlist);
  5788. var srmlist = tempinvlist.Select(p => p.SCRel).Distinct();//总共多少个堆垛机
  5789. var mustsrmtasktobe = from x in mastinvlist.GroupBy(p => p.SCRel)
  5790. select new SrmTaskTmep
  5791. {
  5792. Srm = x.Key,
  5793. TaskCount = x.Count(),
  5794. LocList = x.Select(q => q.Code).ToList()
  5795. };
  5796. var srmtasktobe = new List<SrmTaskTmep>();
  5797. foreach (var srmlistitem in srmlist)
  5798. {
  5799. if (!mustsrmtasktobe.Where(p => p.Srm == srmlistitem).Any())
  5800. {
  5801. srmtasktobe.Add(new SrmTaskTmep()
  5802. {
  5803. Srm = srmlistitem,
  5804. TaskCount = 0,
  5805. LocList = new List<string>()
  5806. });
  5807. }
  5808. }
  5809. srmtasktobe.AddRange(mustsrmtasktobe);//所有堆垛机任务数量,接占用的库位数
  5810. var srmtasktobetemplocs = new List<string>();
  5811. for (int i = 0; i < tempcount; i++)
  5812. {
  5813. srmtasktobe = srmtasktobe.OrderBy(p => p.LocList.Count).ToList();//堆垛机任务排序,少的优先
  5814. var templocs = srmtasktobe.SelectMany(q => q.LocList);
  5815. foreach (var srmtasktobeitem in srmtasktobe)
  5816. {
  5817. if (tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).Any())
  5818. {
  5819. var first = tempinvlist.Where(p => !templocs.Contains(p.Code) && srmtasktobeitem.Srm == p.SCRel).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).First();
  5820. srmtasktobe.Where(p => p.Srm == srmtasktobeitem.Srm).First().LocList.Add(first.Code);
  5821. srmtasktobetemplocs.Add(first.Code);
  5822. break;
  5823. }
  5824. }
  5825. }
  5826. #endregion 按照堆垛机平均分配任务,6小时之内
  5827. var tempbuchong = new List<StockTemp>();
  5828. if (tempcount > srmtasktobetemplocs.Count())
  5829. {
  5830. tempbuchong = invlist2.Where(p => !srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(tempcount - srmtasktobetemplocs.Count()).ToList();
  5831. }
  5832. invlist2 = invlist2.Where(p => srmtasktobetemplocs.Contains(p.Code)).OrderBy(p => p.Depth).ThenBy(p => p.ProductTime).Take(rule.FullCountQty - (solderinvlist.Count + returninvlist.Count));
  5833. invlist2 = invlist2.Union(solderinvlist).Union(returninvlist);
  5834. invlist2 = invlist2.Union(tempbuchong);
  5835. var finstocks = invlist2.ToList();
  5836. //最后验证数据
  5837. #region 最后验证数据
  5838. if (finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpBarCode).Distinct().Count() != 72)
  5839. {
  5840. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpBarCode" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5841. continue;
  5842. }
  5843. if (finstocks.Select(p => p.ContGrpId).Distinct().Count() != 36 && finstocks.Select(p => p.ContGrpId).Distinct().Count() != 72)
  5844. {
  5845. _logger.LogInformation("非控制盘最终检查装箱数量不配置ContGrpId" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5846. continue;
  5847. }
  5848. if (finstocks.Select(p => p.Wind).Distinct().Count() > 1)
  5849. {
  5850. _logger.LogInformation("非控制盘最终检查装箱绕向大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5851. continue;
  5852. }
  5853. if (finstocks.Where(p => !string.IsNullOrWhiteSpace(p.WbGroupCode) && !p.InDocsNo.Contains("CHA")).Select(p => p.WbGroupCode).Distinct().Count() > 1)
  5854. {
  5855. _logger.LogInformation("非控制盘最终检查装箱机器组大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5856. continue;
  5857. }
  5858. if (finstocks.Select(p => p.HWTypeCode).Distinct().Count() > 1)
  5859. {
  5860. _logger.LogInformation("非控制盘最终检查装箱轮子种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5861. continue;
  5862. }
  5863. if (finstocks.Select(p => p.MatCode).Distinct().Count() > 1)
  5864. {
  5865. _logger.LogInformation("非控制盘最终检查物料种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5866. continue;
  5867. }
  5868. var docs = finstocks.Select(p => p.InDocsNo).Distinct().ToList();
  5869. if (_boxrulerepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PackRule == "SPC" && docs.Contains(p.DocsNo)).Select(p => p.SkuCode).Distinct().Count() > 1)
  5870. {
  5871. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + string.Format("{0},{1},{2},{3}", invlist2.First().WbGroupCode, invlist2.First().Wind, invlist2.First().SkuCode, invlist2.First().HWTypeCode));
  5872. _logger.LogInformation("非控制盘最终检查SKU种类大于1" + JsonConvert.SerializeObject(finstocks.Select(p => p.ContGrpBarCode).Distinct().ToList()));
  5873. continue;
  5874. }
  5875. #endregion 最后验证数据
  5876. #region Mes箱号校验
  5877. var boxmes = new MesBoxVerify() { HuNr = rule.PBoxCode, Batch = rule.BatchNo };
  5878. var url = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  5879. var reqids = Guid.NewGuid().ToString();
  5880. var reqs = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162003", requestId = reqids, TrackId = reqids, sourceCode = "163K" } };
  5881. var str = HttpUtil.PostRequest(url, JsonConvert.SerializeObject(boxmes), 30000, "UTF-8", "application/json", reqids, reqs.headers.sourceCode, reqs.headers.serviceCode);
  5882. var mesresponse = JsonConvert.DeserializeObject<TorschMesResponse>(str);
  5883. _logger.LogInformation("非控制装箱:申请箱号mes返回" + str);
  5884. if (mesresponse.success == false)
  5885. {
  5886. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5887. {
  5888. ZXStateCode = 2,
  5889. EditTime = DateTime.Now,
  5890. Memo = mesresponse.message
  5891. }, p => p.Id == rule.Id);
  5892. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut17", new RedisErrorInfo() { Equip = "NoControlOut17", Con = "非控制装箱mes申请箱号返回:" + mesresponse.message, Time = DateTime.Now });
  5893. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5894. res.ResMsg = "非控制装箱:申请箱号mes返回" + mesresponse.message;
  5895. _logger.LogInformation(res.ResMsg);
  5896. WreTimeOutRecord(invlist2.Select(p => p.ContGrpBarCode).ToList(), "非控制装箱:申请箱号mes返回" + mesresponse.message);
  5897. break;
  5898. }
  5899. else
  5900. {
  5901. try
  5902. {
  5903. var listid = finstocks.Select(p => p.ContGrpId).ToList();
  5904. _db.BeginTran();
  5905. //非控制箱预占状态更新成4
  5906. _boxrulerepository.UpdateSetColumnsTrue(p => new BillPboxrule()
  5907. {
  5908. ZXStateCode = 4,
  5909. EditTime = DateTime.Now,
  5910. Memo = mesresponse.message
  5911. }, p => p.Id == rule.Id);
  5912. var presign = rule.Id.ToString();
  5913. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  5914. {
  5915. PreStock = presign,
  5916. EditTime = DateTime.Now,
  5917. Memo = "箱号预占用:" + rule.PBoxCode
  5918. }, p => listid.Contains(p.ContGrpId));
  5919. _db.CommitTran();
  5920. _logger.LogInformation(rule.PBoxCode + "预占:" + JsonConvert.SerializeObject(listid));
  5921. }
  5922. catch (Exception ex)
  5923. {
  5924. _logger.LogInformation("箱号预占用异常" + ex.ToString());
  5925. _db.RollbackTran();
  5926. }
  5927. return res;
  5928. }
  5929. #endregion Mes箱号校验
  5930. }
  5931. }
  5932. }
  5933. }
  5934. return res;
  5935. }
  5936. private SRes PalletizingPackTask(PalletizingPackTaskRequest request)
  5937. {
  5938. return SxServiceHelp.PalletizingPackTask(request, _basewarecellrepository, _billInvnowrepository,
  5939. _billInvflow, _taskrepository, _wcstaskoldrepository, _taskdetailrepository, _db, _mapper, lockerPalletizingPackTask);
  5940. }
  5941. public SRes CancelTaskVerify(CancelTaskRequest request)
  5942. {
  5943. var res = new SRes();
  5944. if (!request.TaskNo.Any())
  5945. {
  5946. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  5947. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  5948. return res;
  5949. }
  5950. foreach (var item in request.TaskNo)
  5951. {
  5952. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == item && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  5953. if (task == null)
  5954. {
  5955. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  5956. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  5957. return res;
  5958. }
  5959. if (task.Type == TaskType.EnterDepot)
  5960. {
  5961. //验证组盘状态
  5962. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  5963. if (stock == null)
  5964. {
  5965. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  5966. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  5967. return res;
  5968. }
  5969. if (request.State == HandleTaskTypeEnum.完成任务)
  5970. {
  5971. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  5972. {
  5973. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  5974. res.ResMsg = stock.ContGrpBarCode + "不是已组盘状态,不允许完成";
  5975. return res;
  5976. }
  5977. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  5978. {
  5979. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  5980. res.ResMsg = stock.ContGrpBarCode + "组盘信息是已入库,请确认是否重复";
  5981. return res;
  5982. }
  5983. }
  5984. else if (request.State == HandleTaskTypeEnum.取消任务)
  5985. {
  5986. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  5987. {
  5988. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  5989. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.StockStateFail.GetDescription();
  5990. return res;
  5991. }
  5992. }
  5993. }
  5994. else if (task.Type == TaskType.OutDepot)
  5995. {
  5996. //验证组盘状态
  5997. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  5998. if (stock == null)
  5999. {
  6000. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6001. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6002. return res;
  6003. }
  6004. if (request.State == HandleTaskTypeEnum.完成任务)
  6005. {
  6006. if (stock.InvStateCode != InvState.InvEcecState_OutGoing.ToString())
  6007. {
  6008. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  6009. res.ResMsg = stock.ContGrpBarCode + "当前的组盘状态不是出库中,不允许完成";
  6010. return res;
  6011. }
  6012. }
  6013. else if (request.State == HandleTaskTypeEnum.取消任务)
  6014. {
  6015. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  6016. if (cell == null)
  6017. {
  6018. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6019. res.ResMsg = stock + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不支持取消";
  6020. return res;
  6021. }
  6022. if (stock.InvStateCode == InvState.InvEcecState_Out.ToString())
  6023. {
  6024. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  6025. res.ResMsg = ResponseStatusCodeEnum.StockStateFail.GetDescription();
  6026. return res;
  6027. }
  6028. }
  6029. }
  6030. else if (task.Type == TaskType.TransferDepot)
  6031. {
  6032. //验证组盘状态
  6033. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  6034. if (stock == null)
  6035. {
  6036. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6037. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6038. return res;
  6039. }
  6040. if (request.State == HandleTaskTypeEnum.完成任务)
  6041. {
  6042. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  6043. {
  6044. res.ResCode = ResponseStatusCodeEnum.RFIDStockStateFail.GetHashCode();
  6045. res.ResMsg = stock.ContGrpBarCode + "移库任务组盘信息不是已入库,不允许完成";
  6046. return res;
  6047. }
  6048. }
  6049. else if (request.State == HandleTaskTypeEnum.取消任务)
  6050. {
  6051. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  6052. res.ResMsg = stock.ContGrpBarCode + "移库任务不允许取消";
  6053. return res;
  6054. }
  6055. }
  6056. }
  6057. return res;
  6058. }
  6059. public SRes CarryTaskInfo(CancelTaskRequest request)
  6060. {
  6061. var res = new SRes();
  6062. if (!request.TaskNo.Any())
  6063. {
  6064. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  6065. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  6066. return res;
  6067. }
  6068. foreach (var item in request.TaskNo)
  6069. {
  6070. if (request.State == HandleTaskTypeEnum.完成任务)
  6071. {
  6072. var con = SrmCompleted(new SxCompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动完成任务", Memo1 = "", Memo2 = "" });
  6073. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  6074. {
  6075. return res = con;
  6076. }
  6077. }
  6078. if (request.State == HandleTaskTypeEnum.取消任务)
  6079. {
  6080. var con = CancelTask(new CompleteTaskRequest() { TaskNum = item, OperationType = 2, WCSUpdateName = "手动取消任务", Memo1 = "", Memo2 = "" });
  6081. if (con.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  6082. {
  6083. return res = con;
  6084. }
  6085. }
  6086. }
  6087. return res;
  6088. }
  6089. public SRes CancelTask(CompleteTaskRequest request)
  6090. {
  6091. var res = new SRes();
  6092. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  6093. if (task == null)
  6094. {
  6095. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6096. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6097. return res;
  6098. }
  6099. try
  6100. {
  6101. if (task.Type == TaskType.EnterDepot)
  6102. {
  6103. //验证组盘状态
  6104. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  6105. if (stock == null)
  6106. {
  6107. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6108. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6109. return res;
  6110. }
  6111. var flow = _mapper.Map<BillInvflow>(stock);
  6112. flow.Id = GetId();
  6113. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  6114. flow.Memo = "客户端取消入库任务";
  6115. flow.AddTime = DateTime.Now;
  6116. flow.EditTime = DateTime.Now;
  6117. _db.BeginTran();
  6118. _billInvnowrepository.DeleteById(stock.Id);
  6119. _billInvinitrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  6120. _billInvflow.Insert(flow);
  6121. _db.CommitTran();
  6122. }
  6123. else if (task.Type == TaskType.OutDepot)
  6124. {
  6125. //验证组盘状态
  6126. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  6127. if (stock == null)
  6128. {
  6129. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6130. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6131. return res;
  6132. }
  6133. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  6134. if (cell == null)
  6135. {
  6136. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6137. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() + "堆垛机已放货完成,不允许取消";
  6138. return res;
  6139. }
  6140. var flow = _mapper.Map<BillInvflow>(stock);
  6141. flow.Id = GetId();
  6142. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  6143. flow.Memo = "客户端取消出库任务";
  6144. flow.AddTime = DateTime.Now;
  6145. flow.EditTime = DateTime.Now;
  6146. _db.BeginTran();
  6147. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  6148. {
  6149. StateNum = LocationState.LocationState_Full,
  6150. EditTime = DateTime.Now
  6151. }, p => p.ContGrpBarCode == task.BarCode);
  6152. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6153. {
  6154. InvStateCode = InvState.InvEcecState_In.ToString(),
  6155. PutRow = cell.Row,
  6156. PutCol = cell.Col,
  6157. PutLayer = cell.Layer,
  6158. EditTime = DateTime.Now,
  6159. PreStock = ""//把预锁的标记去掉
  6160. }, p => p.ContGrpBarCode == task.BarCode);
  6161. //取消任务把响应的码垛信息表业删除
  6162. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  6163. _billInvflow.Insert(flow);
  6164. _db.CommitTran();
  6165. }
  6166. else
  6167. {
  6168. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6169. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消";
  6170. return res;
  6171. }
  6172. }
  6173. catch (Exception ex)
  6174. {
  6175. _db.RollbackTran();
  6176. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6177. res.ResMsg = task.Id + ResponseStatusCodeEnum.Fail.GetDescription();
  6178. _logger.LogInformation("任务取消失败,任务号:" + task.Id + ex.Message);
  6179. return res;
  6180. }
  6181. return res;
  6182. }
  6183. public List<BillPushinfo> GetPushDatelistAuto(PushDate request)
  6184. {
  6185. var list = _billPushinforepository.GetList(p => p.PostResult != 1 && p.PostQty <= 5 && p.TypeCode == request.Type).OrderBy(p => p.AddTime).Take(request.Count).ToList();
  6186. return list;
  6187. }
  6188. public bool UpdatePushModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  6189. {
  6190. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  6191. }
  6192. /// <summary>
  6193. /// 库存改判
  6194. /// </summary>
  6195. /// <param name="reqDto"></param>
  6196. /// <returns></returns>
  6197. public SRes StockChange(SxStockChangeRequest reqDto)
  6198. {
  6199. var res = new StockChangeResponse();
  6200. if (!reqDto.ListInfo.Any())
  6201. {
  6202. res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
  6203. res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
  6204. return res;
  6205. }
  6206. List<BillInvnow> stocklist = new List<BillInvnow>();
  6207. List<BillInvflow> flowlist = new List<BillInvflow>();
  6208. foreach (var item in reqDto.ListInfo)
  6209. {
  6210. var stock = _billInvnowrepository.GetSingle(p => p.InvBarCode == item.MatBarCode && p.ContGrpBarCode == item.SpoolCode);
  6211. if (stock != null)
  6212. {
  6213. var flow = _mapper.Map<BillInvflow>(stock);
  6214. switch (item.State)
  6215. {
  6216. case "Lock":
  6217. stock.ExecStateCode = InvLockState.InvState_Lock.ToString();
  6218. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  6219. break;
  6220. case "Normal":
  6221. stock.ExecStateCode = InvLockState.InvState_Normal.ToString();
  6222. flow.Memo = flow.Memo + "|执行改判状态" + item.State;
  6223. break;
  6224. default:
  6225. break;
  6226. }
  6227. if (!string.IsNullOrEmpty(item.Grade))
  6228. {
  6229. stock.Grade = item.Grade;
  6230. flow.Memo = flow.Memo + "|执行改判等级" + item.Grade;
  6231. }
  6232. if (!string.IsNullOrEmpty(item.Reason))
  6233. {
  6234. stock.Memo = item.Reason;
  6235. flow.Memo = flow.Memo + "|执行改判原因" + item.Grade;
  6236. }
  6237. if (!string.IsNullOrEmpty(item.NewTorsValue))
  6238. {
  6239. flow.Memo = flow.Memo + "|执行改判扭转值新值" + item.NewTorsValue + ",原来值" + stock.TorsChkValue;
  6240. stock.TorsChkValue = decimal.Parse(item.NewTorsValue);
  6241. stock.TorsChkQty = 1;
  6242. }
  6243. stock.EditTime = DateTime.Now;
  6244. flow.AddTime = DateTime.Now;
  6245. flow.Id = IdFactory.NewId();
  6246. if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  6247. {
  6248. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6249. res.ResMsg = stock.InvBarCode + "出库中不允许改判";
  6250. return res;
  6251. }
  6252. else
  6253. {
  6254. stocklist.Add(stock);
  6255. }
  6256. flowlist.Add(flow);
  6257. }
  6258. else
  6259. {
  6260. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6261. res.ResMsg = item.MatBarCode + "库存不存在";
  6262. return res;
  6263. }
  6264. }
  6265. try
  6266. {
  6267. _db.BeginTran();
  6268. _billInvflow.InsertRange(flowlist);
  6269. _billInvnowrepository.UpdateRange(stocklist);
  6270. _db.CommitTran();
  6271. }
  6272. catch (Exception ex)
  6273. {
  6274. _db.RollbackTran();
  6275. _logger.LogInformation("改判异常" + ex.ToString());
  6276. }
  6277. return res;
  6278. }
  6279. /// <summary>
  6280. /// 预赋扭转值
  6281. /// </summary>
  6282. /// <param name="reqDto"></param>
  6283. /// <returns></returns>
  6284. public SRes PreSpecifiedTorsionValues(SxStockChangeRequest reqDto)
  6285. {
  6286. var res = new StockChangeResponse();
  6287. if (!reqDto.ListInfo.Any())
  6288. {
  6289. res.ResCode = ResponseStatusCodeEnum.DocDetailNotExist.GetHashCode();
  6290. res.ResMsg = ResponseStatusCodeEnum.DocDetailNotExist.GetDescription();
  6291. return res;
  6292. }
  6293. List<BillInvnow> stocklist = new List<BillInvnow>();
  6294. List<BillInvflow> flowlist = new List<BillInvflow>();
  6295. foreach (var item in reqDto.ListInfo)
  6296. {
  6297. var stock = _billInvnowrepository.GetSingle(p => p.InvBarCode == item.MatBarCode && p.ContGrpBarCode == item.SpoolCode);
  6298. if (stock != null)
  6299. {
  6300. var flow = _mapper.Map<BillInvflow>(stock);
  6301. if (stock.IsTorsChk)
  6302. {
  6303. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6304. res.ResMsg += stock.InvBarCode + "等待扭转检测";
  6305. continue;
  6306. }
  6307. if (stock.TorsChkValue != null || stock.TorsChkQty >= 1)
  6308. {
  6309. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6310. res.ResMsg += stock.InvBarCode + "已有扭转值无法执行预赋值";
  6311. continue;
  6312. }
  6313. if (!string.IsNullOrEmpty(item.NewTorsValue))
  6314. {
  6315. flow.Memo = flow.Memo + "|预赋扭转值" + item.NewTorsValue + ",原来值" + stock.TorsChkValue;
  6316. stock.TorsChkValue = decimal.Parse(item.NewTorsValue);
  6317. stock.TorsChkQty = 1;
  6318. }
  6319. stock.EditTime = DateTime.Now;
  6320. flow.AddTime = DateTime.Now;
  6321. flow.Id = IdFactory.NewId();
  6322. if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString() || stock.InvStateCode == InvState.InvEcecState_Out.ToString())
  6323. {
  6324. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6325. res.ResMsg += stock.InvBarCode + "出库中不允许改变";
  6326. continue;
  6327. }
  6328. else
  6329. {
  6330. stocklist.Add(stock);
  6331. }
  6332. flowlist.Add(flow);
  6333. }
  6334. else
  6335. {
  6336. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6337. res.ResMsg += item.MatBarCode + "库存不存在";
  6338. continue;
  6339. }
  6340. }
  6341. try
  6342. {
  6343. _db.BeginTran();
  6344. _billInvflow.InsertRange(flowlist);
  6345. _billInvnowrepository.UpdateRange(stocklist);
  6346. _db.CommitTran();
  6347. }
  6348. catch (Exception ex)
  6349. {
  6350. _db.RollbackTran();
  6351. _logger.LogInformation("改判异常" + ex.ToString());
  6352. }
  6353. return res;
  6354. }
  6355. public SRes InitWareCell(int row, int col, int deot, int rowcount, int tun)
  6356. {
  6357. var res = new SRes();
  6358. var ware = _basewarehouserepository.GetFirst(p => p.IsStop == 0);
  6359. for (int i = 0; i < row; i++)
  6360. {
  6361. string shlf = tun.ToString();
  6362. if (row == 2)
  6363. {
  6364. if (i == 0)
  6365. {
  6366. shlf = shlf + "L";
  6367. }
  6368. else
  6369. {
  6370. shlf = shlf + "R";
  6371. }
  6372. }
  6373. else if (row == 4) //双升位
  6374. {
  6375. if (i == 0 || i == 1)
  6376. {
  6377. shlf = shlf + "L";
  6378. }
  6379. else
  6380. {
  6381. shlf = shlf + "R";
  6382. }
  6383. }
  6384. for (int j = 0; j < deot; j++)
  6385. {
  6386. for (int k = 0; k < col; k++)
  6387. {
  6388. var dept = "";
  6389. if (i == 0 || i == 3)
  6390. {
  6391. dept = "2";
  6392. }
  6393. else
  6394. {
  6395. dept = "1";
  6396. }
  6397. var code = new BaseWarecell()
  6398. {
  6399. Code = (rowcount + i).ToString() + "-" + (k + 1).ToString() + "-" + (j + 1).ToString() + "-" + shlf + "-" + dept,
  6400. Tunnel = tun,
  6401. IsStop = 0,
  6402. Name = (rowcount + i).ToString() + "行" + (k + 1).ToString() + "列" + (j + 1).ToString() + "层" + shlf + "货架" + dept + "深度",
  6403. WarehouseId = ware.Id,
  6404. WarehouseCode = ware.Code,
  6405. WareAreaId = 0,
  6406. StateNum = LocationState.LocationState_Empty,
  6407. TypeNum = LocationType.LocationType_StorageLocation,
  6408. Size = 1,
  6409. Row = (rowcount + i),
  6410. Col = (k + 1),
  6411. Layer = (j + 1),
  6412. Depth = int.Parse(dept),
  6413. SCRel = "SRM",
  6414. ContGrpId = 0,
  6415. ContGrpBarCode = "",
  6416. AddWho = "wms",
  6417. EditWho = "wms",
  6418. Shelf = shlf,
  6419. Floor = (j + 1) <= 4 ? 1 : (j + 1) > 4 && (j + 1) <= 8 ? 2 : (j + 1) > 8 && (j + 1) <= 12 ? 3 : 0
  6420. };
  6421. _basewarecellrepository.Insert(code);
  6422. }
  6423. }
  6424. }
  6425. return res;
  6426. }
  6427. public sxSysJob GetJobEntityByid(string id)
  6428. {
  6429. return _jobrepository.GetSingle(p => p.Id == long.Parse(id));
  6430. }
  6431. public sxSysJob GetJobEntityByCode(string Code)
  6432. {
  6433. return _jobrepository.GetSingle(p => p.Code == Code);
  6434. }
  6435. public List<sxSysJobApiRelation> GetJobapilist(long id)
  6436. {
  6437. return _jobApirepository.GetList(p => p.JobId == id);
  6438. }
  6439. public List<sxSysJob> GetJobList()
  6440. {
  6441. return _jobrepository.GetList();
  6442. }
  6443. /// <summary>
  6444. /// 接收扭转结果
  6445. /// </summary>
  6446. /// <param name="request"></param>
  6447. /// <returns></returns>
  6448. public SRes TorsChkValue(TorsChkValueRequest request)
  6449. {
  6450. var res = new SRes();
  6451. try
  6452. {
  6453. 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();
  6454. if (taskold == null)
  6455. {
  6456. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6457. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6458. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  6459. return res;
  6460. }
  6461. if (taskold.Status == TaskStatus.Finish && !_torchbandinforepository.IsAny(p => p.TaskNo == request.TaskNo))
  6462. {
  6463. var codes = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.IsTorsChk == true);
  6464. if (codes == null)
  6465. {
  6466. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6467. res.ResMsg = request.TaskNo + "条码信息不存在";
  6468. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "条码信息不存在", Time = DateTime.Now });
  6469. return res;
  6470. }
  6471. _logger.LogInformation("扭转下位机重复上抛扭转值,任务号" + request.TaskNo);
  6472. return res;
  6473. }
  6474. var code = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == taskold.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  6475. if (code == null)
  6476. {
  6477. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6478. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6479. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "库存状态不对,不是出库中", Time = DateTime.Now });
  6480. return res;
  6481. }
  6482. var torch = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo);
  6483. if (torch == null)
  6484. {
  6485. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6486. res.ResMsg = request.TaskNo + "该工字轮没有扭转绑定信息";
  6487. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮没有扭转绑定信息", Time = DateTime.Now });
  6488. return res;
  6489. }
  6490. if (torch.Machine != request.TorsChkWb)
  6491. {
  6492. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6493. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符";
  6494. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台与扭转上位机上传的机台不符", Time = DateTime.Now });
  6495. return res;
  6496. }
  6497. if (torch.WorkStation != request.TorsChkStation)
  6498. {
  6499. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6500. res.ResMsg = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符";
  6501. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + "该工字轮已绑定的扭转机台工位与扭转上位机上传的工位不符", Time = DateTime.Now });
  6502. return res;
  6503. }
  6504. if (code.SideNum == 1)
  6505. {
  6506. }
  6507. else
  6508. {
  6509. #region 扭转值结果处理
  6510. //上传mes扭转结果
  6511. var time = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  6512. var apiurl = wms.util.AppSettings.GetConfig("EsbMesPushUrl");
  6513. var reqid = Guid.NewGuid().ToString();
  6514. var req = new EsbReq() { headers = new HeadersReq() { serviceCode = "163K162001", requestId = reqid, TrackId = reqid, sourceCode = "163K" } };
  6515. var torschk = new TorsChkUploadMes() { SpoolCode = code.ContGrpBarCode, MatBarCode = code.CLBarCode, ChkMacCode = $"{request.TorsChkWb}_{request.TorsChkStation}", ChkVal = decimal.Parse(request.TorsChkValue), ChkTime = time, Bow = decimal.Parse(request.TorsChkChord), Straight = decimal.Parse(request.TorsChkFlatness) };
  6516. if (request.TorsChkValue == "9.990000")
  6517. {
  6518. torschk.OvcResult = false;
  6519. torschk.ChkVal = 0;
  6520. }
  6521. if (request.TorsChkChord == "49.999001")
  6522. {
  6523. torschk.Bow = 5;
  6524. torschk.BowResult = false;
  6525. }
  6526. if (request.TorsChkFlatness == "299.998993")
  6527. {
  6528. torschk.Straight = 10;
  6529. torschk.StraightResult = false;
  6530. }
  6531. //CK0701\CK0702\CK0703\CK0704\CK0705\CK0706\CK0707\CK0708\CK0709\CK0710
  6532. _logger.LogInformation("扭转值接口调用,传参条码:" + code.ContGrpBarCode);
  6533. var strEsbRes = HttpUtil.PostRequest(apiurl, JsonConvert.SerializeObject(torschk), 30000, "UTF-8", "application/json", reqid, req.headers.sourceCode, req.headers.serviceCode);
  6534. var response = JsonConvert.DeserializeObject<TorschMesResponse>(strEsbRes);
  6535. _logger.LogInformation("MES扭转值返回结果:条码" + code.ContGrpBarCode + ",结果:" + response.success + ",扭转等级:" + response.data.GradeCode);
  6536. if (response.success == false)
  6537. {
  6538. //记录描述信息
  6539. var error = new BaseErrorinfo()
  6540. {
  6541. ContBarCode = code.ContGrpBarCode,
  6542. Message = response.message,
  6543. AddWho = "",
  6544. EditWho = "",
  6545. Count = 1
  6546. };
  6547. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  6548. if (errorinfo != null)
  6549. {
  6550. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  6551. {
  6552. Count = errorinfo.Count + 1
  6553. }, p => p.ContBarCode == errorinfo.ContBarCode);
  6554. }
  6555. else
  6556. {
  6557. _errorinforepository.Insert(error);
  6558. }
  6559. //异常工字轮暂时先回库
  6560. //if (code.ContUsageQty == 2)
  6561. //{
  6562. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  6563. // var flow2 = _mapper.Map<BillInvflow>(code);
  6564. // flow2.Id = GetId();
  6565. // flow2.AddTime = DateTime.Now;
  6566. // flow2.EditTime = DateTime.Now;
  6567. // flow2.Memo = "扭转超时出库完成";
  6568. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  6569. // _billInvflow.Insert(flow2);
  6570. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  6571. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  6572. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  6573. // {
  6574. // Status = TaskStatus.Finish,
  6575. // EditTime = DateTime.Now,
  6576. // ManualRemarks = "扭转超时"
  6577. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  6578. // var wcsdt = new WCS_TaskDtl()
  6579. // {
  6580. // ID = Guid.NewGuid(),
  6581. // CurPoint = request.TorsChkWb,
  6582. // AddTime = DateTime.Now,
  6583. // AddWho = "wms",
  6584. // Enabled = true,
  6585. // ParentTaskCode = taskold.Id,
  6586. // Desc = "扭转超时"
  6587. // };
  6588. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  6589. // return res;
  6590. //}
  6591. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6592. {
  6593. TorsChkQty = code.TorsChkQty + 1,
  6594. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  6595. TorsChkValue = torschk.ChkVal,
  6596. TorsChkChord = torschk.Bow,
  6597. TorsChkFlatness = torschk.Straight,
  6598. TorsChkMachCode = request.TorsChkWb,
  6599. TorsChkStation = request.TorsChkStation,
  6600. TorsChkChordIsGood = request.TorsChkChordIsGood,
  6601. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  6602. TorsChkValueIsGood = request.TorsChkValueIsGood,
  6603. Grade = "C",
  6604. SideNum = 1,
  6605. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  6606. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  6607. }
  6608. else
  6609. {
  6610. //异常工字轮暂时先回库
  6611. //if (code.ContUsageQty == 2)
  6612. //{
  6613. // //记录描述信息
  6614. // var error = new BaseErrorinfo()
  6615. // {
  6616. // ContBarCode = code.ContGrpBarCode,
  6617. // Message = code.ContGrpBarCode + "扭转超时,直接异常排出",
  6618. // AddWho = "",
  6619. // EditWho = "",
  6620. // Count = 1
  6621. // };
  6622. // var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  6623. // if (errorinfo != null)
  6624. // {
  6625. // _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  6626. // {
  6627. // Count = errorinfo.Count + 1
  6628. // }, p => p.ContBarCode == errorinfo.ContBarCode);
  6629. // }
  6630. // else
  6631. // {
  6632. // _errorinforepository.Insert(error);
  6633. // }
  6634. // _billInvnowrepository.Delete(p => p.ContGrpBarCode == code.ContGrpBarCode);
  6635. // var flow2 = _mapper.Map<BillInvflow>(code);
  6636. // flow2.Id = GetId();
  6637. // flow2.AddTime = DateTime.Now;
  6638. // flow2.EditTime = DateTime.Now;
  6639. // flow2.Memo = "扭转超时出库完成";
  6640. // flow2.InvStateCode = InvState.InvEcecState_Out.ToString();
  6641. // _billInvflow.Insert(flow2);
  6642. // _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  6643. // _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  6644. // _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  6645. // {
  6646. // Status = TaskStatus.Finish,
  6647. // EditTime = DateTime.Now,
  6648. // ManualRemarks = "扭转超时"
  6649. // }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  6650. // var wcsdt = new WCS_TaskDtl()
  6651. // {
  6652. // ID = Guid.NewGuid(),
  6653. // CurPoint = request.TorsChkWb,
  6654. // AddTime = DateTime.Now,
  6655. // AddWho = "wms",
  6656. // Enabled = true,
  6657. // ParentTaskCode = taskold.Id,
  6658. // Desc = "扭转超时"
  6659. // };
  6660. // _taskdetailrepository.InsertableSplitTable(wcsdt);
  6661. // return res;
  6662. //}
  6663. if (response.success == true && response.data.GradeCode == "A")
  6664. {
  6665. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6666. {
  6667. TorsChkQty = code.TorsChkQty + 1,
  6668. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  6669. TorsChkValue = torschk.ChkVal,
  6670. TorsChkChord = torschk.Bow,
  6671. TorsChkFlatness = torschk.Straight,
  6672. TorsChkMachCode = request.TorsChkWb,
  6673. TorsChkStation = request.TorsChkStation,
  6674. TorsChkChordIsGood = request.TorsChkChordIsGood,
  6675. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  6676. TorsChkValueIsGood = request.TorsChkValueIsGood,
  6677. Grade = "A",
  6678. SideNum = 1,
  6679. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  6680. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  6681. }
  6682. else
  6683. {
  6684. var error = new BaseErrorinfo()
  6685. {
  6686. ContBarCode = code.ContGrpBarCode,
  6687. Message = response.message,
  6688. AddWho = "",
  6689. EditWho = "",
  6690. Count = 1
  6691. };
  6692. var errorinfo = _errorinforepository.GetSingle(p => p.ContBarCode == code.ContGrpBarCode && p.Message == error.Message);
  6693. if (errorinfo != null)
  6694. {
  6695. _errorinforepository.UpdateSetColumnsTrue(p => new BaseErrorinfo()
  6696. {
  6697. Count = errorinfo.Count + 1
  6698. }, p => p.ContBarCode == errorinfo.ContBarCode);
  6699. }
  6700. else
  6701. {
  6702. _errorinforepository.Insert(error);
  6703. }
  6704. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  6705. {
  6706. TorsChkQty = code.TorsChkQty + 1,
  6707. TorsChkTime = DateTime.ParseExact(time, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.InvariantCulture),
  6708. TorsChkValue = torschk.ChkVal,
  6709. TorsChkChord = torschk.Bow,
  6710. TorsChkFlatness = torschk.Straight,
  6711. TorsChkMachCode = request.TorsChkWb,
  6712. TorsChkStation = request.TorsChkStation,
  6713. TorsChkChordIsGood = request.TorsChkChordIsGood,
  6714. TorsChkFlatnessIsGood = request.TorsChkFlatnessIsGood,
  6715. TorsChkValueIsGood = request.TorsChkValueIsGood,
  6716. SideNum = 1,
  6717. Grade = "C",
  6718. ExecWho = string.IsNullOrEmpty(request.User) ? "0" : request.User
  6719. }, p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  6720. }
  6721. }
  6722. #endregion 扭转值结果处理
  6723. }
  6724. _db.BeginTran();
  6725. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now },
  6726. p => p.StateNum == LocationState.LocationState_StockOut && p.ContGrpId == code.ContGrpId && p.Code == taskold.AddrFrom && p.ContGrpBarCode == code.ContGrpBarCode);
  6727. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode);
  6728. _billInvnowrepository.Delete(p => p.Id == code.Id);
  6729. var flow = _mapper.Map<BillInvflow>(stock);
  6730. flow.Id = GetId();
  6731. flow.AddTime = DateTime.Now;
  6732. flow.EditTime = DateTime.Now;
  6733. flow.Memo = "扭转出库任务完成";
  6734. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  6735. _billInvflow.Insert(flow);
  6736. _torchbandinforepository.Delete(p => p.TaskNo == request.TaskNo);
  6737. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  6738. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  6739. {
  6740. Status = TaskStatus.Finish,
  6741. EditTime = DateTime.Now,
  6742. ManualRemarks = "扭转完成,操作人" + request.User
  6743. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  6744. var wcsdtl = new WCS_TaskDtl()
  6745. {
  6746. ID = Guid.NewGuid(),
  6747. CurPoint = stock.TorsChkMachCode,
  6748. AddTime = DateTime.Now,
  6749. AddWho = "wms",
  6750. Enabled = true,
  6751. ParentTaskCode = taskold.Id,
  6752. Desc = "扭转完成,操作人" + request.User
  6753. };
  6754. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  6755. var inv = stock;
  6756. inv.Id = GetId();
  6757. inv.ContGrpId = GetId();
  6758. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  6759. inv.Memo = "扭转回库";
  6760. _billInvnowrepository.Insert(inv);
  6761. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  6762. var wcs = new WCS_TaskInfo()
  6763. {
  6764. Status = TaskStatus.NewBuild,
  6765. Type = TaskType.EnterDepot,
  6766. Priority = 0,
  6767. Device = "",
  6768. SrmStation = "",
  6769. AddrFrom = inv.TorsChkMachCode,
  6770. BarCode = stock.ContGrpBarCode,
  6771. AddWho = "wms",
  6772. EditWho = "wms",
  6773. WarehouseCode = "sxhouse",
  6774. AddrTo = "",
  6775. Tunnel = "",
  6776. MaterialCode = inv.MatCode,
  6777. MatCode = inv.MatCode,
  6778. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  6779. Grade = inv.Grade
  6780. };
  6781. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  6782. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  6783. var wcsdtls = new WCS_TaskDtl()
  6784. {
  6785. ID = Guid.NewGuid(),
  6786. CurPoint = wcstask.AddrFrom,
  6787. AddTime = DateTime.Now,
  6788. AddWho = "wms",
  6789. Enabled = true,
  6790. ParentTaskCode = wcstask.ID,
  6791. Desc = wcstask.BusType
  6792. };
  6793. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  6794. _torschwbcount.UpdateSetColumnsTrue(p => new TorschWbCount()
  6795. {
  6796. WbCount = p.WbCount - 1
  6797. }, p => p.Code == request.TorsChkWb);
  6798. _db.CommitTran();
  6799. }
  6800. catch (Exception ex)
  6801. {
  6802. _db.RollbackTran();
  6803. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6804. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  6805. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip5", new RedisErrorInfo() { Equip = "TorsChkEquip5", Con = request.TaskNo + ex.Message, Time = DateTime.Now });
  6806. return res;
  6807. }
  6808. return res;
  6809. }
  6810. public SRes TorsChkStationbinde(TorsChkStationbindeRequest request)
  6811. {
  6812. var res = new SRes();
  6813. try
  6814. {
  6815. if (request.Memo1.Trim() == "2")
  6816. {
  6817. 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();
  6818. if (taskold == null)
  6819. {
  6820. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6821. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6822. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  6823. return res;
  6824. }
  6825. var torchbandinfo = _torchbandinforepository.GetSingle(p => p.TaskNo == request.TaskNo && p.WorkStation == request.WorkStation && p.Machine == request.Machine);
  6826. if (torchbandinfo != null)
  6827. {
  6828. return res;
  6829. }
  6830. var count = _torchbandinforepository.GetList(p => p.TaskNo == request.TaskNo).Count;
  6831. if (count > 0)
  6832. {
  6833. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6834. res.ResMsg = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位";
  6835. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "扭转入料绑定失败,一个任务不允许绑定两个工位", Time = DateTime.Now });
  6836. return res;
  6837. }
  6838. var tors = new BaseTorchbandinfo()
  6839. {
  6840. TaskNo = request.TaskNo,
  6841. ContBarCode = taskold.BarCode,
  6842. WorkStation = request.WorkStation,
  6843. Machine = request.Machine,
  6844. IsStop = 0,
  6845. AddWho = "",
  6846. EditWho = ""
  6847. };
  6848. _torchbandinforepository.Insert(tors);
  6849. }
  6850. else
  6851. {
  6852. 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();
  6853. if (task == null)
  6854. {
  6855. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6856. res.ResMsg = request.TaskNo + "不存在扭转出库的任务";
  6857. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "不存在扭转出库的任务", Time = DateTime.Now });
  6858. return res;
  6859. }
  6860. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  6861. if (stock == null)
  6862. {
  6863. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6864. res.ResMsg = request.TaskNo + "没有找到扭转出库的库存信息";
  6865. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = request.TaskNo + "没有找到扭转出库的库存信息", Time = DateTime.Now });
  6866. return res;
  6867. }
  6868. _db.BeginTran();
  6869. _billInvnowrepository.Delete(p => p.Id == stock.Id);
  6870. var flow = _mapper.Map<BillInvflow>(stock);
  6871. flow.Id = GetId();
  6872. flow.AddTime = DateTime.Now;
  6873. flow.EditTime = DateTime.Now;
  6874. flow.Memo = "不需扭转";
  6875. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  6876. _billInvflow.Insert(flow);
  6877. _taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo));
  6878. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  6879. {
  6880. Status = TaskStatus.Finish,
  6881. EditTime = DateTime.Now,
  6882. ManualRemarks = "未扭转"
  6883. }).Where(p => p.Id == int.Parse(request.TaskNo)).SplitTable(p => p.Take(2)).ExecuteCommand();
  6884. var wcsdtl = new WCS_TaskDtl()
  6885. {
  6886. ID = Guid.NewGuid(),
  6887. CurPoint = request.Machine,
  6888. AddTime = DateTime.Now,
  6889. AddWho = "wms",
  6890. Enabled = true,
  6891. ParentTaskCode = task.Id,
  6892. Desc = "未扭转"
  6893. };
  6894. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  6895. var inv = stock;
  6896. inv.Id = GetId();
  6897. inv.ContGrpId = GetId();
  6898. inv.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  6899. inv.Memo = "未扭转";
  6900. _billInvnowrepository.Insert(inv);
  6901. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  6902. var wcs = new WCS_TaskInfo()
  6903. {
  6904. Status = TaskStatus.NewBuild,
  6905. Type = TaskType.EnterDepot,
  6906. Priority = 0,
  6907. Device = "",
  6908. SrmStation = "",
  6909. AddrFrom = request.Machine,
  6910. BarCode = stock.ContGrpBarCode,
  6911. AddWho = "wms",
  6912. EditWho = "wms",
  6913. WarehouseCode = "sxhouse",
  6914. AddrTo = "",
  6915. Tunnel = "",
  6916. MaterialCode = inv.MatCode,
  6917. MatCode = inv.MatCode,
  6918. BusType = SxTaskBusType.TaskBusType_SX_TorCheckStockIn.GetDescription(),
  6919. Grade = inv.Grade
  6920. };
  6921. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  6922. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  6923. var wcsdtls = new WCS_TaskDtl()
  6924. {
  6925. ID = Guid.NewGuid(),
  6926. CurPoint = wcstask.AddrFrom,
  6927. AddTime = DateTime.Now,
  6928. AddWho = "wms",
  6929. Enabled = true,
  6930. ParentTaskCode = wcstask.ID,
  6931. Desc = wcstask.BusType
  6932. };
  6933. _taskdetailrepository.InsertableSplitTable(wcsdtls);
  6934. _db.CommitTran();
  6935. }
  6936. }
  6937. catch (Exception ex)
  6938. {
  6939. _db.RollbackTran();
  6940. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  6941. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  6942. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip4", new RedisErrorInfo() { Equip = "TorsChkEquip4", Con = ex.Message, Time = DateTime.Now });
  6943. return res;
  6944. }
  6945. return res;
  6946. }
  6947. public SRes TorsChkErrorinfo(TorsChkErrorinfoRequest request)
  6948. {
  6949. var res = new SRes();
  6950. 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 });
  6951. return res;
  6952. }
  6953. public SRes CellInfo(string code)
  6954. {
  6955. var res = new SRes();
  6956. MoveTask(code);
  6957. return res;
  6958. }
  6959. public TorsChkResponse GetTorsChkinfo(GetTorsChkinfoRequest request)
  6960. {
  6961. var res = new TorsChkResponse();
  6962. 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();
  6963. if (task == null)
  6964. {
  6965. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6966. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6967. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription(), Time = DateTime.Now });
  6968. return res;
  6969. }
  6970. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  6971. if (stock == null)
  6972. {
  6973. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6974. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6975. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.StockNotExist.GetDescription(), Time = DateTime.Now });
  6976. return res;
  6977. }
  6978. var marter = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Code == stock.MatCode).First();
  6979. if (marter == null)
  6980. {
  6981. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  6982. res.ResMsg = request.TaskNo.ToString() + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  6983. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip3", new RedisErrorInfo() { Equip = "TorsChkEquip3", Con = request.TaskNo + ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription(), Time = DateTime.Now });
  6984. return res;
  6985. }
  6986. var isOld = false;
  6987. //获取绕向
  6988. var wind = stock.Wind;
  6989. //获取颜色
  6990. var boxRule = _boxrulerepository.AsQueryable().With(SqlWith.NoLock).First(x => x.DocsNo == stock.InDocsNo);
  6991. var currentColor = wind == "L" ? boxRule.TAKEUP_SIDE_L : boxRule.TAKEUP_SIDE_R;
  6992. if (currentColor == null)
  6993. {
  6994. isOld = true;
  6995. }
  6996. //L代表顺时针R代表逆时针
  6997. if (isOld) res.Face = task.BarCode.EndsWith("R") ? "R" : "L";
  6998. else res.Face = currentColor.Contains("顺") ? "L" : "R";
  6999. res.GoodsType = task.GoodsType;
  7000. res.Isdetection = 2;
  7001. res.Diameter = marter.Diameter;
  7002. return res;
  7003. }
  7004. public SRes Manaler(DetailCodeStrdtoRequest request)
  7005. {
  7006. var res = new SRes();
  7007. //var list = _basewarecellrepository.GetList(p => p.StateNum == LocationState.LocationState_Full && p.IsStop == 0 && p.Floor == 3).OrderBy(p => p.Depth).Take(50);
  7008. foreach (var item in request.Location)
  7009. {
  7010. var cellcode = _basewarecellrepository.GetSingle(p => p.Code == item && p.StateNum == LocationState.LocationState_Full && p.IsStop == 0);
  7011. if (cellcode == null)
  7012. {
  7013. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7014. res.ResMsg = item + "不满足出库条件,请检查当前货位的状态";
  7015. return res;
  7016. }
  7017. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == cellcode.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7018. if (stock == null)
  7019. {
  7020. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  7021. res.ResMsg = item + "没有库存";
  7022. return res;
  7023. }
  7024. if (!string.IsNullOrEmpty(stock.PreStock))
  7025. {
  7026. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7027. res.ResMsg = stock.ContGrpBarCode + "该库存已被锁定,不允许手动出库";
  7028. return res;
  7029. }
  7030. if (cellcode.Depth == 2)
  7031. {
  7032. var respon = MoveTask(cellcode.Code);
  7033. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7034. {
  7035. return respon;
  7036. }
  7037. }
  7038. try
  7039. {
  7040. var bus = "";
  7041. if (request.EndPoint == SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetHashCode())
  7042. {
  7043. bus = SxTaskBusType.TaskBusType_SX_TorCheckStockOut.GetDescription();
  7044. }
  7045. //else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_StackStockOut.GetHashCode())
  7046. //{
  7047. // bus = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription();
  7048. //}
  7049. else if (request.EndPoint == SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetHashCode())
  7050. {
  7051. bus = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription();
  7052. }
  7053. else
  7054. {
  7055. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7056. res.ResMsg = stock.ContGrpBarCode + "业务类型参数错误";
  7057. return res;
  7058. }
  7059. var wcs = new WCS_TaskInfo()
  7060. {
  7061. Status = TaskStatus.NewBuild,
  7062. Type = TaskType.OutDepot,
  7063. Priority = 0,
  7064. Device = cellcode.SCRel,
  7065. SrmStation = "1",
  7066. AddrFrom = cellcode.Code,
  7067. BarCode = stock.ContGrpBarCode,
  7068. AddWho = "wms",
  7069. EditWho = "wms",
  7070. WarehouseCode = cellcode.WarehouseCode,
  7071. AddrTo = "",
  7072. Tunnel = cellcode.Tunnel.ToString(),
  7073. MaterialCode = stock.MatCode,
  7074. MatCode = stock.MatCode,
  7075. BusType = bus,
  7076. Floor = cellcode.Floor,
  7077. Grade = stock.Grade,
  7078. Length = stock.LengthQty,
  7079. ManualRemarks = request.User + "下发手动出库任务"
  7080. };
  7081. _db.BeginTran();
  7082. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  7083. {
  7084. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  7085. EditTime = DateTime.Now
  7086. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  7087. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  7088. {
  7089. StateNum = LocationState.LocationState_StockOut,
  7090. EditTime = DateTime.Now
  7091. }, p => p.Code == cellcode.Code);
  7092. var flow = _mapper.Map<BillInvflow>(stock);
  7093. flow.Id = GetId();
  7094. flow.AddTime = DateTime.Now;
  7095. flow.EditTime = DateTime.Now;
  7096. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  7097. flow.Memo = "Test";
  7098. _billInvflow.Insert(flow);
  7099. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  7100. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  7101. var wcsdtl = new WCS_TaskDtl()
  7102. {
  7103. ID = Guid.NewGuid(),
  7104. CurPoint = wcstask.AddrFrom,
  7105. AddTime = DateTime.Now,
  7106. AddWho = "wms",
  7107. Enabled = true,
  7108. ParentTaskCode = wcstask.ID,
  7109. Desc = wcstask.BusType
  7110. };
  7111. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  7112. _db.CommitTran();
  7113. InsertErrorinfo(stock.ContGrpBarCode, "环线异常排出口:5186|,人工异常排出" + "操作人员:" + request.User + "|" + DateTime.Now);
  7114. }
  7115. catch (Exception ex)
  7116. {
  7117. _db.RollbackTran();
  7118. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7119. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  7120. return res;
  7121. }
  7122. }
  7123. return res;
  7124. }
  7125. /// <summary>
  7126. /// 移库任务
  7127. /// </summary>
  7128. /// <param name="request"></param>
  7129. /// <returns></returns>
  7130. public SRes<WcsMoveTaskResponse> WcsMoveTask(WcsMoveTaskRequest request)
  7131. {
  7132. var res = new SRes<WcsMoveTaskResponse>()
  7133. {
  7134. ResData = new WcsMoveTaskResponse()
  7135. {
  7136. ResType = WcsContractWcsMoveTaskEnum.失败.GetHashCode(),
  7137. CellNo = ""
  7138. }
  7139. };
  7140. var wcstask = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2)).First();
  7141. if (wcstask == null)
  7142. {
  7143. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7144. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7145. return res;
  7146. }
  7147. var dept2Loc = _basewarecellrepository.GetFirst(p => p.Code == wcstask.AddrFrom && p.Depth == 2);
  7148. if (dept2Loc == null)
  7149. {
  7150. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  7151. res.ResMsg = "该任务所在货位不是二深货位";
  7152. return res;
  7153. }
  7154. 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);
  7155. if (dept1Loc == null)
  7156. {
  7157. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  7158. res.ResMsg = dept2Loc.Code + "对应一深位货位被禁用或者不存在";
  7159. return res;
  7160. }
  7161. if (wcstask.Type != TaskType.OutDepot)
  7162. {
  7163. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  7164. res.ResMsg = "只有出库任务才能调用此接口";
  7165. return res;
  7166. }
  7167. res.ResData.CellNo = dept1Loc.Code;
  7168. lock (lockerApplyLoc)
  7169. {
  7170. try
  7171. {
  7172. if (dept1Loc.StateNum == LocationState.LocationState_Empty)
  7173. {
  7174. res.ResData.ResType = WcsContractWcsMoveTaskEnum.允许2升位执行.GetHashCode();
  7175. res.ResData.CellNo = "";
  7176. return res;
  7177. }
  7178. else if (dept1Loc.StateNum == LocationState.LocationState_Full)
  7179. {
  7180. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  7181. res.ResData.CellNo = dept1Loc.Code;
  7182. var stock = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == dept1Loc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7183. if (stock == null)
  7184. {
  7185. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  7186. res.ResMsg = "一深位库存信息异常,没有查到库存信息";
  7187. return res;
  7188. }
  7189. var wareshouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  7190. //库位
  7191. var cell = SxServiceHelp.ApplyLoc(new ApplyLocRequest()
  7192. {
  7193. IsMove = true,
  7194. MaterialId = stock.MatId,
  7195. MaterialCode = stock.MatCode,
  7196. TunnelNum = dept1Loc.Tunnel,
  7197. WarehuoseId = wareshouse.Id,
  7198. Floor = dept1Loc.Floor,
  7199. Fork = 2,
  7200. Wbgroup = stock.WbGroupCode,
  7201. Wind = stock.Wind,
  7202. IsControlpanel = stock.IsControlpanel,
  7203. IsTorsChk = stock.IsTorsChk,
  7204. TorsChkQty = stock.TorsChkQty,
  7205. ProductTime = stock.ProductTime
  7206. }, _basewarecellrepository, _basewarehouserepository, _billInvnowrepository, _logger);
  7207. if (string.IsNullOrEmpty(cell.ResData.CellNo))
  7208. {
  7209. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  7210. res.ResMsg = cell.ResMsg;
  7211. return res;
  7212. }
  7213. var wcs = new WCS_TaskInfo()
  7214. {
  7215. Type = TaskType.TransferDepot,
  7216. Status = TaskStatus.NewBuild,
  7217. Priority = 0,
  7218. Device = dept1Loc.SCRel,
  7219. SrmStation = "",
  7220. AddrFrom = dept1Loc.Code,
  7221. AddrTo = cell.ResData.CellNo,
  7222. LastInteractionPoint = "",
  7223. BarCode = stock.ContGrpBarCode,
  7224. Length = stock.LengthQty,
  7225. AddTime = DateTime.Now,
  7226. StartTime = DateTime.Now,
  7227. DocID = 0,
  7228. PalletType = 1,
  7229. ProdLine = 0,
  7230. AddWho = "wms",
  7231. WarehouseCode = wareshouse.Code,
  7232. Enabled = true,
  7233. WorkBench = "",
  7234. Tunnel = dept1Loc.Tunnel.ToString(),
  7235. Floor = dept1Loc.Floor,
  7236. BusType = CpTaskBusType.TaskBusType_CP_Move.GetDescription()
  7237. };
  7238. _db.BeginTran();
  7239. var task = _taskrepository.InsertReturnEntity(wcs);
  7240. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(task));
  7241. var taskdlt = new WCS_TaskDtl()
  7242. {
  7243. ID = Guid.NewGuid(),
  7244. CurPoint = task.AddrFrom,
  7245. AddTime = DateTime.Now,
  7246. AddWho = "wms",
  7247. Enabled = true,
  7248. ParentTaskCode = task.ID,
  7249. Desc = task.AddrFrom + "移库至" + task.AddrTo,
  7250. };
  7251. _taskdetailrepository.InsertableSplitTable(taskdlt);
  7252. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrFrom);
  7253. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell() { StateNum = LocationState.LocationState_StockMove, EditTime = DateTime.Now }, p => p.Code == task.AddrTo);
  7254. _db.CommitTran();
  7255. return res;
  7256. }
  7257. else if (dept1Loc.StateNum == LocationState.LocationState_StockOut)
  7258. {
  7259. res.ResData.ResType = WcsContractWcsMoveTaskEnum.一深位有出库任务.GetHashCode();
  7260. res.ResData.CellNo = dept1Loc.Code;
  7261. return res;
  7262. }
  7263. //判断移库任务是否已经存在
  7264. else if (dept1Loc.StateNum == LocationState.LocationState_StockMove)
  7265. {
  7266. res.ResData.ResType = WcsContractWcsMoveTaskEnum.执行移库任务.GetHashCode();
  7267. res.ResData.CellNo = dept1Loc.Code;
  7268. return res;
  7269. }
  7270. else
  7271. {
  7272. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  7273. res.ResMsg = "一深位有入库任务,优先执行入库任务";
  7274. return res;
  7275. }
  7276. }
  7277. catch (Exception ex)
  7278. {
  7279. _db.RollbackTran();
  7280. res.ResCode = WcsContractWcsMoveTaskEnum.失败.GetHashCode();
  7281. res.ResMsg = WcsContractWcsMoveTaskEnum.失败.GetDescription();
  7282. _logger.LogInformation(ex.ToString());
  7283. return res;
  7284. }
  7285. }
  7286. return res;
  7287. }
  7288. private SRes SpoolMaterialInfoTrans1(SxSpoolMaterialInfoTrans1Request reqDto)
  7289. {
  7290. var res = new SRes();
  7291. try
  7292. {
  7293. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == "sxhouse");
  7294. //物料
  7295. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  7296. if (mater == null)
  7297. {
  7298. res.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  7299. res.ResMsg = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetDescription();
  7300. return res;
  7301. }
  7302. //检查条码
  7303. var barstock = _billInvinitrepository.GetFirst(p => p.ContGrpBarCode == reqDto.SpoolCode);
  7304. if (barstock == null)
  7305. {
  7306. //创建条码
  7307. var barinfo = new BillInvinit()
  7308. {
  7309. InvBarCode = reqDto.MatBarCode,
  7310. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  7311. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  7312. ExecDocsNo = reqDto.WorkOrder,
  7313. ExecDocsRowNo = reqDto.MatBarCode,
  7314. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  7315. InvInOut = InvInOutType.In,
  7316. ExecWho = "MES",
  7317. EditTime = DateTime.Now,
  7318. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  7319. InDocsNo = reqDto.WorkOrder,
  7320. InDocsRowNo = reqDto.MatBarCode,
  7321. SuppCode = "",
  7322. BomDocsNo = "",
  7323. BomSetId = 0,
  7324. SetGrpCode = "",
  7325. BomMatCode = "",
  7326. BomMatId = 0,
  7327. BomMatName = "",
  7328. MatId = mater.Id,
  7329. MatCode = mater.Code,
  7330. MatName = mater.Name,
  7331. LengthQty = reqDto.Length,
  7332. TareWQty = reqDto.Weight,
  7333. ProductTime = reqDto.ProductDate,
  7334. RFIDBarCode = "",
  7335. ProductMachCode = reqDto.WbCode,
  7336. Grade = reqDto.Grade,
  7337. HWBarCode = reqDto.SpoolCode,
  7338. HWTypeCode = reqDto.SpoolType,
  7339. ContGrpBarCode = reqDto.SpoolCode,
  7340. ContGrpId = IdFactory.NewId(),
  7341. IsFast = false,
  7342. IsRework = reqDto.IsRework,
  7343. CLBarCode = reqDto.MatBarCode,
  7344. Size = 1,
  7345. BackReason = "",
  7346. IsBack = reqDto.IsBlack,
  7347. IsCore = reqDto.IsCore,
  7348. SolderCount = reqDto.SolderCount,
  7349. IsTorsChk = reqDto.IsTorsChk,
  7350. WbGroupCode = reqDto.WbGroupCode
  7351. };
  7352. _billInvinitrepository.Insert(barinfo);
  7353. }
  7354. else
  7355. {
  7356. }
  7357. //库存
  7358. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.SpoolCode);
  7359. if (stock == null)
  7360. {
  7361. var inv = new BillInvnow()
  7362. {
  7363. InvBarCode = reqDto.MatBarCode,
  7364. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  7365. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  7366. ExecDocsNo = reqDto.WorkOrder,
  7367. ExecDocsRowNo = reqDto.MatBarCode,
  7368. ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString(),
  7369. InvInOut = InvInOutType.In,
  7370. ExecWho = "MES",
  7371. EditTime = DateTime.Now,
  7372. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  7373. InDocsNo = reqDto.WorkOrder,
  7374. InDocsRowNo = reqDto.MatBarCode,
  7375. SuppCode = "",
  7376. BomDocsNo = "",
  7377. BomSetId = 0,
  7378. SetGrpCode = "",
  7379. BomMatCode = "",
  7380. BomMatId = 0,
  7381. BomMatName = "",
  7382. MatId = mater.Id,
  7383. MatCode = mater.Code,
  7384. MatName = mater.Name,
  7385. LengthQty = reqDto.Length,
  7386. TareWQty = reqDto.Weight,
  7387. ProductTime = reqDto.ProductDate,
  7388. RFIDBarCode = "",
  7389. ProductMachCode = reqDto.WbCode,
  7390. Grade = reqDto.Grade,
  7391. HWBarCode = reqDto.SpoolCode,
  7392. HWTypeCode = "BS1",
  7393. ContGrpBarCode = reqDto.SpoolCode,
  7394. ContGrpId = IdFactory.NewId(),
  7395. IsFast = false,
  7396. IsRework = reqDto.IsRework,
  7397. CLBarCode = reqDto.MatBarCode,
  7398. Size = 1,
  7399. BackReason = "",
  7400. IsBack = reqDto.IsBlack,
  7401. IsCore = reqDto.IsCore,
  7402. WbGroupCode = reqDto.WbGroupCode,
  7403. IsTorsChk = reqDto.IsTorsChk,
  7404. IsControlpanel = false,
  7405. SkuCode = ""
  7406. };
  7407. _billInvnowrepository.Insert(inv);
  7408. _billInvflow.Insert(_mapper.Map<BillInvflow>(inv));
  7409. }
  7410. else
  7411. {
  7412. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  7413. {
  7414. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7415. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  7416. return res;
  7417. }
  7418. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  7419. {
  7420. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7421. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  7422. return res;
  7423. }
  7424. }
  7425. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.BarCode == reqDto.SpoolCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  7426. if (task != null && task.Type == TaskType.OutDepot)
  7427. {
  7428. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7429. res.ResMsg = reqDto.SpoolCode + "存在上一个未结束的出库任务,不允许创建入库任务";
  7430. return res;
  7431. }
  7432. if (task != null && task.Type == TaskType.EnterDepot)
  7433. {
  7434. //res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  7435. //res.ResMsg = reqDto.SpoolCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription();
  7436. return res;
  7437. }
  7438. var wcs = new WCS_TaskInfo()
  7439. {
  7440. Status = TaskStatus.NewBuild,
  7441. Type = TaskType.EnterDepot,
  7442. Priority = 0,
  7443. Device = "",
  7444. SrmStation = "",
  7445. AddrFrom = "root",
  7446. BarCode = reqDto.SpoolCode,
  7447. AddWho = "wms",
  7448. EditWho = "wms",
  7449. WarehouseCode = wareHosue.Code,
  7450. AddrTo = "",
  7451. Tunnel = "",
  7452. MaterialCode = mater.Code,
  7453. MatCode = mater.Code,
  7454. BusType = SxTaskBusType.TaskBusType_SX_LineStockIn.GetDescription(),
  7455. Grade = reqDto.Grade,
  7456. Length = reqDto.Length,
  7457. WorkBench = reqDto.WbCode,
  7458. WorkOrder = reqDto.WorkOrder,
  7459. GoodsType = 0
  7460. };
  7461. _db.BeginTran();
  7462. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  7463. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  7464. var wcsdtl = new WCS_TaskDtl()
  7465. {
  7466. ID = Guid.NewGuid(),
  7467. CurPoint = reqDto.SpoolCode,
  7468. AddTime = DateTime.Now,
  7469. AddWho = "wms",
  7470. Enabled = true,
  7471. ParentTaskCode = wcstask.ID,
  7472. Desc = wcstask.BusType
  7473. };
  7474. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  7475. _db.CommitTran();
  7476. }
  7477. catch (Exception ex)
  7478. {
  7479. _db.RollbackTran();
  7480. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7481. res.ResMsg = ex.ToString();
  7482. }
  7483. return res;
  7484. }
  7485. /// <summary>
  7486. /// 扭转入库分配楼层
  7487. /// </summary>
  7488. /// <param name="reqDto"></param>
  7489. /// <returns></returns>
  7490. public SRes<int> TorsChkFloor(TorsChkFloorRequest reqDto)
  7491. {
  7492. var res = new SRes<int>();
  7493. try
  7494. {
  7495. if (reqDto.Count <= 0)
  7496. {
  7497. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  7498. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription() + "任务数量不能为0";
  7499. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip6", new RedisErrorInfo() { Equip = "TorsChkEquip6", Con = "参数错误,请求任务数量不能为0", Time = DateTime.Now });
  7500. return res;
  7501. }
  7502. var floorTaskCount = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "FloorTaskCount").SContent);
  7503. var bar = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.BusType == "扭转回库").OrderByDescending(p => p.AddTime).First();
  7504. if (bar == null)
  7505. {
  7506. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7507. res.ResMsg = "没有扭转回库任务需要分配楼层";
  7508. RedisHelper.Set("Sx:WMSErrorInfo:TorsChkEquip6", new RedisErrorInfo() { Equip = "TorsChkEquip6", Con = "没有扭转回库任务需要分配楼层,请检查扭转回库位置任务实际是否有货", Time = DateTime.Now });
  7509. return res;
  7510. }
  7511. var stock = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == bar.BarCode && p.InvStateCode == "InvEcecState_BuildUp").First();
  7512. var currentTime = stock.ProductTime;
  7513. var startTime = currentTime.Hour >= 13 ? currentTime.Date.AddHours(13) : currentTime.Date.AddDays(-1).AddHours(13);
  7514. var endTime = currentTime.Hour >= 13 ? currentTime.Date.AddDays(1).AddHours(8) : currentTime.Date.AddHours(8);
  7515. //今天这一批次的扭转入库的分配楼层数量
  7516. 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();
  7517. int row = 8;
  7518. //var cellfloor1stockcount = existstock.Where(p => p.PutLayer >= 1 && p.PutLayer <= 4 && p.PutRow > row).Count(); //1楼层同规格数量
  7519. //var cellfloor2stockcount = existstock.Where(p => p.PutLayer >= 5 && p.PutLayer <= 8 && p.PutRow > row).Count(); //2楼层同规格数量
  7520. //var cellfloor3stockcount = existstock.Where(p => p.PutLayer >= 9 && p.PutLayer <= 12 && p.PutRow > row).Count(); //3楼层同规格数量
  7521. //bool isTobeTors = false;
  7522. int tun = 2;
  7523. //int row = 8;
  7524. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Empty).ToList();
  7525. var disabletunnels = _sysconfigrepository.GetList(p => p.SType == "InStop" && !string.IsNullOrEmpty(p.SContent));
  7526. if (disabletunnels != null && disabletunnels.Any())
  7527. {
  7528. foreach (var item in disabletunnels)
  7529. {
  7530. var distun = int.Parse(item.Default1);
  7531. var disfloor = int.Parse(item.Default2);
  7532. var disids = cell.Where(p => p.Floor == disfloor && p.Tunnel == distun).Select(p => p.Id);
  7533. cell = cell.Where(p => !disids.Contains(p.Id)).ToList();
  7534. }
  7535. }
  7536. const int MinAvailableCells = 30;// 最小有效货位数量,用于保留移库
  7537. var forbidLayer = wms.util.AppSettings.GetConfig("ForbidLayer");
  7538. // 定义楼层信息结构
  7539. var floors = Enumerable.Range(1, 3).Select(floorNumber =>
  7540. {
  7541. // 获取货位数
  7542. var cellQuery = cell.Where(p => p.Floor == floorNumber);
  7543. var cellCount = cellQuery.Count(p => p.Tunnel > tun);
  7544. if (!string.IsNullOrEmpty(forbidLayer) && forbidLayer.Contains(floorNumber.ToString())) cellCount = 0;
  7545. // 获取同规格库存数
  7546. var (minLayer, maxLayer) = floorNumber switch
  7547. {
  7548. 1 => (1, 4),
  7549. 2 => (5, 8),
  7550. 3 => (9, 12),
  7551. _ => (0, 0)
  7552. };
  7553. var stockQuery = existstock.Where(p => p.PutLayer >= minLayer && p.PutLayer <= maxLayer && p.PutRow > row);
  7554. // 计算库存比率
  7555. var stockRatio = cellCount > 0 ? stockQuery.Count() / (double)cellCount : 0;
  7556. // 获取任务限制数
  7557. var taskLimit = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == $"FloorTaskCount{floorNumber}").SType);
  7558. return new
  7559. {
  7560. Floor = floorNumber,
  7561. CellCount = cellCount,
  7562. StockRatio = stockRatio,
  7563. TaskLimit = taskLimit
  7564. };
  7565. })
  7566. // 排序:库存比例低优先 > 货位数高优先
  7567. .OrderBy(f => f.StockRatio)
  7568. .ThenByDescending(f => f.CellCount)
  7569. .ToList();
  7570. // 获取各楼层当前任务数
  7571. var floorTasks = _taskrepository.AsQueryable()
  7572. .Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.BusType == "扭转回库")
  7573. .ToList()
  7574. .GroupBy(p => p.Floor).ToDictionary(x => x.Key, x => x.Count());
  7575. var time10 = new Stopwatch();
  7576. time10.Restart();
  7577. // 选择楼层的策略
  7578. var selectedFloor = floors.FirstOrDefault(f =>
  7579. f.CellCount > MinAvailableCells &&
  7580. floorTasks.GetValueOrDefault(f.Floor, 0) < f.TaskLimit
  7581. );
  7582. // 次选策略:允许货位较少但未超限的楼层
  7583. selectedFloor ??= floors.FirstOrDefault(f =>
  7584. f.CellCount > 0 &&
  7585. floorTasks.GetValueOrDefault(f.Floor, 0) < f.TaskLimit
  7586. );
  7587. // 返回结果处理
  7588. if (selectedFloor != null)
  7589. {
  7590. res.ResData = selectedFloor.Floor;
  7591. }
  7592. else
  7593. {
  7594. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7595. res.ResMsg = $"{reqDto.Count} 扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层:" + string.Join("", floors.Select(f =>
  7596. $"{f.Floor}层({floorTasks.GetValueOrDefault(f.Floor)}/{f.TaskLimit}) "));
  7597. }
  7598. // var cellfloor1count = cell.Where(p => p.Floor == 1 && p.Tunnel > tun).Count(); //1楼层可用的货位数
  7599. // var cellfloor2count = cell.Where(p => p.Floor == 2 && p.Tunnel > tun).Count(); //2楼层可用的货位数
  7600. // var cellfloor3count = cell.Where(p => p.Floor == 3 && p.Tunnel > tun).Count(); //3楼层可用的货位数
  7601. // var forbidlayer = wms.util.AppSettings.GetConfig("ForbidLayer");//禁用的楼层
  7602. // if (!string.IsNullOrEmpty(forbidlayer))
  7603. // {
  7604. // if (forbidlayer.Contains("1")) cellfloor1count = 0;
  7605. // if (forbidlayer.Contains("2")) cellfloor2count = 0;
  7606. // if (forbidlayer.Contains("3")) cellfloor3count = 0;
  7607. // }
  7608. // var tempcells = new List<Tuple<int, int, double>>() {
  7609. // new Tuple<int, int,double>(1,cellfloor1count,cellfloor1stockcount / (cellfloor1count * 1.0)),
  7610. // new Tuple<int, int,double>(2,cellfloor2count,cellfloor2stockcount / (cellfloor2count * 1.0)),
  7611. // new Tuple<int, int,double>(3,cellfloor3count,cellfloor3stockcount / (cellfloor3count * 1.0)),
  7612. //};
  7613. // //tempcells = tempcells.OrderByDescending(p => p.Item2).ToList();
  7614. // tempcells = tempcells.OrderBy(p => p.Item3).ToList();//按照同规则物料少的排序
  7615. // //每个扫码固定楼层,如果固定楼层设备坏了或者库存满了,再换楼层
  7616. // var taskcount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish && p.Floor != 0).ToList();
  7617. // if (tempcells[0].Item2 > (reqDto.Count + 10))
  7618. // {
  7619. // if (taskcount.Where(p => p.Floor == tempcells[0].Item1).Count() > floorTaskCount || tempcells[0].Item2 == 0)
  7620. // {
  7621. // if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  7622. // {
  7623. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  7624. // {
  7625. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7626. // res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  7627. // res.ResData = 0;
  7628. // return res;
  7629. // }
  7630. // else
  7631. // {
  7632. // res.ResData = tempcells[2].Item1;
  7633. // }
  7634. // }
  7635. // else
  7636. // {
  7637. // res.ResData = tempcells[1].Item1;
  7638. // }
  7639. // }
  7640. // else
  7641. // {
  7642. // res.ResData = tempcells[0].Item1;
  7643. // }
  7644. // }
  7645. // else
  7646. // {
  7647. // if (tempcells[1].Item2 > (reqDto.Count + 10))
  7648. // {
  7649. // if (taskcount.Where(p => p.Floor == tempcells[1].Item1).Count() > floorTaskCount || tempcells[1].Item2 == 0)
  7650. // {
  7651. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() > floorTaskCount || tempcells[2].Item2 == 0)
  7652. // {
  7653. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7654. // res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  7655. // res.ResData = 0;
  7656. // return res;
  7657. // }
  7658. // else
  7659. // {
  7660. // res.ResData = tempcells[2].Item1;
  7661. // }
  7662. // }
  7663. // else
  7664. // {
  7665. // res.ResData = tempcells[1].Item1;
  7666. // }
  7667. // }
  7668. // else
  7669. // {
  7670. // if (taskcount.Where(p => p.Floor == tempcells[2].Item1).Count() < floorTaskCount && tempcells[2].Item2 > 30)
  7671. // {
  7672. // res.ResData = tempcells[2].Item1;
  7673. // }
  7674. // else
  7675. // {
  7676. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7677. // res.ResMsg = reqDto.Count + "扭转回库申请楼层失败,当前环线三个楼层执行中的任务数已满,不允许分配楼层";
  7678. // res.ResData = 0;
  7679. // return res;
  7680. // }
  7681. // }
  7682. // }
  7683. }
  7684. catch (Exception ex)
  7685. {
  7686. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7687. res.ResMsg = ex.StackTrace;
  7688. res.ResData = 0;
  7689. return res;
  7690. }
  7691. return res;
  7692. }
  7693. public SRes PalletizingPatchWheel(PalletizingPatchWheelRequest request)
  7694. {
  7695. var res = new SRes();
  7696. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == request.TaskNum && p.Status < TaskStatus.Finish && p.Type == TaskType.OutDepot).SplitTable(p => p.Take(2)).First();
  7697. if (task == null)
  7698. {
  7699. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7700. res.ResMsg = request.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7701. return res;
  7702. }
  7703. var taskold = _wcstaskoldrepository.AsQueryable().Where(p => p.WmsTask == request.TaskNum && p.Id != request.TaskNum).SplitTable(p => p.Take(2)).First();
  7704. if (taskold != null)
  7705. {
  7706. return res;
  7707. }
  7708. var pallet = _palletizrepository.GetSingle(p => p.Id == task.PalletizingId && p.PalletizState == 0);
  7709. if (pallet == null)
  7710. {
  7711. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7712. res.ResMsg = request.TaskNum + "没有找到码垛基础信息";
  7713. return res;
  7714. }
  7715. var stocks = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  7716. if (stocks == null)
  7717. {
  7718. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  7719. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7720. return res;
  7721. }
  7722. var rulebox = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  7723. try
  7724. {
  7725. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  7726. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == stocks.Grade && p.HWTypeCode == stocks.HWTypeCode
  7727. && p.IsRework == stocks.IsRework && p.IsBlack == stocks.IsBlack && p.MatCode == task.MatCode && p.WbGroupCode == stocks.WbGroupCode && p.SolderCount == stocks.SolderCount
  7728. && p.IsControlpanel == stocks.IsControlpanel && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  7729. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  7730. join rule1 in _boxrulerepository.GetList(p => p.ZXStateCode == 1 && p.Id == pallet.BoxRuleId)
  7731. on stock.InDocsNo equals rule1.DocsNo
  7732. select new
  7733. {
  7734. stock.MatCode,
  7735. stock.InvBarCode,
  7736. stock.Grade,
  7737. stock.InvStateCode,
  7738. stock.ProductTime,
  7739. stock.WbGroupCode,
  7740. stock.IsTorsChk,
  7741. stock.TorsChkQty,
  7742. stock.TorsChkValue,
  7743. stock.TorsChkChord,
  7744. stock.TorsChkFlatness,
  7745. stock.HoldTime,
  7746. stock.ProductMachCode,
  7747. stock.IsControlpanel,
  7748. stock.HWTypeCode,
  7749. stock.IsBlack,
  7750. stock.IsRework,
  7751. stock.SolderCount,
  7752. stock.TorsChkChordIsGood,
  7753. stock.TorsChkFlatnessIsGood,
  7754. stock.TorsChkValueIsGood,
  7755. loc.Col,
  7756. loc.Layer,
  7757. loc.Shelf,
  7758. loc.Depth,
  7759. loc.Code,
  7760. loc.Tunnel,
  7761. loc.SCRel,
  7762. loc.Floor,
  7763. loc.WarehouseCode,
  7764. loc.ContGrpBarCode,
  7765. loc.ContGrpId,
  7766. loc.Id,
  7767. loc.StateNum,
  7768. rule1.SkuCode
  7769. };
  7770. invlist = invlist.Distinct();
  7771. if (!string.IsNullOrEmpty(rulebox.SkuCode))
  7772. {
  7773. invlist = invlist.Where(p => p.SkuCode == rulebox.SkuCode);
  7774. }
  7775. if (pallet.BoxRule == "CP")
  7776. {
  7777. //计算扭转值、弓高、平直度
  7778. invlist = invlist.Where(p => p.TorsChkValueIsGood == "OK" && p.TorsChkChordIsGood == "OK" && p.TorsChkFlatnessIsGood == "OK" && p.IsTorsChk == true && p.TorsChkQty > 0 &&
  7779. 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());
  7780. }
  7781. else
  7782. {
  7783. if (stocks.IsControlpanel == true)
  7784. {
  7785. invlist = invlist.Where(p => p.IsTorsChk == true && p.IsControlpanel == true && p.TorsChkQty > 0);
  7786. }
  7787. else
  7788. {
  7789. invlist = invlist.Where(p => p.IsControlpanel == false);
  7790. }
  7791. }
  7792. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  7793. if (tunlist.Any())
  7794. {
  7795. if (tunlist.Where(p => p.Default2 == "1").Any())
  7796. {
  7797. invlist = invlist.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  7798. //invlist3 = invlist3.Where(p => p.Floor == 1 && !tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤1层被禁用的出库巷道
  7799. }
  7800. if (tunlist.Where(p => p.Default2 == "2").Any())
  7801. {
  7802. invlist = invlist.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  7803. //invlist3 = invlist3.Where(p => p.Floor == 2 && !tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤2层被禁用的出库巷道
  7804. }
  7805. if (tunlist.Where(p => p.Default2 == "3").Any())
  7806. {
  7807. invlist = invlist.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  7808. //invlist3 = invlist3.Where(p => p.Floor == 3 && !tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString())); //过滤3层被禁用的出库巷道
  7809. }
  7810. }
  7811. if (!invlist.Any())
  7812. {
  7813. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  7814. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription() + "没有待补的工字轮";
  7815. return res;
  7816. }
  7817. invlist = invlist.OrderBy(p => p.ProductTime);
  7818. foreach (var item in invlist)
  7819. {
  7820. if (item.Depth == 2)
  7821. {
  7822. var respon = MoveTask(item.Code);
  7823. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  7824. {
  7825. continue;
  7826. }
  7827. }
  7828. var wcs = new WCS_TaskInfo()
  7829. {
  7830. Status = TaskStatus.NewBuild,
  7831. Type = TaskType.OutDepot,
  7832. Priority = 0,
  7833. Device = item.SCRel,
  7834. SrmStation = item.SCRel,
  7835. AddrFrom = item.Code,
  7836. BarCode = item.ContGrpBarCode,
  7837. AddWho = "wms",
  7838. EditWho = "wms",
  7839. WarehouseCode = "sxhouse",
  7840. AddrTo = task.AddrTo,
  7841. FullQty = 1,
  7842. AgvTaskID = task.AgvTaskID, //层配层数
  7843. Tunnel = item.Tunnel.ToString(),
  7844. MaterialCode = item.MatCode,
  7845. MatCode = item.MatCode,
  7846. OutType = OutTypeEnum.自动出库任务,
  7847. BusType = SxTaskBusType.TaskBusType_SX_StackStockOut.GetDescription(),
  7848. Floor = item.Floor,
  7849. Grade = item.Grade,
  7850. WorkBench = item.ProductMachCode,
  7851. WmsTask = request.TaskNum, //需要补轮子的任务号
  7852. PalletizingId = task.PalletizingId,
  7853. Robot = task.Robot,
  7854. ProdLine = task.ProdLine,
  7855. GoodsType = item.HWTypeCode == "BS80/33" ? 1 : 2,
  7856. ManualRemarks = "排走的工字轮" + task.BarCode + "扫码设备" + request.Equip
  7857. };
  7858. _db.BeginTran();
  7859. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  7860. {
  7861. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  7862. EditTime = DateTime.Now,
  7863. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip
  7864. }, p => p.ContGrpBarCode == item.ContGrpBarCode);
  7865. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  7866. {
  7867. StateNum = LocationState.LocationState_StockOut,
  7868. EditTime = DateTime.Now
  7869. }, p => p.Code == item.Code);
  7870. var stock1 = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.ContGrpBarCode);
  7871. var flow1 = _mapper.Map<BillInvflow>(stock1);
  7872. flow1.Id = GetId();
  7873. flow1.AddTime = DateTime.Now;
  7874. flow1.EditTime = DateTime.Now;
  7875. flow1.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  7876. flow1.Memo = "装箱码垛出库";
  7877. _billInvflow.Insert(flow1);
  7878. var flow = _mapper.Map<BillInvflow>(stocks);
  7879. flow.Id = GetId();
  7880. flow.AddTime = DateTime.Now;
  7881. flow.EditTime = DateTime.Now;
  7882. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  7883. flow.Memo = "异常补轮" + request.TaskNum;
  7884. _billInvnowrepository.Delete(p => p.ContGrpBarCode == task.BarCode);
  7885. _billInvflow.Insert(flow);
  7886. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  7887. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  7888. var wcsdtl = new WCS_TaskDtl()
  7889. {
  7890. ID = Guid.NewGuid(),
  7891. CurPoint = wcstask.AddrFrom,
  7892. AddTime = DateTime.Now,
  7893. AddWho = "wms",
  7894. Enabled = true,
  7895. ParentTaskCode = wcstask.ID,
  7896. Desc = wcstask.BusType
  7897. };
  7898. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  7899. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  7900. var layer = new PalletLayerMath()
  7901. {
  7902. ContGrpId = (long)stock1.ContGrpId,
  7903. ContBarCode = stock1.ContGrpBarCode,
  7904. Layer = task.AgvTaskID,
  7905. SkuCode = rulebox.SkuCode,
  7906. Finish = 0,
  7907. PboxruleId = rulebox.Id,
  7908. Istask = 1,
  7909. Palletequip = task.AddrTo,
  7910. Memo = "补轮子任务号" + task.Id.ToString() + "条码" + task.BarCode + "扫码器" + request.Equip,
  7911. AddWho = "WCS",
  7912. EditWho = "WCS"
  7913. };
  7914. _palletlayerMathrepository.Insert(layer);
  7915. _db.CommitTran();
  7916. return res;
  7917. }
  7918. }
  7919. catch (Exception ex)
  7920. {
  7921. _db.RollbackTran();
  7922. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7923. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  7924. return res;
  7925. }
  7926. return res;
  7927. }
  7928. /// <summary>
  7929. /// 码垛强制结盘
  7930. /// </summary>
  7931. /// <param name="request"></param>
  7932. /// <returns></returns>
  7933. public SRes PalletizingForceknot(PalletizingForceknotRequest request)
  7934. {
  7935. var res = new SRes();
  7936. try
  7937. {
  7938. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  7939. if (pallet == null)
  7940. {
  7941. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7942. res.ResMsg = request.Equip + "没有当前码垛工位信息";
  7943. return res;
  7944. }
  7945. _palletizrepository.AsUpdateable().SetColumns(p => new Palletizing()
  7946. {
  7947. Finish = 1 + pallet.Finish,
  7948. Memo = "强制结盘时间:" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")
  7949. }).Where(p => p.Id == pallet.Id).ExecuteCommand();
  7950. }
  7951. catch (Exception ex)
  7952. {
  7953. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  7954. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  7955. return res;
  7956. }
  7957. return res;
  7958. }
  7959. public SRes Palletizinginfobinde(PalletizinginfobindeRequest request)
  7960. {
  7961. var res = new SRes();
  7962. try
  7963. {
  7964. if (!request.TaskNum.Any())
  7965. {
  7966. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  7967. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  7968. return res;
  7969. }
  7970. var pallet = _palletizrepository.GetSingle(p => p.Equip == request.Equip && p.PalletizState == 0);
  7971. if (pallet == null)
  7972. {
  7973. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7974. res.ResMsg = request.Equip + "没有当前码垛工位的单据信息";
  7975. return res;
  7976. }
  7977. var rule = _boxrulerepository.GetSingle(p => p.Id == pallet.BoxRuleId);
  7978. if (rule == null)
  7979. {
  7980. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7981. res.ResMsg = request.Equip + "码垛工位没有找到对应的装箱信息";
  7982. return res;
  7983. }
  7984. DateTime date = DateTime.Now;
  7985. var taskgroup = string.Join("|", request.TaskNum.OrderBy(p => p).ToList());
  7986. foreach (var item in request.TaskNum)
  7987. {
  7988. 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();
  7989. if (task == null)
  7990. {
  7991. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7992. res.ResMsg = item + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7993. return res;
  7994. }
  7995. if (task.PalletizingId != pallet.Id)
  7996. {
  7997. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7998. res.ResMsg = pallet.Equip + "当前工位抓取任务和码垛主表信息不匹配,不能完成抓取,请确认是否混箱";
  7999. return res;
  8000. }
  8001. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  8002. if (stock == null)
  8003. {
  8004. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  8005. res.ResMsg = item + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  8006. return res;
  8007. }
  8008. var palletdetails = _palletizdetailrepository.GetSingle(p => p.TaskNum == item);
  8009. if (palletdetails != null)
  8010. {
  8011. if (palletdetails.Memo == taskgroup)
  8012. {
  8013. continue;
  8014. }
  8015. else
  8016. {
  8017. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  8018. res.ResMsg = pallet.Equip + "当前任务请确认是否重复上传,不能完成抓取";
  8019. return res;
  8020. }
  8021. }
  8022. //根据任务实际计算层
  8023. var fincount = _palletlayerMathrepository.Count(p => p.Palletequip == task.AddrTo && p.Istask == 1 && p.Finish == 1);
  8024. int layer = (fincount / 12) + 1;
  8025. //var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//近3张分表
  8026. //foreach (var tbname in tables)
  8027. //{
  8028. // //更新1点到6点时间内数据
  8029. // _wcstaskoldrepository.Context.Updateable<WCS_TaskOld>().AS(tbname.TableName)//使用分表名
  8030. // .SetColumns(it => new WCS_TaskOld()
  8031. // {
  8032. // EndTime = DateTime.Now,
  8033. // ManualRemarks = layer.ToString()
  8034. // })
  8035. // .Where(p => p.Id == item)
  8036. // .ExecuteCommand();
  8037. //}
  8038. _db.BeginTran();
  8039. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8040. {
  8041. Finish = 1
  8042. }, p => p.ContBarCode == task.BarCode && p.ContGrpId == stock.ContGrpId && p.Palletequip == task.AddrTo && p.Istask == 1);
  8043. var palletdetail = new Palletizingdetail()
  8044. {
  8045. PalletizingId = pallet.Id,
  8046. TaskNum = item,
  8047. PackRule = pallet.BoxRule.ToString(),
  8048. Sku = rule.SkuCode,
  8049. BarCode = task.BarCode,
  8050. Layer = layer,
  8051. WbGroupCode = stock.WbGroupCode,
  8052. GradeCode = stock.Grade,
  8053. AddWho = "",
  8054. EditWho = "",
  8055. MaterialCode = stock.MatCode,
  8056. MaterialDesc = stock.MatName,
  8057. InDocsNo = stock.InDocsNo,
  8058. Batch = rule.BatchNo,
  8059. IsBlack = stock.IsBlack,
  8060. IsControlpanel = pallet.IsControlpanel,
  8061. Winding = stock.Wind,
  8062. SolderCount = stock.SolderCount,
  8063. PalletizingDate = date,
  8064. OvcFlag = pallet.IsControlpanel == true ? 2 : 0,
  8065. OvcValue = string.IsNullOrEmpty(stock.TorsChkValue.ToString()) ? 0.ToString() : stock.TorsChkValue.ToString(),
  8066. EquNo = pallet.Equip,
  8067. TolWQty = stock.TolWQty,
  8068. TareWQty = stock.TareWQty,
  8069. NetWQty = stock.NetWQty,
  8070. CLBarCode = stock.CLBarCode,
  8071. BoxCode = rule.PBoxCode,
  8072. Memo = taskgroup
  8073. //Memo = layer.ToString()
  8074. };
  8075. _palletizdetailrepository.Insert(palletdetail);
  8076. //更新历史任务
  8077. //_wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  8078. //{
  8079. // EndTime = DateTime.Now,
  8080. // ManualRemarks = layer.ToString()
  8081. //}).Where(p => p.Id == task.Id).SplitTable(p => p.Take(2)).ExecuteCommand();
  8082. _logger.LogInformation("实际层末尾");
  8083. _db.CommitTran();
  8084. }
  8085. }
  8086. catch (Exception ex)
  8087. {
  8088. _db.RollbackTran();
  8089. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  8090. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  8091. return res;
  8092. }
  8093. return res;
  8094. }
  8095. public SRes GetMesErrorInfo(SxErrorinfoRequest request)
  8096. {
  8097. var res = new SRes();
  8098. var wcsCode = _errorinfowcs.AsQueryable().With(SqlWith.NoLock).Where(v => v.ContBarCode == request.Code).OrderByDescending(p => p.AddTime).ToList();
  8099. if (!wcsCode.Any())
  8100. {
  8101. res.ResMsg = request.Code + ",扫码失败";
  8102. res.Memo1 = request.Code + ",扫码失败";
  8103. return res;
  8104. }
  8105. else
  8106. {
  8107. res.Memo1 = request.Code + "," + wcsCode.First().Message;
  8108. return res;
  8109. }
  8110. return res;
  8111. }
  8112. private SRes SpcErrorTaskinfo(PalletizingPackTaskRequest request)
  8113. {
  8114. var res = new SRes();
  8115. try
  8116. {
  8117. var wcs = new WCS_TaskInfo()
  8118. {
  8119. Status = TaskStatus.NewBuild,
  8120. Type = TaskType.OutDepot,
  8121. Priority = 0,
  8122. Device = request.Srm,
  8123. SrmStation = request.Srm,
  8124. AddrFrom = request.CellCode,
  8125. BarCode = request.Code,
  8126. AddWho = "wms",
  8127. EditWho = "wms",
  8128. WarehouseCode = "sxhouse",
  8129. AddrTo = "5186",
  8130. Tunnel = request.Tunnel,
  8131. MaterialCode = request.Mater,
  8132. MatCode = request.Mater,
  8133. OutType = OutTypeEnum.自动出库任务,
  8134. BusType = SxTaskBusType.TaskBusType_SX_ErrorStockOut.GetDescription(),
  8135. Floor = request.Floor,
  8136. Grade = request.Grade,
  8137. ManualRemarks = request.Memo
  8138. };
  8139. _db.BeginTran();
  8140. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8141. {
  8142. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  8143. EditTime = DateTime.Now
  8144. }, p => p.ContGrpBarCode == request.Code);
  8145. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  8146. {
  8147. StateNum = LocationState.LocationState_StockOut,
  8148. EditTime = DateTime.Now
  8149. }, p => p.Code == request.CellCode);
  8150. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  8151. var flow = _mapper.Map<BillInvflow>(stock);
  8152. flow.Id = GetId();
  8153. flow.AddTime = DateTime.Now;
  8154. flow.EditTime = DateTime.Now;
  8155. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  8156. flow.Memo = "异常出库";
  8157. _billInvflow.Insert(flow);
  8158. var wcstask = _taskrepository.InsertReturnEntity(wcs);
  8159. _wcstaskoldrepository.InsertableSplitTable(_mapper.Map<WCS_TaskOld>(wcstask));
  8160. var wcsdtl = new WCS_TaskDtl()
  8161. {
  8162. ID = Guid.NewGuid(),
  8163. CurPoint = request.Code,
  8164. AddTime = DateTime.Now,
  8165. AddWho = "wms",
  8166. Enabled = true,
  8167. ParentTaskCode = wcstask.ID,
  8168. Desc = wcstask.BusType
  8169. };
  8170. _taskdetailrepository.InsertableSplitTable(wcsdtl);
  8171. _db.CommitTran();
  8172. }
  8173. catch (Exception ex)
  8174. {
  8175. _db.RollbackTran();
  8176. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8177. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription() + ex.Message;
  8178. return res;
  8179. }
  8180. return res;
  8181. }
  8182. /// <summary>
  8183. /// B质量码垛出库
  8184. /// </summary>
  8185. /// <param name="request"></param>
  8186. /// <returns></returns>
  8187. public SRes PalletizingPackBStockOut(PalletizingPackStockOutRequest request)
  8188. {
  8189. var res = new SRes();
  8190. var isforbid = _sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").Default1;
  8191. if (isforbid == "1")
  8192. {
  8193. res.ResMsg = "B质量码垛已禁用";
  8194. return res;
  8195. }
  8196. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "BGrade");
  8197. if (palletlist.Any())
  8198. {
  8199. foreach (var item in palletlist)
  8200. {
  8201. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  8202. if (equips == null)
  8203. {
  8204. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut2", new RedisErrorInfo() { Equip = "BGradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  8205. continue;
  8206. }
  8207. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  8208. if (!palletMach.Any())
  8209. {
  8210. //RedisHelper.Set("Sx:WMSErrorInfo:BGradeOut3", new RedisErrorInfo() { Equip = "BGradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  8211. continue;
  8212. }
  8213. //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;
  8214. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  8215. var curdocid = maxdocid + 1;
  8216. if (palletMach.Any())
  8217. {
  8218. var pid = palletMach.First().PalletizingId;
  8219. 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)
  8220. {
  8221. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  8222. }
  8223. }
  8224. foreach (var pallets in palletMach)
  8225. {
  8226. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  8227. if (cell == null)
  8228. {
  8229. continue;
  8230. }
  8231. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8232. if (invs == null)
  8233. {
  8234. continue;
  8235. }
  8236. var root = DetermineRoot(pallets.Palletequip);
  8237. //先判断二升位是否能出库
  8238. if (cell.Depth == 2)
  8239. {
  8240. var respon = MoveTask(cell.Code);
  8241. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  8242. {
  8243. continue;
  8244. }
  8245. }
  8246. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  8247. {
  8248. Code = pallets.ContBarCode,
  8249. CellCode = cell.Code,
  8250. Srm = cell.SCRel,
  8251. Tunnel = cell.Tunnel.ToString(),
  8252. Floor = cell.Floor,
  8253. Grade = invs.Grade,
  8254. Mater = invs.MatCode,
  8255. SkuCode = pallets.SkuCode,
  8256. PalletLayer = 0,
  8257. ProductMachCode = invs.ProductMachCode,
  8258. Equip = item.Equip,
  8259. PalletizingId = item.Id,
  8260. Robot = root,
  8261. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  8262. DocId = curdocid
  8263. });
  8264. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8265. {
  8266. continue;
  8267. }
  8268. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8269. {
  8270. Istask = 1,
  8271. Layer = 0
  8272. }, p => p.ContBarCode == invs.ContGrpBarCode);
  8273. }
  8274. }
  8275. }
  8276. //取视图码垛设备号
  8277. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  8278. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Cache2State) && string.IsNullOrEmpty(p.Memo) && p.AddWho != "禁用").Any())
  8279. {
  8280. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  8281. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8282. res.ResMsg = "没有空闲的码垛工位";
  8283. return res;
  8284. }
  8285. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  8286. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  8287. if (!devices.Where(p => p.pH_STATUS == true).Any())
  8288. {
  8289. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  8290. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8291. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  8292. return res;
  8293. }
  8294. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  8295. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent);
  8296. //
  8297. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8298. 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
  8299. && ((p.ProductMachCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours <= timeOutHoldHours) || (!p.ProductMachCode.Contains("R") && ((DateTime.Now - p.OneInTime).TotalHours <= timeOutHoldHours))))
  8300. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8301. select new StockTemp
  8302. {
  8303. MatCode = stock.MatCode,
  8304. InvBarCode = stock.InvBarCode,
  8305. Grade = stock.Grade,
  8306. InvStateCode = stock.InvStateCode,
  8307. ProductTime = stock.ProductTime,
  8308. WbGroupCode = stock.WbGroupCode,
  8309. IsTorsChk = stock.IsTorsChk,
  8310. TorsChkQty = stock.TorsChkQty,
  8311. TorsChkValue = stock.TorsChkValue,
  8312. HoldTime = stock.HoldTime,
  8313. ProductMachCode = stock.ProductMachCode,
  8314. IsControlpanel = stock.IsControlpanel,
  8315. HWTypeCode = stock.HWTypeCode,
  8316. SolderCount = stock.SolderCount,
  8317. IsRework = stock.IsRework,
  8318. IsBlack = stock.IsBlack,
  8319. Col = loc.Col,
  8320. Layer = loc.Layer,
  8321. Shelf = loc.Shelf,
  8322. Depth = loc.Depth,
  8323. Code = loc.Code,
  8324. Tunnel = loc.Tunnel,
  8325. SCRel = loc.SCRel,
  8326. Floor = loc.Floor,
  8327. WarehouseCode = loc.WarehouseCode,
  8328. ContGrpBarCode = loc.ContGrpBarCode,
  8329. ContGrpId = loc.ContGrpId,
  8330. Id = loc.Id,
  8331. StateNum = loc.StateNum,
  8332. Wind = stock.Wind,
  8333. InDocsNo = stock.InDocsNo
  8334. };
  8335. if (!invlist1.Any())
  8336. {
  8337. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  8338. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8339. res.ResMsg = "库存不足";
  8340. return res;
  8341. }
  8342. invlist1 = invlist1.Distinct();
  8343. var temps = invlist1.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  8344. var rules = new BillPboxrule();
  8345. foreach (var item in temps)
  8346. {
  8347. var invlist2 = invlist1.Where(p => p.HWTypeCode == item.Key);
  8348. if (!invlist2.Any())
  8349. {
  8350. continue;
  8351. }
  8352. var mater = invlist2.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  8353. foreach (var stockTemps in mater)
  8354. {
  8355. var invlist = invlist2.Where(p => p.MatCode == stockTemps.Key);
  8356. if (!invlist.Any())
  8357. {
  8358. continue;
  8359. }
  8360. //else if (invlist.Count() < 36)
  8361. //{
  8362. // res.ResMsg = "B质量数量不满足";
  8363. // continue;
  8364. //}
  8365. var ti = DateTime.Now;
  8366. var yaar = ti.Year.ToString().Substring(2, 2);
  8367. var month = ti.Month.ToString().PadLeft(2, '0');
  8368. var day = ti.Day.ToString().PadLeft(2, '0');
  8369. //获取当天最大箱号
  8370. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "B" && p.Year == yaar && p.Month == month && p.Day == day);
  8371. string boxserial = "HAZDB";
  8372. if (maxnumre.Any())
  8373. {
  8374. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  8375. _boxserialrepository.Insert(new BillBoxSerial()
  8376. {
  8377. Year = yaar,
  8378. Month = month,
  8379. Day = day,
  8380. Num = maxnumre.Max(q => q.Num) + 1,
  8381. BoxNum = boxserial,
  8382. Grade = "B",
  8383. AddTime = DateTime.Now,
  8384. AddWho = "wms",
  8385. EditTime = DateTime.Now,
  8386. EditWho = "wms"
  8387. });
  8388. }
  8389. else
  8390. {
  8391. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  8392. _boxserialrepository.Insert(new BillBoxSerial()
  8393. {
  8394. Year = yaar,
  8395. Month = month,
  8396. Day = day,
  8397. Num = 1,
  8398. BoxNum = boxserial,
  8399. Grade = "B",
  8400. AddTime = DateTime.Now,
  8401. AddWho = "wms",
  8402. EditTime = DateTime.Now,
  8403. EditWho = "wms"
  8404. });
  8405. }
  8406. //B质量不区分绕向
  8407. //invlist = invlist.Where(p => p.Wind == "R");
  8408. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  8409. rule.Id = GetId();
  8410. rule.PBoxCode = boxserial;
  8411. rule.Wind = "";
  8412. rule.ZXStateCode = 1;
  8413. rule.SpoolType = item.Key;
  8414. rule.PackRule = "BGrade";
  8415. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  8416. rule.SkuCode = "TestBGrade";
  8417. rule.BatchNo = "1";
  8418. rules = _boxrulerepository.InsertReturnEntity(rule);
  8419. if (item.Key == "BS60" || item.Key == "BS40")
  8420. {
  8421. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  8422. }
  8423. else
  8424. {
  8425. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  8426. }
  8427. 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();
  8428. //码垛信息校验
  8429. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  8430. {
  8431. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8432. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  8433. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  8434. return res;
  8435. }
  8436. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  8437. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  8438. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  8439. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8440. {
  8441. res.ResCode = trayres.ResCode;
  8442. res.ResMsg = trayres.ResMsg;
  8443. //RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  8444. return res;
  8445. }
  8446. var root = DetermineRoot(palletequip.Code);
  8447. var pallet = new Palletizing()
  8448. {
  8449. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  8450. PalletizState = 0,
  8451. Equip = palletequip.Code,
  8452. Finish = 0,
  8453. AddWho = "",
  8454. EditWho = "",
  8455. BoxRule = rules.PackRule,
  8456. BoxRuleId = rules.Id,
  8457. IsControlpanel = false,
  8458. TaskNum = int.Parse(trayres.Memo1),
  8459. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  8460. Robot = root
  8461. };
  8462. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8463. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8464. foreach (var invs in invlist)
  8465. {
  8466. var palletlayer = new PalletLayerMath()
  8467. {
  8468. ContGrpId = (long)invs.ContGrpId,
  8469. ContBarCode = invs.ContGrpBarCode,
  8470. Layer = 0,
  8471. SkuCode = rules.SkuCode,
  8472. Finish = 0,
  8473. PboxruleId = rules.Id,
  8474. Istask = 0,
  8475. Palletequip = palletequip.Code,
  8476. Depth = invs.Depth,
  8477. IsBlack = invs.IsBlack,
  8478. SolderCount = invs.SolderCount,
  8479. BoxCode = rules.PBoxCode,
  8480. PalletizingId = pallects.Id
  8481. };
  8482. math.Add(palletlayer);
  8483. }
  8484. _palletlayerMathrepository.InsertRange(math);
  8485. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8486. {
  8487. PreStock = "1"
  8488. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  8489. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  8490. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  8491. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  8492. var curdocid = maxdocid + 1;
  8493. if (palletMach.Any())
  8494. {
  8495. var pid = palletMach.First().PalletizingId;
  8496. 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)
  8497. {
  8498. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  8499. }
  8500. }
  8501. foreach (var code in invlist)
  8502. {
  8503. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  8504. if (cell == null)
  8505. {
  8506. continue;
  8507. }
  8508. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8509. if (invs == null)
  8510. {
  8511. continue;
  8512. }
  8513. //先判断二升位是否能出库
  8514. if (code.Depth == 2)
  8515. {
  8516. var respon = MoveTask(code.Code);
  8517. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  8518. {
  8519. continue;
  8520. }
  8521. }
  8522. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  8523. {
  8524. Code = code.ContGrpBarCode,
  8525. Equip = pallects.Equip,
  8526. Mater = code.MatCode,
  8527. Srm = code.SCRel,
  8528. PalletLayer = 1,
  8529. Grade = code.Grade,
  8530. Tunnel = code.Tunnel.ToString(),
  8531. CellCode = code.Code,
  8532. SkuCode = rules.SkuCode,
  8533. ProductMachCode = code.ProductMachCode,
  8534. Floor = code.Floor,
  8535. PalletizingId = pallects.Id,
  8536. Robot = root,
  8537. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  8538. DocId = curdocid
  8539. });
  8540. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8541. {
  8542. continue;
  8543. }
  8544. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8545. {
  8546. Istask = 1,
  8547. Layer = 1
  8548. }, p => p.ContBarCode == code.ContGrpBarCode);
  8549. }
  8550. return res;
  8551. }
  8552. }
  8553. return res;
  8554. }
  8555. public CurStockListResponse GetCurStockList(CurStockListRequest request)
  8556. {
  8557. var res = new CurStockListResponse() { ResData = new List<resItmes>() };
  8558. var stock = _billInvnowrepository.Context.Queryable<BillInvnow, BaseMatinfo>((inv, mater) => new object[]
  8559. {
  8560. JoinType.Left, inv.MatCode == mater.Code
  8561. })
  8562. .Where((inv, mater) => inv.InvStateCode == InvState.InvEcecState_In.ToString())
  8563. .WhereIF(!string.IsNullOrEmpty(request.MatCode), (inv, mater) => inv.MatCode.Contains(request.MatCode))
  8564. .WhereIF(!string.IsNullOrEmpty(request.MatName), (inv, mater) => inv.MatName.Contains(request.MatName))
  8565. .Select((inv, mater) => new resItmes()
  8566. {
  8567. MatCode = mater.Code,
  8568. MatBarCode = inv.CLBarCode,
  8569. SpoolCode = inv.ContGrpBarCode,
  8570. WbCode = inv.ProductMachCode,
  8571. WorkOrder = inv.InDocsNo,
  8572. SpoolType = inv.HWTypeCode,
  8573. Length = (decimal)mater.Length,
  8574. Weight = (decimal)mater.Weight,
  8575. ProductDate = inv.ProductTime,
  8576. IsHold = mater.IsHold,
  8577. IsBlack = inv.IsBlack,
  8578. IsCore = inv.IsCore,
  8579. IsRework = inv.IsRework,
  8580. Grade = inv.Grade,
  8581. SolderCount = inv.SolderCount,
  8582. HoldDuration = mater.HoldDuration,
  8583. LocRow = inv.PutRow.ToString(),
  8584. LocCell = inv.PutCol.ToString(),
  8585. LocLayer = inv.PutLayer.ToString(),
  8586. WareCode = "sxhouse"
  8587. })
  8588. .ToList();
  8589. res.ResData = stock;
  8590. return res;
  8591. }
  8592. public SRes UpdateBoxNo(UpdateBoxNoRequest request)
  8593. {
  8594. var res = new SRes();
  8595. var list = _boxrulerepository.GetList(p => request.List.Contains(p.DocsNo)).OrderBy(p => p.Id);
  8596. var index = request.StartIndex;
  8597. foreach (var item in list)
  8598. {
  8599. _boxrulerepository.UpdateModelColumns(p => new BillPboxrule() { PBoxCode = "888888" + index.ToString(), EditTime = DateTime.Now },
  8600. p => p.Id == item.Id);
  8601. index++;
  8602. }
  8603. return res;
  8604. }
  8605. public SRes UpdateBlackCount(UpdateBlackCountReq request)
  8606. {
  8607. var res = new SRes();
  8608. var blackcount = _sysconfigrepository.GetSingle(p => p.Code == "BlackCount");
  8609. if (blackcount == null)
  8610. {
  8611. res.ResCode = 0;
  8612. res.ResMsg = "更新失败,没有配置";
  8613. return res;
  8614. }
  8615. if (request.SpoolType == "1")
  8616. {
  8617. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default1 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  8618. p => p.Id == blackcount.Id);
  8619. }
  8620. else if (request.SpoolType == "2")
  8621. {
  8622. _sysconfigrepository.UpdateModelColumns(p => new sxSysConfig() { Default2 = request.Count.ToString(), EditTime = DateTime.Now, EditWho = "MES" },
  8623. p => p.Id == blackcount.Id);
  8624. }
  8625. else
  8626. {
  8627. res.ResCode = 0;
  8628. res.ResMsg = "更新失败,SpoolType传值无效";
  8629. return res;
  8630. }
  8631. return res;
  8632. }
  8633. /// <summary>
  8634. /// 重绕超时码垛
  8635. /// </summary>
  8636. /// <param name="request"></param>
  8637. /// <returns></returns>
  8638. public SRes ChongraoPackStockOut(PalletizingPackStockOutRequest request)
  8639. {
  8640. var res = new SRes();
  8641. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "SpecialCHA");
  8642. if (palletlist.Any())
  8643. {
  8644. foreach (var item in palletlist)
  8645. {
  8646. //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));
  8647. //if (tasklist.Any())
  8648. //{
  8649. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  8650. // continue;
  8651. //}
  8652. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  8653. if (equips == null)
  8654. {
  8655. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  8656. continue;
  8657. }
  8658. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  8659. if (!palletMach.Any())
  8660. {
  8661. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  8662. continue;
  8663. }
  8664. //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;
  8665. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  8666. var curdocid = maxdocid + 1;
  8667. if (palletMach.Any())
  8668. {
  8669. var pid = palletMach.First().PalletizingId;
  8670. 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)
  8671. {
  8672. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  8673. }
  8674. }
  8675. foreach (var pallets in palletMach)
  8676. {
  8677. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  8678. if (cell == null)
  8679. {
  8680. continue;
  8681. }
  8682. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8683. if (invs == null)
  8684. {
  8685. continue;
  8686. }
  8687. var root = DetermineRoot(pallets.Palletequip);
  8688. //先判断二升位是否能出库
  8689. if (cell.Depth == 2)
  8690. {
  8691. var respon = MoveTask(cell.Code);
  8692. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  8693. {
  8694. continue;
  8695. }
  8696. }
  8697. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  8698. {
  8699. Code = pallets.ContBarCode,
  8700. CellCode = cell.Code,
  8701. Srm = cell.SCRel,
  8702. Tunnel = cell.Tunnel.ToString(),
  8703. Floor = cell.Floor,
  8704. Grade = invs.Grade,
  8705. Mater = invs.MatCode,
  8706. SkuCode = pallets.SkuCode,
  8707. PalletLayer = 0,
  8708. ProductMachCode = invs.ProductMachCode,
  8709. Equip = item.Equip,
  8710. PalletizingId = item.Id,
  8711. Robot = root,
  8712. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  8713. DocId = curdocid
  8714. });
  8715. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8716. {
  8717. continue;
  8718. }
  8719. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  8720. {
  8721. Istask = 1,
  8722. Layer = 0
  8723. }, p => p.ContBarCode == invs.ContGrpBarCode);
  8724. }
  8725. }
  8726. }
  8727. //取视图码垛设备号
  8728. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  8729. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  8730. {
  8731. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  8732. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8733. res.ResMsg = "没有空闲的码垛工位";
  8734. return res;
  8735. }
  8736. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  8737. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  8738. if (!devices.Where(p => p.pH_STATUS == true).Any())
  8739. {
  8740. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  8741. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8742. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  8743. return res;
  8744. }
  8745. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  8746. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  8747. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  8748. //
  8749. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  8750. 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
  8751. && p.InDocsNo.StartsWith("R") && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  8752. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  8753. select new StockTemp
  8754. {
  8755. MatCode = stock.MatCode,
  8756. InvBarCode = stock.InvBarCode,
  8757. Grade = stock.Grade,
  8758. InvStateCode = stock.InvStateCode,
  8759. ProductTime = stock.ProductTime,
  8760. OneInTime = stock.OneInTime,
  8761. WbGroupCode = stock.WbGroupCode,
  8762. IsTorsChk = stock.IsTorsChk,
  8763. TorsChkQty = stock.TorsChkQty,
  8764. TorsChkValue = stock.TorsChkValue,
  8765. HoldTime = stock.HoldTime,
  8766. ProductMachCode = stock.ProductMachCode,
  8767. IsControlpanel = stock.IsControlpanel,
  8768. HWTypeCode = stock.HWTypeCode,
  8769. SolderCount = stock.SolderCount,
  8770. IsRework = stock.IsRework,
  8771. IsBlack = stock.IsBlack,
  8772. Col = loc.Col,
  8773. Layer = loc.Layer,
  8774. Shelf = loc.Shelf,
  8775. Depth = loc.Depth,
  8776. Code = loc.Code,
  8777. Tunnel = loc.Tunnel,
  8778. SCRel = loc.SCRel,
  8779. Floor = loc.Floor,
  8780. WarehouseCode = loc.WarehouseCode,
  8781. ContGrpBarCode = loc.ContGrpBarCode,
  8782. ContGrpId = loc.ContGrpId,
  8783. Id = loc.Id,
  8784. StateNum = loc.StateNum,
  8785. Wind = stock.Wind,
  8786. InDocsNo = stock.InDocsNo
  8787. };
  8788. //禁用巷道过滤
  8789. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  8790. if (tunlist.Any())
  8791. {
  8792. if (tunlist.Where(p => p.Default2 == "1").Any())
  8793. {
  8794. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8795. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  8796. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  8797. }
  8798. if (tunlist.Where(p => p.Default2 == "2").Any())
  8799. {
  8800. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8801. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  8802. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  8803. }
  8804. if (tunlist.Where(p => p.Default2 == "3").Any())
  8805. {
  8806. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  8807. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  8808. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  8809. }
  8810. }
  8811. if (!invlist.Any())
  8812. {
  8813. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  8814. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8815. res.ResMsg = "库存不足";
  8816. return res;
  8817. }
  8818. invlist = invlist.Distinct();
  8819. var temps = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.HWTypeCode);
  8820. var rules = new BillPboxrule();
  8821. foreach (var item in temps)
  8822. {
  8823. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  8824. if (!invlist.Any())
  8825. {
  8826. continue;
  8827. }
  8828. var mater = invlist.OrderBy(p => p.OneInTime).GroupBy(p => p.MatCode).ToList();
  8829. foreach (var stockTemps in mater)
  8830. {
  8831. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  8832. if (!invlist.Any())
  8833. {
  8834. continue;
  8835. }
  8836. var ti = DateTime.Now;
  8837. var yaar = ti.Year.ToString().Substring(2, 2);
  8838. var month = ti.Month.ToString().PadLeft(2, '0');
  8839. var day = ti.Day.ToString().PadLeft(2, '0');
  8840. //获取当天最大箱号
  8841. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  8842. string boxserial = "HAZDA";
  8843. if (maxnumre.Any())
  8844. {
  8845. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  8846. _boxserialrepository.Insert(new BillBoxSerial()
  8847. {
  8848. Year = yaar,
  8849. Month = month,
  8850. Day = day,
  8851. Num = maxnumre.Max(q => q.Num) + 1,
  8852. BoxNum = boxserial,
  8853. Grade = "A",
  8854. AddTime = DateTime.Now,
  8855. AddWho = "wms",
  8856. EditTime = DateTime.Now,
  8857. EditWho = "wms"
  8858. });
  8859. }
  8860. else
  8861. {
  8862. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  8863. _boxserialrepository.Insert(new BillBoxSerial()
  8864. {
  8865. Year = yaar,
  8866. Month = month,
  8867. Day = day,
  8868. Num = 1,
  8869. BoxNum = boxserial,
  8870. Grade = "A",
  8871. AddTime = DateTime.Now,
  8872. AddWho = "wms",
  8873. EditTime = DateTime.Now,
  8874. EditWho = "wms"
  8875. });
  8876. }
  8877. if (invlist.Any(p => p.Wind == "L"))
  8878. {
  8879. invlist = invlist.Where(p => p.Wind == "L");
  8880. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  8881. rule.Id = GetId();
  8882. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  8883. rule.PBoxCode = boxserial;
  8884. rule.Wind = "L";
  8885. rule.ZXStateCode = 1;
  8886. rule.SpoolType = item.Key;
  8887. rule.PackRule = "SpecialCHA";
  8888. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  8889. rule.SkuCode = "Test123";
  8890. rule.BatchNo = "1";
  8891. rules = _boxrulerepository.InsertReturnEntity(rule);
  8892. }
  8893. else
  8894. {
  8895. invlist = invlist.Where(p => p.Wind == "R");
  8896. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  8897. rule.Id = GetId();
  8898. rule.PBoxCode = boxserial;
  8899. rule.Wind = "R";
  8900. rule.ZXStateCode = 1;
  8901. rule.SpoolType = item.Key;
  8902. rule.PackRule = "SpecialCHA";
  8903. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  8904. rule.SkuCode = "Test123";
  8905. rule.BatchNo = "1";
  8906. rules = _boxrulerepository.InsertReturnEntity(rule);
  8907. }
  8908. if (item.Key == "BS60" || item.Key == "BS40")
  8909. {
  8910. invlist = invlist.OrderBy(p => p.OneInTime).Take(72);
  8911. }
  8912. else
  8913. {
  8914. invlist = invlist.OrderBy(p => p.OneInTime).Take(36);
  8915. }
  8916. 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();
  8917. //码垛信息校验
  8918. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  8919. {
  8920. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  8921. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  8922. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  8923. return res;
  8924. }
  8925. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  8926. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  8927. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  8928. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  8929. {
  8930. res.ResCode = trayres.ResCode;
  8931. res.ResMsg = trayres.ResMsg;
  8932. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  8933. return res;
  8934. }
  8935. var root = DetermineRoot(palletequip.Code);
  8936. var pallet = new Palletizing()
  8937. {
  8938. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  8939. PalletizState = 0,
  8940. Equip = palletequip.Code,
  8941. Finish = 0,
  8942. AddWho = "",
  8943. EditWho = "",
  8944. BoxRule = rules.PackRule,
  8945. BoxRuleId = rules.Id,
  8946. IsControlpanel = false,
  8947. TaskNum = int.Parse(trayres.Memo1),
  8948. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  8949. Robot = root
  8950. };
  8951. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  8952. List<PalletLayerMath> math = new List<PalletLayerMath>();
  8953. foreach (var invs in invlist)
  8954. {
  8955. var palletlayer = new PalletLayerMath()
  8956. {
  8957. ContGrpId = (long)invs.ContGrpId,
  8958. ContBarCode = invs.ContGrpBarCode,
  8959. Layer = 0,
  8960. SkuCode = rules.SkuCode,
  8961. Finish = 0,
  8962. PboxruleId = rules.Id,
  8963. Istask = 0,
  8964. Palletequip = palletequip.Code,
  8965. Depth = invs.Depth,
  8966. IsBlack = invs.IsBlack,
  8967. SolderCount = invs.SolderCount,
  8968. BoxCode = rules.PBoxCode,
  8969. PalletizingId = pallects.Id
  8970. };
  8971. math.Add(palletlayer);
  8972. }
  8973. _palletlayerMathrepository.InsertRange(math);
  8974. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  8975. {
  8976. PreStock = "1"
  8977. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  8978. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  8979. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  8980. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  8981. var curdocid = maxdocid + 1;
  8982. if (palletMach.Any())
  8983. {
  8984. var pid = palletMach.First().PalletizingId;
  8985. 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)
  8986. {
  8987. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  8988. }
  8989. }
  8990. foreach (var code in invlist)
  8991. {
  8992. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  8993. if (cell == null)
  8994. {
  8995. continue;
  8996. }
  8997. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  8998. if (invs == null)
  8999. {
  9000. continue;
  9001. }
  9002. //先判断二升位是否能出库
  9003. if (code.Depth == 2)
  9004. {
  9005. var respon = MoveTask(code.Code);
  9006. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9007. {
  9008. continue;
  9009. }
  9010. }
  9011. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  9012. {
  9013. Code = code.ContGrpBarCode,
  9014. Equip = pallects.Equip,
  9015. Mater = code.MatCode,
  9016. Srm = code.SCRel,
  9017. PalletLayer = 1,
  9018. Grade = code.Grade,
  9019. Tunnel = code.Tunnel.ToString(),
  9020. CellCode = code.Code,
  9021. SkuCode = rules.SkuCode,
  9022. ProductMachCode = code.ProductMachCode,
  9023. Floor = code.Floor,
  9024. PalletizingId = pallects.Id,
  9025. Robot = root,
  9026. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  9027. DocId = curdocid
  9028. });
  9029. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9030. {
  9031. continue;
  9032. }
  9033. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9034. {
  9035. Istask = 1,
  9036. Layer = 1
  9037. }, p => p.ContBarCode == code.ContGrpBarCode);
  9038. }
  9039. return res;
  9040. }
  9041. }
  9042. return res;
  9043. }
  9044. public SRes SolderErrorStockOut(PalletizingPackStockOutRequest request)
  9045. {
  9046. var res = new SRes();
  9047. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  9048. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && string.IsNullOrEmpty(p.PreStock) && p.SolderCount > 0)
  9049. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  9050. select new
  9051. {
  9052. stock.MatCode,
  9053. stock.InvBarCode,
  9054. stock.Grade,
  9055. stock.InvStateCode,
  9056. stock.ProductTime,
  9057. stock.WbGroupCode,
  9058. stock.IsTorsChk,
  9059. stock.TorsChkQty,
  9060. stock.TorsChkValue,
  9061. stock.HoldTime,
  9062. stock.ProductMachCode,
  9063. stock.IsControlpanel,
  9064. stock.HWTypeCode,
  9065. stock.SolderCount,
  9066. stock.IsRework,
  9067. stock.IsBlack,
  9068. stock.InDocsNo,
  9069. loc.Col,
  9070. loc.Layer,
  9071. loc.Shelf,
  9072. loc.Depth,
  9073. loc.Code,
  9074. loc.Tunnel,
  9075. loc.SCRel,
  9076. loc.Floor,
  9077. loc.WarehouseCode,
  9078. loc.ContGrpBarCode,
  9079. loc.ContGrpId,
  9080. loc.Id,
  9081. loc.StateNum
  9082. };
  9083. if (!invlist.Any())
  9084. {
  9085. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9086. res.ResMsg = "库存不足";
  9087. return res;
  9088. }
  9089. invlist = invlist.OrderBy(p => p.ProductTime);
  9090. foreach (var item in invlist)
  9091. {
  9092. 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)
  9093. {
  9094. SpcErrorTaskinfo(new PalletizingPackTaskRequest()
  9095. {
  9096. Srm = item.SCRel,
  9097. CellCode = item.Code,
  9098. Code = item.ContGrpBarCode,
  9099. Tunnel = item.Tunnel.ToString(),
  9100. Floor = item.Floor,
  9101. Grade = item.Grade,
  9102. Mater = item.MatCode,
  9103. Memo = "焊点不符,自动排出"
  9104. });
  9105. }
  9106. }
  9107. return res;
  9108. }
  9109. public SRes ForceCancelTask(ErrorTaskRequest request)
  9110. {
  9111. var res = new SRes();
  9112. if (string.IsNullOrEmpty(request.TaskNo))
  9113. {
  9114. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9115. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  9116. return res;
  9117. }
  9118. if (request.WareHouse != Const.SxWareHouse)
  9119. {
  9120. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9121. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9122. return res;
  9123. }
  9124. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == int.Parse(request.TaskNo) && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  9125. if (task == null)
  9126. {
  9127. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  9128. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  9129. return res;
  9130. }
  9131. if (_taskrepository.Delete(p => p.ID == int.Parse(request.TaskNo)))
  9132. {
  9133. _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();
  9134. //删除码垛信息
  9135. _palletlayerMathrepository.Delete(p => p.ContBarCode == task.BarCode);
  9136. _palletizdetailrepository.Delete(p => p.BarCode == task.BarCode);
  9137. _logger.LogInformation("强制取消任务" + request.TaskNo);
  9138. }
  9139. return res;
  9140. }
  9141. public SRes DeleteStockInfo(DetailCodeStrRequest request)
  9142. {
  9143. var res = new SRes();
  9144. if (request.WareHouse != Const.SxWareHouse)
  9145. {
  9146. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9147. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9148. return res;
  9149. }
  9150. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  9151. if (stock == null)
  9152. {
  9153. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9154. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  9155. return res;
  9156. }
  9157. else
  9158. {
  9159. //_billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9160. if (stock.InvStateCode == InvState.InvEcecState_In.ToString())
  9161. {
  9162. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9163. res.ResMsg = $"工字轮{stock.ContGrpBarCode} | 已在库中,不允许删除";
  9164. return res;
  9165. }
  9166. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  9167. {
  9168. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9169. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9170. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  9171. flow.Id = GetId();
  9172. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  9173. flow.AddTime = DateTime.Now;
  9174. flow.EditTime = DateTime.Now;
  9175. flow.Memo = "异常处理库存";
  9176. _billInvflow.Insert(flow);
  9177. }
  9178. else if (stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  9179. {
  9180. if (stock.PutRow == 0 && stock.PutCol == 0 && stock.PutLayer == 0)
  9181. {
  9182. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9183. _billInvinitrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9184. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == stock.ContGrpBarCode).OrderByDescending(p => p.AddTime).First();
  9185. flow.Id = GetId();
  9186. flow.InvStateCode = InvState.InvEcecState_Out.ToString();
  9187. flow.AddTime = DateTime.Now;
  9188. flow.EditTime = DateTime.Now;
  9189. flow.Memo = "异常处理库存";
  9190. _billInvflow.Insert(flow);
  9191. }
  9192. }
  9193. }
  9194. return res;
  9195. }
  9196. public SRes DeleteTorsBind(DetailCodeStrRequest request)
  9197. {
  9198. var res = new SRes();
  9199. if (request.WareHouse != Const.SxWareHouse)
  9200. {
  9201. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9202. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9203. return res;
  9204. }
  9205. var stock = _torchbandinforepository.GetSingle(p => p.ContBarCode == request.Code);
  9206. if (stock == null)
  9207. {
  9208. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9209. res.ResMsg = request.Code + "不存在扭转绑定信息";
  9210. return res;
  9211. }
  9212. else
  9213. {
  9214. _torchbandinforepository.Delete(p => p.ContBarCode == request.Code);
  9215. }
  9216. return res;
  9217. }
  9218. public SRes DeleteHwPre(DetailCodeStrRequest request)
  9219. {
  9220. var res = new SRes();
  9221. if (request.WareHouse != Const.SxWareHouse)
  9222. {
  9223. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9224. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9225. return res;
  9226. }
  9227. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  9228. if (stock == null)
  9229. {
  9230. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9231. res.ResMsg = request.Code + "不存在库存信息";
  9232. return res;
  9233. }
  9234. else
  9235. {
  9236. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  9237. {
  9238. PreStock = ""
  9239. }, p => p.ContGrpBarCode == request.Code);
  9240. }
  9241. return res;
  9242. }
  9243. public SRes UpdateStockState(DetailCodeStr1Requestdto request)
  9244. {
  9245. var res = new SRes();
  9246. if (request.WareHouse != Const.SxWareHouse)
  9247. {
  9248. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9249. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9250. return res;
  9251. }
  9252. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  9253. if (stock == null)
  9254. {
  9255. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9256. res.ResMsg = request.Code + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  9257. return res;
  9258. }
  9259. var status = "";
  9260. switch (request.State)
  9261. {
  9262. case 1:
  9263. status = InvState.InvEcecState_BuildUp.ToString();
  9264. break;
  9265. case 3:
  9266. status = InvState.InvEcecState_In.ToString();
  9267. break;
  9268. case 4:
  9269. status = InvState.InvEcecState_OutGoing.ToString();
  9270. break;
  9271. case 5:
  9272. status = InvState.InvEcecState_Out.ToString();
  9273. break;
  9274. default:
  9275. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  9276. res.ResMsg = "状态" + ResponseStatusCodeEnum.ErrParam.GetDescription();
  9277. return res;
  9278. }
  9279. try
  9280. {
  9281. var p = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9282. {
  9283. InvStateCode = status,
  9284. EditTime = DateTime.Now
  9285. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  9286. if (!p)
  9287. {
  9288. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9289. res.ResMsg = stock.ContGrpBarCode + ResponseStatusCodeEnum.Fail.GetDescription();
  9290. return res;
  9291. }
  9292. var flow = _mapper.Map<BillInvflow>(stock);
  9293. flow.Id = GetId();
  9294. flow.AddTime = DateTime.Now;
  9295. flow.EditTime = DateTime.Now;
  9296. flow.InvStateCode = status;
  9297. _billInvflow.Insert(flow);
  9298. }
  9299. catch (Exception ex)
  9300. {
  9301. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9302. res.ResMsg = request.Code + ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  9303. return res;
  9304. }
  9305. return res;
  9306. }
  9307. public SRes UpdateCellState(DetailCodeStr1Requestdto request)
  9308. {
  9309. var res = new SRes();
  9310. if (request.WareHouse != Const.SxWareHouse)
  9311. {
  9312. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9313. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9314. return res;
  9315. }
  9316. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Code);
  9317. if (cell == null)
  9318. {
  9319. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9320. res.ResMsg = request.Code + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9321. return res;
  9322. }
  9323. var st = (LocationState)request.State;
  9324. if (request.State == 1)
  9325. {
  9326. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9327. {
  9328. StateNum = st,
  9329. ContGrpBarCode = "",
  9330. ContGrpId = 0,
  9331. EditTime = DateTime.Now
  9332. }, p => p.Code == request.Code);
  9333. }
  9334. else
  9335. {
  9336. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9337. {
  9338. StateNum = st,
  9339. EditTime = DateTime.Now
  9340. }, p => p.Code == request.Code);
  9341. }
  9342. return res;
  9343. }
  9344. public SRes DataSwapCell(DataSwapCellStrRequest request)
  9345. {
  9346. var res = new SRes();
  9347. if (request.WareHouse != Const.SxWareHouse)
  9348. {
  9349. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9350. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9351. return res;
  9352. }
  9353. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  9354. if (fromCell == null)
  9355. {
  9356. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9357. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9358. return res;
  9359. }
  9360. if (fromCell.StateNum != LocationState.LocationState_Full)
  9361. {
  9362. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9363. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许互换";
  9364. return res;
  9365. }
  9366. var fromstock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9367. if (fromstock == null)
  9368. {
  9369. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9370. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  9371. return res;
  9372. }
  9373. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  9374. if (toCell == null)
  9375. {
  9376. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9377. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9378. return res;
  9379. }
  9380. if (toCell.StateNum != LocationState.LocationState_Full)
  9381. {
  9382. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9383. res.ResMsg = request.EndEquip + "货位不是有货状态,不允许互换";
  9384. return res;
  9385. }
  9386. var tostock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == toCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9387. if (tostock == null)
  9388. {
  9389. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9390. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  9391. return res;
  9392. }
  9393. try
  9394. {
  9395. _db.BeginTran();
  9396. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9397. {
  9398. ContGrpBarCode = fromCell.ContGrpBarCode,
  9399. ContGrpId = fromCell.ContGrpId
  9400. }, p => p.Code == toCell.Code);
  9401. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9402. {
  9403. ContGrpBarCode = toCell.ContGrpBarCode,
  9404. ContGrpId = toCell.ContGrpId
  9405. }, p => p.Code == fromCell.Code);
  9406. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  9407. {
  9408. PutRow = toCell.Row,
  9409. PutCol = toCell.Col,
  9410. PutLayer = toCell.Layer
  9411. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  9412. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow()
  9413. {
  9414. PutRow = fromCell.Row,
  9415. PutCol = fromCell.Col,
  9416. PutLayer = fromCell.Layer
  9417. }, p => p.ContGrpBarCode == toCell.ContGrpBarCode);
  9418. _db.CommitTran();
  9419. }
  9420. catch (Exception ex)
  9421. {
  9422. _db.RollbackTran();
  9423. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9424. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  9425. return res;
  9426. }
  9427. return res;
  9428. }
  9429. public SRes DataBasePatch(DataBasePatchRequest request)
  9430. {
  9431. var res = new SRes();
  9432. if (request.WareHouse != Const.SxWareHouse)
  9433. {
  9434. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9435. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9436. return res;
  9437. }
  9438. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.Code);
  9439. if (stock != null)
  9440. {
  9441. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9442. res.ResMsg = request.Code + "存在组盘信息,不允许补数据";
  9443. return res;
  9444. }
  9445. var cell = _basewarecellrepository.GetSingle(p => p.Code == request.Cell);
  9446. if (cell == null)
  9447. {
  9448. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9449. res.ResMsg = request.Cell + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9450. return res;
  9451. }
  9452. if (cell.StateNum != LocationState.LocationState_Empty)
  9453. {
  9454. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9455. res.ResMsg = request.Cell + "货位状态不是空货位,不允许补数据";
  9456. return res;
  9457. }
  9458. try
  9459. {
  9460. if (request.ContGrpType == 1)
  9461. {
  9462. var boxCode = _billInvnowrepository.GetSingle(p => p.BoxBarCode == request.BoxCode);
  9463. if (boxCode != null)
  9464. {
  9465. res.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  9466. res.ResMsg = request.BoxCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  9467. return res;
  9468. }
  9469. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.BoxBarCode == request.BoxCode && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  9470. if (flow == null)
  9471. {
  9472. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9473. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  9474. return res;
  9475. }
  9476. }
  9477. else if (request.ContGrpType == 2 || request.ContGrpType == 3)
  9478. {
  9479. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.ContGrpType == request.ContGrpType).OrderByDescending(p => p.EditTime).First();
  9480. if (flow == null)
  9481. {
  9482. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9483. res.ResMsg = request.Code + "不存在流水信息,不允许补数据";
  9484. return res;
  9485. }
  9486. flow.InvStateCode = InvState.InvEcecState_In.ToString();
  9487. flow.Id = GetId();
  9488. flow.AddTime = DateTime.Now;
  9489. flow.EditTime = DateTime.Now;
  9490. flow.PutRow = cell.Row;
  9491. flow.PutCol = cell.Col;
  9492. flow.PutLayer = cell.Layer;
  9493. flow.AddWho = "wms";
  9494. flow.EditWho = "wms";
  9495. flow.Memo = "手动补数据";
  9496. _db.BeginTran();
  9497. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  9498. _billInvflow.Insert(flow);
  9499. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9500. {
  9501. ContGrpBarCode = flow.ContGrpBarCode,
  9502. ContGrpId = flow.ContGrpId,
  9503. StateNum = LocationState.LocationState_Full,
  9504. IsStop = 0,
  9505. EditTime = DateTime.Now
  9506. }, p => p.Code == cell.Code);
  9507. _db.CommitTran();
  9508. }
  9509. }
  9510. catch (Exception ex)
  9511. {
  9512. _db.RollbackTran();
  9513. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9514. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  9515. return res;
  9516. }
  9517. return res;
  9518. }
  9519. public SRes DataBasePatch2(DataBasePatchRequest request)
  9520. {
  9521. var res = new SRes();
  9522. try
  9523. {
  9524. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "扭转回库").OrderByDescending(p => p.EditTime).First();
  9525. if (flow == null)
  9526. {
  9527. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9528. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  9529. return res;
  9530. }
  9531. if (flow.IsControlpanel == true && flow.IsTorsChk)
  9532. {
  9533. flow.Id = GetId();
  9534. flow.AddTime = DateTime.Now;
  9535. flow.EditTime = DateTime.Now;
  9536. flow.AddWho = "wms";
  9537. flow.EditWho = "wms";
  9538. flow.Memo = "手动补数据,更新扭转数据";
  9539. _db.BeginTran();
  9540. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9541. {
  9542. TorsChkQty = flow.TorsChkQty,
  9543. TorsChkTime = flow.TorsChkTime,
  9544. SideNum = 1,
  9545. TorsChkValue = flow.TorsChkValue,
  9546. TorsChkMachCode = flow.TorsChkMachCode,
  9547. Memo = flow.Memo,
  9548. TorsChkChord = flow.TorsChkChord,
  9549. TorsChkFlatness = flow.TorsChkFlatness,
  9550. TorsChkStation = flow.TorsChkStation,
  9551. TorsChkChordIsGood = flow.TorsChkChordIsGood,
  9552. TorsChkFlatnessIsGood = flow.TorsChkFlatnessIsGood,
  9553. TorsChkValueIsGood = flow.TorsChkValueIsGood,
  9554. //FailReason = "测试"+ flow.Memo
  9555. }, p => p.ContGrpBarCode == flow.ContGrpBarCode);
  9556. _billInvflow.Insert(flow);
  9557. _db.CommitTran();
  9558. }
  9559. }
  9560. catch (Exception ex)
  9561. {
  9562. _db.RollbackTran();
  9563. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9564. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  9565. return res;
  9566. }
  9567. return res;
  9568. }
  9569. public SRes DataBasePatch3(DataBasePatchRequest request)
  9570. {
  9571. var res = new SRes();
  9572. try
  9573. {
  9574. var flow = _billInvflow.AsQueryable().Where(p => p.ContGrpBarCode == request.Code && p.Memo == "装箱码垛出库").OrderByDescending(p => p.EditTime).First();
  9575. if (flow == null)
  9576. {
  9577. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9578. res.ResMsg = request.Code + "不存在扭转流水信息,不允许补数据";
  9579. return res;
  9580. }
  9581. _billInvnowrepository.Insert(_mapper.Map<BillInvnow>(flow));
  9582. _billInvinitrepository.Insert(_mapper.Map<BillInvinit>(flow));
  9583. }
  9584. catch (Exception ex)
  9585. {
  9586. _db.RollbackTran();
  9587. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9588. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  9589. return res;
  9590. }
  9591. return res;
  9592. }
  9593. public SRes UpdatePurchState(UpdatePurchStateRequestdto request)
  9594. {
  9595. var res = new SRes();
  9596. if (!request.Id.Any())
  9597. {
  9598. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  9599. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  9600. return res;
  9601. }
  9602. foreach (var item in request.Id)
  9603. {
  9604. var pursh = _billPushinforepository.GetSingle(p => p.Id == item);
  9605. if (pursh != null)
  9606. {
  9607. _billPushinforepository.UpdateSetColumnsTrue(p => new BillPushinfo()
  9608. {
  9609. PostQty = 5,
  9610. PostResult = 0,
  9611. Memo = "手动推送"
  9612. }, p => p.Id == pursh.Id);
  9613. }
  9614. }
  9615. return res;
  9616. }
  9617. public SRes DataMoveCell(DataSwapCellStrRequest request)
  9618. {
  9619. var res = new SRes();
  9620. if (request.WareHouse != Const.SxWareHouse)
  9621. {
  9622. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  9623. res.ResMsg = request.WareHouse + ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  9624. return res;
  9625. }
  9626. var fromCell = _basewarecellrepository.GetSingle(p => p.Code == request.StatEquip);
  9627. if (fromCell == null)
  9628. {
  9629. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9630. res.ResMsg = request.StatEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9631. return res;
  9632. }
  9633. if (fromCell.StateNum != LocationState.LocationState_Full)
  9634. {
  9635. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9636. res.ResMsg = request.StatEquip + "货位不是有货状态,不允许转移";
  9637. return res;
  9638. }
  9639. var toCell = _basewarecellrepository.GetSingle(p => p.Code == request.EndEquip);
  9640. if (toCell == null)
  9641. {
  9642. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  9643. res.ResMsg = request.EndEquip + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  9644. return res;
  9645. }
  9646. if (toCell.StateNum != LocationState.LocationState_Empty)
  9647. {
  9648. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9649. res.ResMsg = request.EndEquip + "货位不是无货状态,不允许转移";
  9650. return res;
  9651. }
  9652. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == fromCell.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9653. if (stock == null)
  9654. {
  9655. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  9656. res.ResMsg = fromCell.ContGrpBarCode + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  9657. return res;
  9658. }
  9659. try
  9660. {
  9661. _db.BeginTran();
  9662. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9663. {
  9664. StateNum = LocationState.LocationState_Empty,
  9665. ContGrpBarCode = "",
  9666. ContGrpId = 0,
  9667. EditTime = DateTime.Now
  9668. }, p => p.Code == fromCell.Code);
  9669. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell()
  9670. {
  9671. StateNum = LocationState.LocationState_Full,
  9672. ContGrpBarCode = fromCell.ContGrpBarCode,
  9673. ContGrpId = fromCell.ContGrpId,
  9674. EditTime = DateTime.Now
  9675. }, p => p.Code == toCell.Code);
  9676. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  9677. {
  9678. PutRow = toCell.Row,
  9679. PutCol = toCell.Col,
  9680. PutLayer = toCell.Layer
  9681. }, p => p.ContGrpBarCode == fromCell.ContGrpBarCode);
  9682. _db.CommitTran();
  9683. }
  9684. catch (Exception ex)
  9685. {
  9686. _db.RollbackTran();
  9687. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9688. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + ex.Message;
  9689. return res;
  9690. }
  9691. return res;
  9692. }
  9693. public SRes TaskRepeatSend(TaskRepeatRequest request)
  9694. {
  9695. var res = new SRes();
  9696. if (!request.TaskNo.Any())
  9697. {
  9698. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  9699. res.ResMsg = "任务号" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  9700. return res;
  9701. }
  9702. var wcsTask = _taskrepository.GetList(p => request.TaskNo.Contains(p.ID) && p.Status == TaskStatus.码垛抓取中);
  9703. if (wcsTask.Count == request.TaskNo.Count)
  9704. {
  9705. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  9706. {
  9707. Status = TaskStatus.码垛抓取扫码,
  9708. EditTime = DateTime.Now,
  9709. ManualRemarks = "机器人重复下发任务"
  9710. }, p => request.TaskNo.Contains(p.ID));
  9711. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  9712. {
  9713. Status = TaskStatus.码垛抓取扫码,
  9714. EditTime = DateTime.Now,
  9715. ManualRemarks = "机器人重复下发任务"
  9716. }).Where(p => request.TaskNo.Contains(p.Id)).SplitTable(p => p.Take(2)).ExecuteCommand();
  9717. }
  9718. else
  9719. {
  9720. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9721. res.ResMsg = "申请的任务数不等于查询结果的任务数";
  9722. return res;
  9723. }
  9724. return res;
  9725. }
  9726. public SRes UpdateTaskState(UpdateTaskStateRequest request)
  9727. {
  9728. var res = new SRes();
  9729. var task = _taskrepository.GetSingle(p => p.ID == request.TaskNo);
  9730. if (task == null)
  9731. {
  9732. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  9733. res.ResMsg = request.TaskNo + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  9734. return res;
  9735. }
  9736. _taskrepository.UpdateSetColumnsTrue(p => new WCS_TaskInfo()
  9737. {
  9738. Status = request.Status,
  9739. EditTime = DateTime.Now,
  9740. ManualRemarks = "手动修改任务状态"
  9741. }, p => p.ID == request.TaskNo);
  9742. _wcstaskoldrepository.AsUpdateable().SetColumns(p => new WCS_TaskOld()
  9743. {
  9744. Status = request.Status,
  9745. EditTime = DateTime.Now,
  9746. ManualRemarks = "手动修改任务状态"
  9747. }).Where(p => p.Id == request.TaskNo).SplitTable(p => p.Take(2)).ExecuteCommand();
  9748. return res;
  9749. }
  9750. /// <summary>
  9751. /// 超时码垛
  9752. /// </summary>
  9753. /// <param name="request"></param>
  9754. /// <returns></returns>
  9755. public SRes SpecialStockOut(PalletizingPackStockOutRequest request)
  9756. {
  9757. var res = new SRes();
  9758. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "Special");
  9759. if (palletlist.Any())
  9760. {
  9761. foreach (var item in palletlist)
  9762. {
  9763. //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));
  9764. //if (tasklist.Any())
  9765. //{
  9766. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  9767. // continue;
  9768. //}
  9769. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  9770. if (equips == null)
  9771. {
  9772. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  9773. continue;
  9774. }
  9775. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  9776. if (!palletMach.Any())
  9777. {
  9778. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  9779. continue;
  9780. }
  9781. //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;
  9782. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  9783. var curdocid = maxdocid + 1;
  9784. if (palletMach.Any())
  9785. {
  9786. var pid = palletMach.First().PalletizingId;
  9787. 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)
  9788. {
  9789. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  9790. }
  9791. }
  9792. foreach (var pallets in palletMach)
  9793. {
  9794. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  9795. if (cell == null)
  9796. {
  9797. continue;
  9798. }
  9799. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  9800. if (invs == null)
  9801. {
  9802. continue;
  9803. }
  9804. var root = DetermineRoot(pallets.Palletequip);
  9805. //先判断二升位是否能出库
  9806. if (cell.Depth == 2)
  9807. {
  9808. var respon = MoveTask(cell.Code);
  9809. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  9810. {
  9811. continue;
  9812. }
  9813. }
  9814. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  9815. {
  9816. Code = pallets.ContBarCode,
  9817. CellCode = cell.Code,
  9818. Srm = cell.SCRel,
  9819. Tunnel = cell.Tunnel.ToString(),
  9820. Floor = cell.Floor,
  9821. Grade = invs.Grade,
  9822. Mater = invs.MatCode,
  9823. SkuCode = pallets.SkuCode,
  9824. PalletLayer = 0,
  9825. ProductMachCode = invs.ProductMachCode,
  9826. Equip = item.Equip,
  9827. PalletizingId = item.Id,
  9828. Robot = root,
  9829. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  9830. DocId = curdocid
  9831. });
  9832. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  9833. {
  9834. continue;
  9835. }
  9836. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  9837. {
  9838. Istask = 1,
  9839. Layer = 0
  9840. }, p => p.ContBarCode == invs.ContGrpBarCode);
  9841. }
  9842. }
  9843. }
  9844. //取视图码垛设备号
  9845. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  9846. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  9847. {
  9848. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  9849. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9850. res.ResMsg = "没有空闲的码垛工位";
  9851. return res;
  9852. }
  9853. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  9854. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  9855. if (!devices.Where(p => p.pH_STATUS == true).Any())
  9856. {
  9857. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  9858. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9859. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  9860. return res;
  9861. }
  9862. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  9863. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  9864. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  9865. //
  9866. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  9867. 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")
  9868. && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  9869. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  9870. select new StockTemp
  9871. {
  9872. MatCode = stock.MatCode,
  9873. InvBarCode = stock.InvBarCode,
  9874. Grade = stock.Grade,
  9875. InvStateCode = stock.InvStateCode,
  9876. ProductTime = stock.ProductTime,
  9877. WbGroupCode = stock.WbGroupCode,
  9878. IsTorsChk = stock.IsTorsChk,
  9879. TorsChkQty = stock.TorsChkQty,
  9880. TorsChkValue = stock.TorsChkValue,
  9881. HoldTime = stock.HoldTime,
  9882. ProductMachCode = stock.ProductMachCode,
  9883. IsControlpanel = stock.IsControlpanel,
  9884. HWTypeCode = stock.HWTypeCode,
  9885. SolderCount = stock.SolderCount,
  9886. IsRework = stock.IsRework,
  9887. IsBlack = stock.IsBlack,
  9888. Col = loc.Col,
  9889. Layer = loc.Layer,
  9890. Shelf = loc.Shelf,
  9891. Depth = loc.Depth,
  9892. Code = loc.Code,
  9893. Tunnel = loc.Tunnel,
  9894. SCRel = loc.SCRel,
  9895. Floor = loc.Floor,
  9896. WarehouseCode = loc.WarehouseCode,
  9897. ContGrpBarCode = loc.ContGrpBarCode,
  9898. ContGrpId = loc.ContGrpId,
  9899. Id = loc.Id,
  9900. StateNum = loc.StateNum,
  9901. Wind = stock.Wind,
  9902. InDocsNo = stock.InDocsNo
  9903. };
  9904. var invlist1 = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  9905. 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")
  9906. && (DateTime.Now - p.OneInTime).TotalHours > timeOutHoldHours)
  9907. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  9908. select new StockTemp
  9909. {
  9910. MatCode = stock.MatCode,
  9911. InvBarCode = stock.InvBarCode,
  9912. Grade = stock.Grade,
  9913. InvStateCode = stock.InvStateCode,
  9914. ProductTime = stock.ProductTime,
  9915. WbGroupCode = stock.WbGroupCode,
  9916. IsTorsChk = stock.IsTorsChk,
  9917. TorsChkQty = stock.TorsChkQty,
  9918. TorsChkValue = stock.TorsChkValue,
  9919. HoldTime = stock.HoldTime,
  9920. ProductMachCode = stock.ProductMachCode,
  9921. IsControlpanel = stock.IsControlpanel,
  9922. HWTypeCode = stock.HWTypeCode,
  9923. SolderCount = stock.SolderCount,
  9924. IsRework = stock.IsRework,
  9925. IsBlack = stock.IsBlack,
  9926. Col = loc.Col,
  9927. Layer = loc.Layer,
  9928. Shelf = loc.Shelf,
  9929. Depth = loc.Depth,
  9930. Code = loc.Code,
  9931. Tunnel = loc.Tunnel,
  9932. SCRel = loc.SCRel,
  9933. Floor = loc.Floor,
  9934. WarehouseCode = loc.WarehouseCode,
  9935. ContGrpBarCode = loc.ContGrpBarCode,
  9936. ContGrpId = loc.ContGrpId,
  9937. Id = loc.Id,
  9938. StateNum = loc.StateNum,
  9939. Wind = stock.Wind,
  9940. InDocsNo = stock.InDocsNo
  9941. };
  9942. invlist = invlist.Union(invlist1);
  9943. invlist = invlist.Where(x => x.InDocsNo != "O2507080014001ALX01R");
  9944. //禁用巷道过滤
  9945. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  9946. if (tunlist.Any())
  9947. {
  9948. if (tunlist.Where(p => p.Default2 == "1").Any())
  9949. {
  9950. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  9951. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  9952. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  9953. }
  9954. if (tunlist.Where(p => p.Default2 == "2").Any())
  9955. {
  9956. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  9957. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  9958. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  9959. }
  9960. if (tunlist.Where(p => p.Default2 == "3").Any())
  9961. {
  9962. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  9963. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  9964. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  9965. }
  9966. }
  9967. if (!invlist.Any())
  9968. {
  9969. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  9970. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  9971. res.ResMsg = "库存不足";
  9972. return res;
  9973. }
  9974. invlist = invlist.Distinct();
  9975. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  9976. var rules = new BillPboxrule();
  9977. foreach (var item in temps)
  9978. {
  9979. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  9980. if (!invlist.Any())
  9981. {
  9982. continue;
  9983. }
  9984. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.MatCode).ToList();
  9985. foreach (var stockTemps in mater)
  9986. {
  9987. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  9988. if (!invlist.Any())
  9989. {
  9990. continue;
  9991. }
  9992. var ti = DateTime.Now;
  9993. var yaar = ti.Year.ToString().Substring(2, 2);
  9994. var month = ti.Month.ToString().PadLeft(2, '0');
  9995. var day = ti.Day.ToString().PadLeft(2, '0');
  9996. //获取当天最大箱号
  9997. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  9998. string boxserial = "HAZDA";
  9999. if (maxnumre.Any())
  10000. {
  10001. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  10002. _boxserialrepository.Insert(new BillBoxSerial()
  10003. {
  10004. Year = yaar,
  10005. Month = month,
  10006. Day = day,
  10007. Num = maxnumre.Max(q => q.Num) + 1,
  10008. BoxNum = boxserial,
  10009. Grade = "A",
  10010. AddTime = DateTime.Now,
  10011. AddWho = "wms",
  10012. EditTime = DateTime.Now,
  10013. EditWho = "wms"
  10014. });
  10015. }
  10016. else
  10017. {
  10018. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  10019. _boxserialrepository.Insert(new BillBoxSerial()
  10020. {
  10021. Year = yaar,
  10022. Month = month,
  10023. Day = day,
  10024. Num = 1,
  10025. BoxNum = boxserial,
  10026. Grade = "A",
  10027. AddTime = DateTime.Now,
  10028. AddWho = "wms",
  10029. EditTime = DateTime.Now,
  10030. EditWho = "wms"
  10031. });
  10032. }
  10033. if (invlist.Any(p => p.Wind == "L"))
  10034. {
  10035. invlist = invlist.Where(p => p.Wind == "L");
  10036. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10037. rule.Id = GetId();
  10038. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  10039. rule.PBoxCode = boxserial;
  10040. rule.Wind = "L";
  10041. rule.ZXStateCode = 1;
  10042. rule.SpoolType = item.Key;
  10043. rule.PackRule = "Special";
  10044. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10045. rule.SkuCode = "Test123";
  10046. rule.BatchNo = "1";
  10047. rules = _boxrulerepository.InsertReturnEntity(rule);
  10048. }
  10049. else
  10050. {
  10051. invlist = invlist.Where(p => p.Wind == "R");
  10052. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10053. rule.Id = GetId();
  10054. rule.PBoxCode = boxserial;
  10055. rule.Wind = "R";
  10056. rule.ZXStateCode = 1;
  10057. rule.SpoolType = item.Key;
  10058. rule.PackRule = "Special";
  10059. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10060. rule.SkuCode = "Test123";
  10061. rule.BatchNo = "1";
  10062. rules = _boxrulerepository.InsertReturnEntity(rule);
  10063. }
  10064. if (item.Key == "BS60" || item.Key == "BS40")
  10065. {
  10066. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  10067. }
  10068. else
  10069. {
  10070. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  10071. }
  10072. 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();
  10073. //码垛信息校验
  10074. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  10075. {
  10076. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10077. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  10078. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  10079. return res;
  10080. }
  10081. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  10082. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  10083. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  10084. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10085. {
  10086. res.ResCode = trayres.ResCode;
  10087. res.ResMsg = trayres.ResMsg;
  10088. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  10089. return res;
  10090. }
  10091. var root = DetermineRoot(palletequip.Code);
  10092. var pallet = new Palletizing()
  10093. {
  10094. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  10095. PalletizState = 0,
  10096. Equip = palletequip.Code,
  10097. Finish = 0,
  10098. AddWho = "",
  10099. EditWho = "",
  10100. BoxRule = rules.PackRule,
  10101. BoxRuleId = rules.Id,
  10102. IsControlpanel = false,
  10103. TaskNum = int.Parse(trayres.Memo1),
  10104. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  10105. Robot = root
  10106. };
  10107. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  10108. List<PalletLayerMath> math = new List<PalletLayerMath>();
  10109. foreach (var invs in invlist)
  10110. {
  10111. var palletlayer = new PalletLayerMath()
  10112. {
  10113. ContGrpId = (long)invs.ContGrpId,
  10114. ContBarCode = invs.ContGrpBarCode,
  10115. Layer = 0,
  10116. SkuCode = rules.SkuCode,
  10117. Finish = 0,
  10118. PboxruleId = rules.Id,
  10119. Istask = 0,
  10120. Palletequip = palletequip.Code,
  10121. Depth = invs.Depth,
  10122. IsBlack = invs.IsBlack,
  10123. SolderCount = invs.SolderCount,
  10124. BoxCode = rules.PBoxCode,
  10125. PalletizingId = pallects.Id
  10126. };
  10127. math.Add(palletlayer);
  10128. }
  10129. _palletlayerMathrepository.InsertRange(math);
  10130. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10131. {
  10132. PreStock = "1"
  10133. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  10134. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  10135. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  10136. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  10137. var curdocid = maxdocid + 1;
  10138. if (palletMach.Any())
  10139. {
  10140. var pid = palletMach.First().PalletizingId;
  10141. 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)
  10142. {
  10143. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  10144. }
  10145. }
  10146. foreach (var code in invlist)
  10147. {
  10148. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  10149. if (cell == null)
  10150. {
  10151. continue;
  10152. }
  10153. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10154. if (invs == null)
  10155. {
  10156. continue;
  10157. }
  10158. //先判断二升位是否能出库
  10159. if (code.Depth == 2)
  10160. {
  10161. var respon = MoveTask(code.Code);
  10162. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  10163. {
  10164. continue;
  10165. }
  10166. }
  10167. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  10168. {
  10169. Code = code.ContGrpBarCode,
  10170. Equip = pallects.Equip,
  10171. Mater = code.MatCode,
  10172. Srm = code.SCRel,
  10173. PalletLayer = 1,
  10174. Grade = code.Grade,
  10175. Tunnel = code.Tunnel.ToString(),
  10176. CellCode = code.Code,
  10177. SkuCode = rules.SkuCode,
  10178. ProductMachCode = code.ProductMachCode,
  10179. Floor = code.Floor,
  10180. PalletizingId = pallects.Id,
  10181. Robot = root,
  10182. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  10183. DocId = curdocid
  10184. });
  10185. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10186. {
  10187. continue;
  10188. }
  10189. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  10190. {
  10191. Istask = 1,
  10192. Layer = 1
  10193. }, p => p.ContBarCode == code.ContGrpBarCode);
  10194. }
  10195. return res;
  10196. }
  10197. }
  10198. return res;
  10199. }
  10200. /// <summary>
  10201. /// 手动筛选码垛出库
  10202. /// </summary>
  10203. /// <param name="request"></param>
  10204. /// <returns></returns>
  10205. public SRes ManualPalletizingStockOut(ManualPalletizingStockOutRequest request)
  10206. {
  10207. var res = new SRes();
  10208. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "ManualSpecial");
  10209. if (palletlist.Any())
  10210. {
  10211. foreach (var item in palletlist)
  10212. {
  10213. //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));
  10214. //if (tasklist.Any())
  10215. //{
  10216. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  10217. // continue;
  10218. //}
  10219. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  10220. if (equips == null)
  10221. {
  10222. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut2", new RedisErrorInfo() { Equip = "SpecialOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  10223. continue;
  10224. }
  10225. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == item.Id && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(72);
  10226. if (!palletMach.Any())
  10227. {
  10228. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut3", new RedisErrorInfo() { Equip = "SpecialOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  10229. continue;
  10230. }
  10231. //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;
  10232. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  10233. var curdocid = maxdocid + 1;
  10234. if (palletMach.Any())
  10235. {
  10236. var pid = palletMach.First().PalletizingId;
  10237. 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)
  10238. {
  10239. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  10240. }
  10241. }
  10242. foreach (var pallets in palletMach)
  10243. {
  10244. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  10245. if (cell == null)
  10246. {
  10247. continue;
  10248. }
  10249. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10250. if (invs == null)
  10251. {
  10252. continue;
  10253. }
  10254. var root = DetermineRoot(pallets.Palletequip);
  10255. //先判断二升位是否能出库
  10256. if (cell.Depth == 2)
  10257. {
  10258. var respon = MoveTask(cell.Code);
  10259. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  10260. {
  10261. continue;
  10262. }
  10263. }
  10264. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  10265. {
  10266. Code = pallets.ContBarCode,
  10267. CellCode = cell.Code,
  10268. Srm = cell.SCRel,
  10269. Tunnel = cell.Tunnel.ToString(),
  10270. Floor = cell.Floor,
  10271. Grade = invs.Grade,
  10272. Mater = invs.MatCode,
  10273. SkuCode = pallets.SkuCode,
  10274. PalletLayer = 0,
  10275. ProductMachCode = invs.ProductMachCode,
  10276. Equip = item.Equip,
  10277. PalletizingId = item.Id,
  10278. Robot = root,
  10279. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2,
  10280. DocId = curdocid
  10281. });
  10282. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10283. {
  10284. continue;
  10285. }
  10286. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  10287. {
  10288. Istask = 1,
  10289. Layer = 0
  10290. }, p => p.ContBarCode == invs.ContGrpBarCode);
  10291. }
  10292. }
  10293. }
  10294. //取视图码垛设备号
  10295. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  10296. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  10297. {
  10298. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut4", new RedisErrorInfo() { Equip = "SpecialOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  10299. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10300. res.ResMsg = "没有空闲的码垛工位";
  10301. return res;
  10302. }
  10303. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  10304. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  10305. if (!devices.Where(p => p.pH_STATUS == true).Any())
  10306. {
  10307. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut5", new RedisErrorInfo() { Equip = "SpecialOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  10308. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10309. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  10310. return res;
  10311. }
  10312. var sys = _sysconfigrepository.GetList(p => p.SType == "TrayType");
  10313. devices = devices.Where(p => p.pH_STATUS == true && sys.Select(p => p.Code).Contains(p.deviceCode)).ToList();
  10314. var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  10315. //
  10316. //获取库存列表
  10317. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10318. 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")
  10319. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  10320. )
  10321. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10322. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10323. on stock.InDocsNo equals rule1.DocsNo
  10324. select new StockTemp
  10325. {
  10326. MatCode = stock.MatCode,
  10327. InvBarCode = stock.InvBarCode,
  10328. Grade = stock.Grade,
  10329. InvStateCode = stock.InvStateCode,
  10330. ProductTime = stock.ProductTime,
  10331. OneInTime = stock.OneInTime,
  10332. WbGroupCode = stock.WbGroupCode,
  10333. IsTorsChk = stock.IsTorsChk,
  10334. TorsChkQty = stock.TorsChkQty,
  10335. TorsChkValue = stock.TorsChkValue,
  10336. HoldTime = stock.HoldTime,
  10337. ProductMachCode = stock.ProductMachCode,
  10338. IsControlpanel = stock.IsControlpanel,
  10339. HWTypeCode = stock.HWTypeCode,
  10340. SolderCount = stock.SolderCount,
  10341. IsRework = stock.IsRework,
  10342. IsBlack = stock.IsBlack,
  10343. Col = loc.Col,
  10344. Layer = loc.Layer,
  10345. Shelf = loc.Shelf,
  10346. Depth = loc.Depth,
  10347. Code = loc.Code,
  10348. Tunnel = loc.Tunnel,
  10349. SCRel = loc.SCRel,
  10350. Floor = loc.Floor,
  10351. WarehouseCode = loc.WarehouseCode,
  10352. ContGrpBarCode = loc.ContGrpBarCode,
  10353. ContGrpId = loc.ContGrpId,
  10354. Id = loc.Id,
  10355. StateNum = loc.StateNum,
  10356. SkuCode = rule1.SkuCode,
  10357. Wind = stock.Wind,
  10358. InDocsNo = stock.InDocsNo,
  10359. BatchNo = stock.BatchNo
  10360. };
  10361. //查找满足时效但是没有全部检测完成的盘所在的机器组
  10362. var invlistTors = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10363. 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")
  10364. //&& (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours
  10365. )
  10366. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10367. join rule1 in _boxrulerepository.AsQueryable().Where(p => p.PackRule == "SPC").Select(p => new { p.DocsNo, p.SkuCode }).Distinct().ToList()
  10368. on stock.InDocsNo equals rule1.DocsNo
  10369. select new StockTemp
  10370. {
  10371. MatCode = stock.MatCode,
  10372. InvBarCode = stock.InvBarCode,
  10373. Grade = stock.Grade,
  10374. InvStateCode = stock.InvStateCode,
  10375. ProductTime = stock.ProductTime,
  10376. OneInTime = stock.OneInTime,
  10377. WbGroupCode = stock.WbGroupCode,
  10378. IsTorsChk = stock.IsTorsChk,
  10379. TorsChkQty = stock.TorsChkQty,
  10380. TorsChkValue = stock.TorsChkValue,
  10381. HoldTime = stock.HoldTime,
  10382. ProductMachCode = stock.ProductMachCode,
  10383. IsControlpanel = stock.IsControlpanel,
  10384. HWTypeCode = stock.HWTypeCode,
  10385. SolderCount = stock.SolderCount,
  10386. IsRework = stock.IsRework,
  10387. IsBlack = stock.IsBlack,
  10388. Col = loc.Col,
  10389. Layer = loc.Layer,
  10390. Shelf = loc.Shelf,
  10391. Depth = loc.Depth,
  10392. Code = loc.Code,
  10393. Tunnel = loc.Tunnel,
  10394. SCRel = loc.SCRel,
  10395. Floor = loc.Floor,
  10396. WarehouseCode = loc.WarehouseCode,
  10397. ContGrpBarCode = loc.ContGrpBarCode,
  10398. ContGrpId = loc.ContGrpId,
  10399. Id = loc.Id,
  10400. StateNum = loc.StateNum,
  10401. SkuCode = rule1.SkuCode,
  10402. Wind = stock.Wind,
  10403. InDocsNo = stock.InDocsNo,
  10404. BatchNo = stock.BatchNo
  10405. };
  10406. invlist = invlist.Union(invlistTors);
  10407. invlist = invlist.Where(x => x.InDocsNo != "O2507080014001ALX01R");
  10408. if (!invlist.Any())
  10409. {
  10410. RedisHelper.Set("Sx:WMSErrorInfo:NoControlOut6", new RedisErrorInfo() { Equip = "NoControlOut6", Con = "非控制盘库存不足", Time = DateTime.Now });
  10411. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10412. res.ResMsg = "库存不足";
  10413. return res;
  10414. }
  10415. if (!string.IsNullOrEmpty(request.Sku))
  10416. {
  10417. invlist = invlist.Where(p => p.SkuCode == request.Sku);
  10418. }
  10419. if (!string.IsNullOrEmpty(request.Wind))
  10420. {
  10421. invlist = invlist.Where(p => p.Wind == request.Wind);
  10422. }
  10423. //if (!string.IsNullOrEmpty(request.WbGroupCode))
  10424. //{
  10425. // invlist = invlist.Where(p => p.WbGroupCode == request.WbGroupCode);
  10426. //}
  10427. if (!string.IsNullOrEmpty(request.HwType))
  10428. {
  10429. invlist = invlist.Where(p => p.HWTypeCode.Contains(request.HwType));
  10430. }
  10431. if (!string.IsNullOrEmpty(request.IsTimeOut))
  10432. {
  10433. if (request.IsTimeOut == "0")
  10434. {
  10435. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours < timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours < timeOutHoldHours));
  10436. }
  10437. else if (request.IsTimeOut == "1")
  10438. {
  10439. invlist = invlist.Where(p => (!p.WbGroupCode.Contains("R") && (DateTime.Now - p.ProductTime).TotalHours >= timeOutHoldHours) || (p.WbGroupCode.Contains("R") && (DateTime.Now - p.OneInTime).TotalHours >= timeOutHoldHours));
  10440. }
  10441. }
  10442. //禁用巷道过滤
  10443. var tunlist = _sysconfigrepository.GetList(p => p.SType == "OutStop" && !string.IsNullOrEmpty(p.SContent));
  10444. if (tunlist.Any())
  10445. {
  10446. if (tunlist.Where(p => p.Default2 == "1").Any())
  10447. {
  10448. var inv = invlist.Where(p => p.Floor == 1 && tunlist.Where(x => x.Default2 == "1").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10449. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  10450. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤1层被禁用的出库巷道
  10451. }
  10452. if (tunlist.Where(p => p.Default2 == "2").Any())
  10453. {
  10454. var inv = invlist.Where(p => p.Floor == 2 && tunlist.Where(x => x.Default2 == "2").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10455. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  10456. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤2层被禁用的出库巷道
  10457. }
  10458. if (tunlist.Where(p => p.Default2 == "3").Any())
  10459. {
  10460. var inv = invlist.Where(p => p.Floor == 3 && tunlist.Where(x => x.Default2 == "3").Select(x => x.Default1).ToList().Contains(p.Tunnel.ToString()));
  10461. var pp = inv.Select(p => p.ContGrpBarCode).ToList();
  10462. invlist = invlist.Where(p => !pp.Contains(p.ContGrpBarCode)); //过滤3层被禁用的出库巷道
  10463. }
  10464. }
  10465. if (!invlist.Any())
  10466. {
  10467. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut6", new RedisErrorInfo() { Equip = "SpecialOut6", Con = "库存不足", Time = DateTime.Now });
  10468. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10469. res.ResMsg = "库存不足";
  10470. return res;
  10471. }
  10472. invlist = invlist.Distinct();
  10473. var temps = invlist.OrderBy(p => p.ProductTime).GroupBy(p => p.HWTypeCode);
  10474. var rules = new BillPboxrule();
  10475. foreach (var item in temps)
  10476. {
  10477. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  10478. if (!invlist.Any())
  10479. {
  10480. continue;
  10481. }
  10482. var mater = invlist.OrderBy(p => p.ProductTime).GroupBy(p => new { p.SkuCode, p.Wind, p.WbGroupCode }).ToList();
  10483. foreach (var stockTemps in mater)
  10484. {
  10485. invlist = invlist.Where(p => p.SkuCode == stockTemps.Key.SkuCode && p.Wind == stockTemps.Key.Wind && p.WbGroupCode == stockTemps.Key.WbGroupCode);
  10486. if (!invlist.Any())
  10487. {
  10488. continue;
  10489. }
  10490. var ti = DateTime.Now;
  10491. var yaar = ti.Year.ToString().Substring(2, 2);
  10492. var month = ti.Month.ToString().PadLeft(2, '0');
  10493. var day = ti.Day.ToString().PadLeft(2, '0');
  10494. //获取当天最大箱号
  10495. var maxnumre = _boxserialrepository.AsQueryable().Where(p => p.Grade == "A" && p.Year == yaar && p.Month == month && p.Day == day);
  10496. string boxserial = "HAZDA";
  10497. if (maxnumre.Any())
  10498. {
  10499. boxserial = boxserial + yaar + month + day + (maxnumre.Max(q => q.Num) + 1).ToString().PadLeft(3, '0');
  10500. _boxserialrepository.Insert(new BillBoxSerial()
  10501. {
  10502. Year = yaar,
  10503. Month = month,
  10504. Day = day,
  10505. Num = maxnumre.Max(q => q.Num) + 1,
  10506. BoxNum = boxserial,
  10507. Grade = "A",
  10508. AddTime = DateTime.Now,
  10509. AddWho = "wms",
  10510. EditTime = DateTime.Now,
  10511. EditWho = "wms"
  10512. });
  10513. }
  10514. else
  10515. {
  10516. boxserial = boxserial + yaar + month + day + "1".ToString().PadLeft(3, '0');
  10517. _boxserialrepository.Insert(new BillBoxSerial()
  10518. {
  10519. Year = yaar,
  10520. Month = month,
  10521. Day = day,
  10522. Num = 1,
  10523. BoxNum = boxserial,
  10524. Grade = "A",
  10525. AddTime = DateTime.Now,
  10526. AddWho = "wms",
  10527. EditTime = DateTime.Now,
  10528. EditWho = "wms"
  10529. });
  10530. }
  10531. if (invlist.Any(p => p.Wind == "L"))
  10532. {
  10533. invlist = invlist.Where(p => p.Wind == "L");
  10534. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10535. rule.Id = GetId();
  10536. //rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  10537. rule.PBoxCode = boxserial;
  10538. rule.Wind = "L";
  10539. rule.ZXStateCode = 1;
  10540. rule.SpoolType = item.Key;
  10541. rule.PackRule = "ManualSpecial";
  10542. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10543. rule.SkuCode = "Test123";
  10544. rule.BatchNo = "1";
  10545. rules = _boxrulerepository.InsertReturnEntity(rule);
  10546. }
  10547. else
  10548. {
  10549. invlist = invlist.Where(p => p.Wind == "R");
  10550. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10551. rule.Id = GetId();
  10552. rule.PBoxCode = boxserial;
  10553. rule.Wind = "R";
  10554. rule.ZXStateCode = 1;
  10555. rule.SpoolType = item.Key;
  10556. rule.PackRule = "ManualSpecial";
  10557. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10558. rule.SkuCode = "Test123";
  10559. rule.BatchNo = "1";
  10560. rules = _boxrulerepository.InsertReturnEntity(rule);
  10561. }
  10562. if (item.Key == "BS60" || item.Key == "BS40")
  10563. {
  10564. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  10565. }
  10566. else
  10567. {
  10568. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  10569. }
  10570. 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();
  10571. //码垛信息校验
  10572. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  10573. {
  10574. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10575. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  10576. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  10577. return res;
  10578. }
  10579. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode, ActType = 1 };
  10580. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  10581. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  10582. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10583. {
  10584. res.ResCode = trayres.ResCode;
  10585. res.ResMsg = trayres.ResMsg;
  10586. RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut7", new RedisErrorInfo() { Equip = "SpecialOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  10587. return res;
  10588. }
  10589. var root = DetermineRoot(palletequip.Code);
  10590. var pallet = new Palletizing()
  10591. {
  10592. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  10593. PalletizState = 0,
  10594. Equip = palletequip.Code,
  10595. Finish = 0,
  10596. AddWho = "",
  10597. EditWho = "",
  10598. BoxRule = rules.PackRule,
  10599. BoxRuleId = rules.Id,
  10600. IsControlpanel = false,
  10601. TaskNum = int.Parse(trayres.Memo1),
  10602. GoodsType = item.Key == "BS80/33" ? 1 : 2,
  10603. Robot = root
  10604. };
  10605. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  10606. List<PalletLayerMath> math = new List<PalletLayerMath>();
  10607. foreach (var invs in invlist)
  10608. {
  10609. var palletlayer = new PalletLayerMath()
  10610. {
  10611. ContGrpId = (long)invs.ContGrpId,
  10612. ContBarCode = invs.ContGrpBarCode,
  10613. Layer = 0,
  10614. SkuCode = rules.SkuCode,
  10615. Finish = 0,
  10616. PboxruleId = rules.Id,
  10617. Istask = 0,
  10618. Palletequip = palletequip.Code,
  10619. Depth = invs.Depth,
  10620. IsBlack = invs.IsBlack,
  10621. SolderCount = invs.SolderCount,
  10622. BoxCode = rules.PBoxCode,
  10623. PalletizingId = pallects.Id
  10624. };
  10625. math.Add(palletlayer);
  10626. }
  10627. _palletlayerMathrepository.InsertRange(math);
  10628. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  10629. {
  10630. PreStock = "1"
  10631. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  10632. invlist = invlist.OrderBy(p => p.Depth).Take(72);
  10633. var palletMach = _palletlayerMathrepository.GetList(p => p.PalletizingId == pallects.Id).Take(72);
  10634. var maxdocid = _taskrepository.AsQueryable().Where(p => p.BusType == "装箱码垛").Max(p => p.DocID);
  10635. var curdocid = maxdocid + 1;
  10636. if (palletMach.Any())
  10637. {
  10638. var pid = palletMach.First().PalletizingId;
  10639. 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)
  10640. {
  10641. curdocid = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.PalletizingId == pid).Max(p => p.DocID);
  10642. }
  10643. }
  10644. foreach (var code in invlist)
  10645. {
  10646. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  10647. if (cell == null)
  10648. {
  10649. continue;
  10650. }
  10651. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10652. if (invs == null)
  10653. {
  10654. continue;
  10655. }
  10656. //先判断二升位是否能出库
  10657. if (code.Depth == 2)
  10658. {
  10659. var respon = MoveTask(code.Code);
  10660. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  10661. {
  10662. continue;
  10663. }
  10664. }
  10665. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  10666. {
  10667. Code = code.ContGrpBarCode,
  10668. Equip = pallects.Equip,
  10669. Mater = code.MatCode,
  10670. Srm = code.SCRel,
  10671. PalletLayer = 1,
  10672. Grade = code.Grade,
  10673. Tunnel = code.Tunnel.ToString(),
  10674. CellCode = code.Code,
  10675. SkuCode = rules.SkuCode,
  10676. ProductMachCode = code.ProductMachCode,
  10677. Floor = code.Floor,
  10678. PalletizingId = pallects.Id,
  10679. Robot = root,
  10680. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  10681. DocId = curdocid
  10682. });
  10683. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10684. {
  10685. continue;
  10686. }
  10687. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  10688. {
  10689. Istask = 1,
  10690. Layer = 1
  10691. }, p => p.ContBarCode == code.ContGrpBarCode);
  10692. }
  10693. return res;
  10694. }
  10695. }
  10696. return res;
  10697. }
  10698. public SRes CGrageStockOut(PalletizingPackStockOutRequest request)
  10699. {
  10700. var res = new SRes();
  10701. return res;//改造后方法没有修改,暂时注释
  10702. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "CGreade");
  10703. if (palletlist.Any())
  10704. {
  10705. foreach (var item in palletlist)
  10706. {
  10707. //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));
  10708. //if (tasklist.Any())
  10709. //{
  10710. // RedisHelper.Set("Sx:WMSErrorInfo:SpecialOut1", new RedisErrorInfo() { Equip = "SpecialOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  10711. // continue;
  10712. //}
  10713. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  10714. if (equips == null)
  10715. {
  10716. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut2", new RedisErrorInfo() { Equip = "CgradeOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  10717. continue;
  10718. }
  10719. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  10720. if (!palletMach.Any())
  10721. {
  10722. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut3", new RedisErrorInfo() { Equip = "CgradeOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  10723. continue;
  10724. }
  10725. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  10726. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  10727. if (tasklayer != 12 && tasklayer < 12)
  10728. {
  10729. palletMach = palletMach.Take(12 - tasklayer);
  10730. foreach (var pallets in palletMach)
  10731. {
  10732. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  10733. if (cell == null)
  10734. {
  10735. continue;
  10736. }
  10737. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10738. if (invs == null)
  10739. {
  10740. continue;
  10741. }
  10742. var root = DetermineRoot(pallets.Palletequip);
  10743. //先判断二升位是否能出库
  10744. if (cell.Depth == 2)
  10745. {
  10746. var respon = MoveTask(cell.Code);
  10747. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  10748. {
  10749. continue;
  10750. }
  10751. }
  10752. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  10753. {
  10754. Code = pallets.ContBarCode,
  10755. CellCode = cell.Code,
  10756. Srm = cell.SCRel,
  10757. Tunnel = cell.Tunnel.ToString(),
  10758. Floor = cell.Floor,
  10759. Grade = invs.Grade,
  10760. Mater = invs.MatCode,
  10761. SkuCode = pallets.SkuCode,
  10762. PalletLayer = curlayer,
  10763. ProductMachCode = invs.ProductMachCode,
  10764. Equip = item.Equip,
  10765. PalletizingId = item.Id,
  10766. Robot = root,
  10767. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  10768. });
  10769. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10770. {
  10771. continue;
  10772. }
  10773. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  10774. {
  10775. Istask = 1,
  10776. Layer = curlayer
  10777. }, p => p.ContBarCode == invs.ContGrpBarCode);
  10778. }
  10779. return res;
  10780. }
  10781. else
  10782. {
  10783. foreach (var pallets in palletMach)
  10784. {
  10785. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  10786. if (cell == null)
  10787. {
  10788. continue;
  10789. }
  10790. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  10791. if (invs == null)
  10792. {
  10793. continue;
  10794. }
  10795. var root = DetermineRoot(pallets.Palletequip);
  10796. //先判断二升位是否能出库
  10797. if (cell.Depth == 2)
  10798. {
  10799. var respon = MoveTask(cell.Code);
  10800. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  10801. {
  10802. continue;
  10803. }
  10804. }
  10805. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  10806. {
  10807. Code = pallets.ContBarCode,
  10808. CellCode = cell.Code,
  10809. Srm = cell.SCRel,
  10810. Tunnel = cell.Tunnel.ToString(),
  10811. Floor = cell.Floor,
  10812. Grade = invs.Grade,
  10813. Mater = invs.MatCode,
  10814. SkuCode = pallets.SkuCode,
  10815. PalletLayer = curlayer + 1,
  10816. ProductMachCode = invs.ProductMachCode,
  10817. Equip = item.Equip,
  10818. PalletizingId = item.Id,
  10819. Robot = root,
  10820. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  10821. });
  10822. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10823. {
  10824. continue;
  10825. }
  10826. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  10827. {
  10828. Istask = 1,
  10829. Layer = curlayer + 1
  10830. }, p => p.ContBarCode == invs.ContGrpBarCode);
  10831. }
  10832. return res;
  10833. }
  10834. }
  10835. }
  10836. //取视图码垛设备号
  10837. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  10838. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  10839. {
  10840. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut4", new RedisErrorInfo() { Equip = "CgradeOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  10841. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10842. res.ResMsg = "没有空闲的码垛工位";
  10843. return res;
  10844. }
  10845. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  10846. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  10847. if (!devices.Where(p => p.pH_STATUS == true).Any())
  10848. {
  10849. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut5", new RedisErrorInfo() { Equip = "CgradeOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  10850. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10851. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  10852. return res;
  10853. }
  10854. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  10855. //var timeOutHoldHours = int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  10856. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  10857. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "C" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0
  10858. && !p.InDocsNo.StartsWith("CHA"))
  10859. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  10860. select new StockTemp
  10861. {
  10862. MatCode = stock.MatCode,
  10863. InvBarCode = stock.InvBarCode,
  10864. Grade = stock.Grade,
  10865. InvStateCode = stock.InvStateCode,
  10866. ProductTime = stock.ProductTime,
  10867. WbGroupCode = stock.WbGroupCode,
  10868. IsTorsChk = stock.IsTorsChk,
  10869. TorsChkQty = stock.TorsChkQty,
  10870. TorsChkValue = stock.TorsChkValue,
  10871. HoldTime = stock.HoldTime,
  10872. ProductMachCode = stock.ProductMachCode,
  10873. IsControlpanel = stock.IsControlpanel,
  10874. HWTypeCode = stock.HWTypeCode,
  10875. SolderCount = stock.SolderCount,
  10876. IsRework = stock.IsRework,
  10877. IsBlack = stock.IsBlack,
  10878. Col = loc.Col,
  10879. Layer = loc.Layer,
  10880. Shelf = loc.Shelf,
  10881. Depth = loc.Depth,
  10882. Code = loc.Code,
  10883. Tunnel = loc.Tunnel,
  10884. SCRel = loc.SCRel,
  10885. Floor = loc.Floor,
  10886. WarehouseCode = loc.WarehouseCode,
  10887. ContGrpBarCode = loc.ContGrpBarCode,
  10888. ContGrpId = loc.ContGrpId,
  10889. Id = loc.Id,
  10890. StateNum = loc.StateNum,
  10891. Wind = stock.Wind,
  10892. InDocsNo = stock.InDocsNo
  10893. };
  10894. if (!invlist.Any())
  10895. {
  10896. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut6", new RedisErrorInfo() { Equip = "CgradeOut6", Con = "库存不足", Time = DateTime.Now });
  10897. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  10898. res.ResMsg = "库存不足";
  10899. return res;
  10900. }
  10901. invlist = invlist.Distinct();
  10902. var temps = invlist.GroupBy(p => p.HWTypeCode);
  10903. var rules = new BillPboxrule();
  10904. foreach (var item in temps)
  10905. {
  10906. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  10907. if (!invlist.Any())
  10908. {
  10909. continue;
  10910. }
  10911. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  10912. foreach (var stockTemps in mater)
  10913. {
  10914. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  10915. if (!invlist.Any())
  10916. {
  10917. continue;
  10918. }
  10919. if (invlist.Any(p => p.Wind == "L"))
  10920. {
  10921. invlist = invlist.Where(p => p.Wind == "L");
  10922. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10923. rule.Id = GetId();
  10924. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  10925. rule.Wind = "L";
  10926. rule.ZXStateCode = 1;
  10927. rule.SpoolType = item.Key;
  10928. rule.PackRule = "CGreade";
  10929. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10930. rule.SkuCode = "TestC12";
  10931. rule.BatchNo = "22";
  10932. rules = _boxrulerepository.InsertReturnEntity(rule);
  10933. }
  10934. else
  10935. {
  10936. invlist = invlist.Where(p => p.Wind == "R");
  10937. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  10938. rule.Id = GetId();
  10939. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  10940. rule.Wind = "R";
  10941. rule.ZXStateCode = 1;
  10942. rule.SpoolType = item.Key;
  10943. rule.PackRule = "CGreade";
  10944. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  10945. rule.SkuCode = "TestC12";
  10946. rule.BatchNo = "22";
  10947. rules = _boxrulerepository.InsertReturnEntity(rule);
  10948. }
  10949. if (item.Key == "BS60" || item.Key == "BS40")
  10950. {
  10951. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  10952. }
  10953. else
  10954. {
  10955. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  10956. }
  10957. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  10958. //码垛信息校验
  10959. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  10960. {
  10961. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  10962. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  10963. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  10964. return res;
  10965. }
  10966. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  10967. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  10968. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  10969. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  10970. {
  10971. res.ResCode = trayres.ResCode;
  10972. res.ResMsg = trayres.ResMsg;
  10973. RedisHelper.Set("Sx:WMSErrorInfo:CgradeOut7", new RedisErrorInfo() { Equip = "CgradeOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  10974. return res;
  10975. }
  10976. var pallet = new Palletizing()
  10977. {
  10978. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  10979. PalletizState = 0,
  10980. Equip = palletequip.Code,
  10981. Finish = 0,
  10982. AddWho = "",
  10983. EditWho = "",
  10984. BoxRule = rules.PackRule,
  10985. BoxRuleId = rules.Id,
  10986. IsControlpanel = false,
  10987. TaskNum = int.Parse(trayres.Memo1),
  10988. GoodsType = item.Key == "BS80/33" ? 1 : 2
  10989. };
  10990. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  10991. List<PalletLayerMath> math = new List<PalletLayerMath>();
  10992. foreach (var invs in invlist)
  10993. {
  10994. var palletlayer = new PalletLayerMath()
  10995. {
  10996. ContGrpId = (long)invs.ContGrpId,
  10997. ContBarCode = invs.ContGrpBarCode,
  10998. Layer = 0,
  10999. SkuCode = rules.SkuCode,
  11000. Finish = 0,
  11001. PboxruleId = rules.Id,
  11002. Istask = 0,
  11003. Palletequip = palletequip.Code,
  11004. Depth = invs.Depth,
  11005. IsBlack = invs.IsBlack,
  11006. SolderCount = invs.SolderCount,
  11007. BoxCode = rules.PBoxCode
  11008. };
  11009. math.Add(palletlayer);
  11010. }
  11011. _palletlayerMathrepository.InsertRange(math);
  11012. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11013. {
  11014. PreStock = "1"
  11015. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  11016. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  11017. foreach (var code in invlist)
  11018. {
  11019. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  11020. if (cell == null)
  11021. {
  11022. continue;
  11023. }
  11024. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11025. if (invs == null)
  11026. {
  11027. continue;
  11028. }
  11029. var root = DetermineRoot(palletequip.Code);
  11030. //先判断二升位是否能出库
  11031. if (code.Depth == 2)
  11032. {
  11033. var respon = MoveTask(code.Code);
  11034. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  11035. {
  11036. continue;
  11037. }
  11038. }
  11039. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  11040. {
  11041. Code = code.ContGrpBarCode,
  11042. Equip = pallects.Equip,
  11043. Mater = code.MatCode,
  11044. Srm = code.SCRel,
  11045. PalletLayer = 1,
  11046. Grade = code.Grade,
  11047. Tunnel = code.Tunnel.ToString(),
  11048. CellCode = code.Code,
  11049. SkuCode = rules.SkuCode,
  11050. ProductMachCode = code.ProductMachCode,
  11051. Floor = code.Floor,
  11052. PalletizingId = pallects.Id,
  11053. Robot = root,
  11054. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  11055. });
  11056. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11057. {
  11058. continue;
  11059. }
  11060. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  11061. {
  11062. Istask = 1,
  11063. Layer = 1
  11064. }, p => p.ContBarCode == code.ContGrpBarCode);
  11065. }
  11066. return res;
  11067. }
  11068. }
  11069. return res;
  11070. }
  11071. public SRes OnePackStock(PalletizingPackStockOutRequest request)
  11072. {
  11073. var res = new SRes();
  11074. return res;//改造后方法没有修改,暂时注释
  11075. var palletlist = _palletizrepository.GetList(p => p.PalletizState == 0 && p.BoxRule == "OnePack");
  11076. if (palletlist.Any())
  11077. {
  11078. foreach (var item in palletlist)
  11079. {
  11080. 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));
  11081. if (tasklist.Any())
  11082. {
  11083. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut1", new RedisErrorInfo() { Equip = "OnePackOut1", Con = "当前码垛工位:" + item.Equip + "存在未码垛的任务,不允许下发新的任务", Time = DateTime.Now });
  11084. continue;
  11085. }
  11086. var equips = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack where code =" + item.Equip).First();
  11087. if (equips == null)
  11088. {
  11089. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut2", new RedisErrorInfo() { Equip = "OnePackOut2", Con = "不存在该" + item.Equip + "的码垛工位", Time = DateTime.Now });
  11090. continue;
  11091. }
  11092. var palletMach = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 0).OrderBy(p => p.IsBlack).ThenBy(p => p.Depth).Take(12);
  11093. if (!palletMach.Any())
  11094. {
  11095. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut3", new RedisErrorInfo() { Equip = "OnePackOut3", Con = item.Equip + "没有新的码垛任务需要下发", Time = DateTime.Now });
  11096. continue;
  11097. }
  11098. var curlayer = _palletlayerMathrepository.GetList(p => p.Palletequip == item.Equip && p.Istask == 1).Max(p => p.Layer);
  11099. var tasklayer = _wcstaskoldrepository.AsQueryable().Where(p => p.AgvTaskID == curlayer && p.AddrTo == item.Equip && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).Count();
  11100. if (tasklayer != 12 && tasklayer < 12)
  11101. {
  11102. palletMach = palletMach.Take(12 - tasklayer);
  11103. foreach (var pallets in palletMach)
  11104. {
  11105. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  11106. if (cell == null)
  11107. {
  11108. continue;
  11109. }
  11110. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11111. if (invs == null)
  11112. {
  11113. continue;
  11114. }
  11115. var root = DetermineRoot(pallets.Palletequip);
  11116. //先判断二升位是否能出库
  11117. if (cell.Depth == 2)
  11118. {
  11119. var respon = MoveTask(cell.Code);
  11120. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  11121. {
  11122. continue;
  11123. }
  11124. }
  11125. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  11126. {
  11127. Code = pallets.ContBarCode,
  11128. CellCode = cell.Code,
  11129. Srm = cell.SCRel,
  11130. Tunnel = cell.Tunnel.ToString(),
  11131. Floor = cell.Floor,
  11132. Grade = invs.Grade,
  11133. Mater = invs.MatCode,
  11134. SkuCode = pallets.SkuCode,
  11135. PalletLayer = curlayer,
  11136. ProductMachCode = invs.ProductMachCode,
  11137. Equip = item.Equip,
  11138. PalletizingId = item.Id,
  11139. Robot = root,
  11140. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  11141. });
  11142. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11143. {
  11144. continue;
  11145. }
  11146. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  11147. {
  11148. Istask = 1,
  11149. Layer = curlayer
  11150. }, p => p.ContBarCode == invs.ContGrpBarCode);
  11151. }
  11152. return res;
  11153. }
  11154. else
  11155. {
  11156. foreach (var pallets in palletMach)
  11157. {
  11158. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == pallets.ContGrpId);
  11159. if (cell == null)
  11160. {
  11161. continue;
  11162. }
  11163. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == pallets.ContBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11164. if (invs == null)
  11165. {
  11166. continue;
  11167. }
  11168. var root = DetermineRoot(pallets.Palletequip);
  11169. //先判断二升位是否能出库
  11170. if (cell.Depth == 2)
  11171. {
  11172. var respon = MoveTask(cell.Code);
  11173. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  11174. {
  11175. continue;
  11176. }
  11177. }
  11178. var taskresponse = PalletizingPackTask(new PalletizingPackTaskRequest()
  11179. {
  11180. Code = pallets.ContBarCode,
  11181. CellCode = cell.Code,
  11182. Srm = cell.SCRel,
  11183. Tunnel = cell.Tunnel.ToString(),
  11184. Floor = cell.Floor,
  11185. Grade = invs.Grade,
  11186. Mater = invs.MatCode,
  11187. SkuCode = pallets.SkuCode,
  11188. PalletLayer = curlayer + 1,
  11189. ProductMachCode = invs.ProductMachCode,
  11190. Equip = item.Equip,
  11191. PalletizingId = item.Id,
  11192. Robot = root,
  11193. GoodsType = invs.HWTypeCode == "BS80/33" ? 1 : 2
  11194. });
  11195. if (taskresponse.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11196. {
  11197. continue;
  11198. }
  11199. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  11200. {
  11201. Istask = 1,
  11202. Layer = curlayer + 1
  11203. }, p => p.ContBarCode == invs.ContGrpBarCode);
  11204. }
  11205. return res;
  11206. }
  11207. }
  11208. }
  11209. //取视图码垛设备号
  11210. var equiplist = _sysconfigrepository.Context.Ado.SqlQuery<sxSysConfig>("select * from WMS_ZT_01SX.dbo.V_PalletizingPack");
  11211. if (!equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).Any())
  11212. {
  11213. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut4", new RedisErrorInfo() { Equip = "OnePackOut4", Con = "没有空闲的码垛工位", Time = DateTime.Now });
  11214. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11215. res.ResMsg = "没有空闲的码垛工位";
  11216. return res;
  11217. }
  11218. var traylist = HttpUtil.PostRequest("http://10.30.43.1:8080/api/Wcs/GetDeviceChaiPan", JsonConvert.SerializeObject(""));
  11219. var devices = JsonConvert.DeserializeObject<List<DevincePh>>(traylist);
  11220. if (!devices.Where(p => p.pH_STATUS == true).Any())
  11221. {
  11222. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut5", new RedisErrorInfo() { Equip = "OnePackOut5", Con = "没有可用的子托盘,请先补充子托盘", Time = DateTime.Now });
  11223. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11224. res.ResMsg = "没有可用的子托盘,请先补充子托盘";
  11225. return res;
  11226. }
  11227. devices = devices.Where(p => p.pH_STATUS == true).ToList();
  11228. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  11229. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "A" && string.IsNullOrEmpty(p.PreStock) && p.ContUsageQty <= 0)
  11230. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  11231. select new StockTemp
  11232. {
  11233. MatCode = stock.MatCode,
  11234. InvBarCode = stock.InvBarCode,
  11235. Grade = stock.Grade,
  11236. InvStateCode = stock.InvStateCode,
  11237. ProductTime = stock.ProductTime,
  11238. WbGroupCode = stock.WbGroupCode,
  11239. IsTorsChk = stock.IsTorsChk,
  11240. TorsChkQty = stock.TorsChkQty,
  11241. TorsChkValue = stock.TorsChkValue,
  11242. HoldTime = stock.HoldTime,
  11243. ProductMachCode = stock.ProductMachCode,
  11244. IsControlpanel = stock.IsControlpanel,
  11245. HWTypeCode = stock.HWTypeCode,
  11246. SolderCount = stock.SolderCount,
  11247. IsRework = stock.IsRework,
  11248. IsBlack = stock.IsBlack,
  11249. Col = loc.Col,
  11250. Layer = loc.Layer,
  11251. Shelf = loc.Shelf,
  11252. Depth = loc.Depth,
  11253. Code = loc.Code,
  11254. Tunnel = loc.Tunnel,
  11255. SCRel = loc.SCRel,
  11256. Floor = loc.Floor,
  11257. WarehouseCode = loc.WarehouseCode,
  11258. ContGrpBarCode = loc.ContGrpBarCode,
  11259. ContGrpId = loc.ContGrpId,
  11260. Id = loc.Id,
  11261. StateNum = loc.StateNum,
  11262. Wind = stock.Wind,
  11263. InDocsNo = stock.InDocsNo
  11264. };
  11265. if (!invlist.Any())
  11266. {
  11267. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut6", new RedisErrorInfo() { Equip = "OnePackOut6", Con = "库存不足", Time = DateTime.Now });
  11268. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11269. res.ResMsg = "库存不足";
  11270. return res;
  11271. }
  11272. invlist = invlist.Distinct();
  11273. var temps = invlist.GroupBy(p => p.HWTypeCode);
  11274. var rules = new BillPboxrule();
  11275. foreach (var item in temps)
  11276. {
  11277. invlist = invlist.Where(p => p.HWTypeCode == item.Key);
  11278. if (!invlist.Any())
  11279. {
  11280. continue;
  11281. }
  11282. var mater = invlist.GroupBy(p => p.MatCode).ToList();
  11283. foreach (var stockTemps in mater)
  11284. {
  11285. invlist = invlist.Where(p => p.MatCode == stockTemps.Key);
  11286. if (!invlist.Any())
  11287. {
  11288. continue;
  11289. }
  11290. if (invlist.Any(p => p.Wind == "L"))
  11291. {
  11292. invlist = invlist.Where(p => p.Wind == "L");
  11293. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  11294. rule.Id = GetId();
  11295. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  11296. rule.Wind = "L";
  11297. rule.ZXStateCode = 1;
  11298. rule.SpoolType = item.Key;
  11299. rule.PackRule = "OnePack";
  11300. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  11301. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  11302. rule.BatchNo = "1";
  11303. rules = _boxrulerepository.InsertReturnEntity(rule);
  11304. }
  11305. else
  11306. {
  11307. invlist = invlist.Where(p => p.Wind == "R");
  11308. var rule = _boxrulerepository.GetFirst(p => p.ZXStateCode == 2);
  11309. rule.Id = GetId();
  11310. rule.PBoxCode = DateTime.UtcNow.ToString("yyyyMMddHHmmfff");
  11311. rule.Wind = "R";
  11312. rule.ZXStateCode = 1;
  11313. rule.SpoolType = item.Key;
  11314. rule.PackRule = "OnePack";
  11315. rule.FullCountQty = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36;
  11316. rule.SkuCode = "Test" + DateTime.UtcNow.ToString("yyyyMMddHHmmff");
  11317. rule.BatchNo = "1";
  11318. rules = _boxrulerepository.InsertReturnEntity(rule);
  11319. }
  11320. if (item.Key == "BS60" || item.Key == "BS40")
  11321. {
  11322. invlist = invlist.OrderBy(p => p.ProductTime).Take(72);
  11323. }
  11324. else
  11325. {
  11326. invlist = invlist.OrderBy(p => p.ProductTime).Take(36);
  11327. }
  11328. var palletequip = equiplist.Where(p => string.IsNullOrEmpty(p.Default1) && string.IsNullOrEmpty(p.Cache1State) && string.IsNullOrEmpty(p.Memo)).OrderBy(p => p.EditTime).First();
  11329. //码垛信息校验
  11330. if (_palletizrepository.IsAny(p => p.Equip == palletequip.Code && p.PalletizState == 0))
  11331. {
  11332. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  11333. res.ResMsg = palletequip.Code + "已经存在未装箱中数据";
  11334. _logger.LogInformation(palletequip.Code + "已经存在未装箱中数据");
  11335. return res;
  11336. }
  11337. var Trayportage = new dto.request.sx.TrayPortageRequest { Code = "", WareHouse = "cphouse", Equip = palletequip.Code, Start = devices.FirstOrDefault().deviceCode };
  11338. var response = HttpUtil.PostRequest("http://10.30.44.4:8070/api/Cp/TrayPortageTask", JsonConvert.SerializeObject(Trayportage));
  11339. var trayres = JsonConvert.DeserializeObject<SRes>(response);
  11340. if (trayres.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11341. {
  11342. res.ResCode = trayres.ResCode;
  11343. res.ResMsg = trayres.ResMsg;
  11344. RedisHelper.Set("Sx:WMSErrorInfo:OnePackOut7", new RedisErrorInfo() { Equip = "OnePackOut7", Con = "托盘输送任务报错:" + trayres.ResMsg, Time = DateTime.Now });
  11345. return res;
  11346. }
  11347. var pallet = new Palletizing()
  11348. {
  11349. PalletMax = (item.Key == "BS60" || item.Key == "BS40") ? 72 : 36,
  11350. PalletizState = 0,
  11351. Equip = palletequip.Code,
  11352. Finish = 0,
  11353. AddWho = "",
  11354. EditWho = "",
  11355. BoxRule = rules.PackRule,
  11356. BoxRuleId = rules.Id,
  11357. IsControlpanel = false,
  11358. TaskNum = int.Parse(trayres.Memo1),
  11359. GoodsType = item.Key == "BS80/33" ? 1 : 2
  11360. };
  11361. var pallects = _palletizrepository.InsertReturnEntity(pallet);
  11362. List<PalletLayerMath> math = new List<PalletLayerMath>();
  11363. foreach (var invs in invlist)
  11364. {
  11365. var palletlayer = new PalletLayerMath()
  11366. {
  11367. ContGrpId = (long)invs.ContGrpId,
  11368. ContBarCode = invs.ContGrpBarCode,
  11369. Layer = 0,
  11370. SkuCode = rules.SkuCode,
  11371. Finish = 0,
  11372. PboxruleId = rules.Id,
  11373. Istask = 0,
  11374. Palletequip = palletequip.Code,
  11375. Depth = invs.Depth,
  11376. IsBlack = invs.IsBlack,
  11377. SolderCount = invs.SolderCount,
  11378. BoxCode = rules.PBoxCode
  11379. };
  11380. math.Add(palletlayer);
  11381. }
  11382. _palletlayerMathrepository.InsertRange(math);
  11383. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11384. {
  11385. PreStock = "1"
  11386. }, p => math.Select(p => p.ContBarCode).ToList().Contains(p.ContGrpBarCode));
  11387. invlist = invlist.OrderBy(p => p.Depth).Take(12);
  11388. foreach (var code in invlist)
  11389. {
  11390. var cell = _basewarecellrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.StateNum == LocationState.LocationState_Full && p.ContGrpId == code.ContGrpId);
  11391. if (cell == null)
  11392. {
  11393. continue;
  11394. }
  11395. var invs = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11396. if (invs == null)
  11397. {
  11398. continue;
  11399. }
  11400. var root = DetermineRoot(palletequip.Code);
  11401. //先判断二升位是否能出库
  11402. if (code.Depth == 2)
  11403. {
  11404. var respon = MoveTask(code.Code);
  11405. if (!string.IsNullOrEmpty(respon.Memo1) && respon.Memo1 == "1")
  11406. {
  11407. continue;
  11408. }
  11409. }
  11410. var taskrepso = PalletizingPackTask(new PalletizingPackTaskRequest()
  11411. {
  11412. Code = code.ContGrpBarCode,
  11413. Equip = pallects.Equip,
  11414. Mater = code.MatCode,
  11415. Srm = code.SCRel,
  11416. PalletLayer = 1,
  11417. Grade = code.Grade,
  11418. Tunnel = code.Tunnel.ToString(),
  11419. CellCode = code.Code,
  11420. SkuCode = rules.SkuCode,
  11421. ProductMachCode = code.ProductMachCode,
  11422. Floor = code.Floor,
  11423. PalletizingId = pallects.Id,
  11424. Robot = root,
  11425. GoodsType = code.HWTypeCode == "BS80/33" ? 1 : 2,
  11426. });
  11427. if (taskrepso.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  11428. {
  11429. continue;
  11430. }
  11431. _palletlayerMathrepository.UpdateSetColumnsTrue(p => new PalletLayerMath()
  11432. {
  11433. Istask = 1,
  11434. Layer = 1
  11435. }, p => p.ContBarCode == code.ContGrpBarCode);
  11436. }
  11437. return res;
  11438. }
  11439. }
  11440. return res;
  11441. }
  11442. public SRes<bool> IsExistTask(DetailCodeRequest request)
  11443. {
  11444. var result = new SRes<bool>();
  11445. result.ResData = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == request.Code && p.Status < TaskStatus.Finish).Any();
  11446. return result;
  11447. }
  11448. public SRes<string> GetLocationInfo(DetailCodeRequest request)
  11449. {
  11450. var result = new SRes<string>();
  11451. var cell = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.ContGrpBarCode == request.Code && p.StateNum == LocationState.LocationState_Full).ToList();
  11452. result.ResData = cell.Any() ? cell.First().Code : "";
  11453. return result;
  11454. }
  11455. public SRes CancelPreStockinfo(CancelPreStockinfoRequest request)
  11456. {
  11457. var res = new SRes();
  11458. if (!request.Ids.Any())
  11459. {
  11460. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  11461. res.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  11462. return res;
  11463. }
  11464. foreach (var item in request.Ids)
  11465. {
  11466. var match = _palletlayerMathrepository.GetSingle(p => p.Id == item && p.Istask == 0);
  11467. if (match == null)
  11468. {
  11469. continue;
  11470. }
  11471. var inv = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == match.ContBarCode && p.ContGrpId == match.ContGrpId && p.PreStock == "1" && p.InvStateCode == InvState.InvEcecState_In.ToString());
  11472. if (inv == null)
  11473. {
  11474. continue;
  11475. }
  11476. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.BarCode == inv.ContGrpBarCode).First();
  11477. if (task != null)
  11478. {
  11479. continue;
  11480. }
  11481. var sucess = _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow()
  11482. {
  11483. PreStock = string.Empty,
  11484. Memo = "取消预锁库存"
  11485. }, p => p.Id == inv.Id);
  11486. if (sucess)
  11487. {
  11488. _palletlayerMathrepository.Delete(p => p.Id == match.Id);
  11489. }
  11490. }
  11491. return res;
  11492. }
  11493. /// <summary>
  11494. /// 获取扭转检测范围
  11495. /// </summary>
  11496. /// <param name="request"></param>
  11497. /// <returns></returns>
  11498. public SRes<GetTorsRangeRes> GetTorsRange(DetailCodeRequest request)
  11499. {
  11500. var result = new SRes<GetTorsRangeRes>() { ResData = new GetTorsRangeRes() };
  11501. var rules = _boxrulerepository.GetList(p => p.PBoxCode == request.Code);
  11502. if (rules != null && rules.Any())
  11503. {
  11504. var rule = rules.First();
  11505. result.ResData.TorsValue = rule.Torsion48Qty > 0 ? rule.Torsion48Qty : rule.Torsion72Qty > 0 ? rule.Torsion72Qty : rule.Torsion24Qty;
  11506. result.ResData.TorsRangeValue = rule.TorsionErrRange;
  11507. }
  11508. return result;
  11509. }
  11510. public SRes<string> GetCGradeList()
  11511. {
  11512. var res = new SRes<string>() { ResDataList = new List<string>() };
  11513. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  11514. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && (p.Grade == "C" || p.Grade == "D") && string.IsNullOrEmpty(p.PreStock)
  11515. && !p.InDocsNo.StartsWith("CHA"))
  11516. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  11517. select loc.Code;
  11518. if (!invlist.Any())
  11519. {
  11520. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11521. res.ResMsg = "没有C级品库存不足";
  11522. return res;
  11523. }
  11524. res.ResDataList = invlist.Distinct().ToList();
  11525. return res;
  11526. }
  11527. public SRes<string> GetBGradeTimeOutList()
  11528. {
  11529. var timeOutHoldHours = int.Parse(_sysconfigrepository.GetModelByExpression(p => p.Code == "BGradeTimeOut").SContent); // int.Parse(wms.util.AppSettings.GetConfig("TimeOutHoldHours"));
  11530. var res = new SRes<string>() { ResDataList = new List<string>() };
  11531. var invlist = from loc in _basewarecellrepository.GetList(p => p.IsStop == LocationStop.LocationInvoke.GetHashCode() && p.StateNum == LocationState.LocationState_Full)
  11532. join stock in _billInvnowrepository.GetList(p => p.InvStateCode == InvState.InvEcecState_In.ToString() && p.Grade == "B" && string.IsNullOrEmpty(p.PreStock)
  11533. && (DateTime.Now - p.ProductTime).TotalHours > timeOutHoldHours)
  11534. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  11535. select loc.Code;
  11536. if (!invlist.Any())
  11537. {
  11538. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11539. res.ResMsg = "没有B级品超时库存不足";
  11540. return res;
  11541. }
  11542. res.ResDataList = invlist.Distinct().ToList();
  11543. return res;
  11544. }
  11545. public SRes ErrorDateclearJob()
  11546. {
  11547. var res = new SRes();
  11548. try
  11549. {
  11550. 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();
  11551. foreach (var item in task)
  11552. {
  11553. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == item.BarCode);
  11554. if (stock == null)
  11555. {
  11556. if (_taskrepository.Delete(p => p.ID == item.ID))
  11557. {
  11558. _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();
  11559. }
  11560. }
  11561. else if (stock.InvStateCode == InvState.InvEcecState_BuildUp.ToString() || stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  11562. {
  11563. if (_taskrepository.Delete(p => p.ID == item.ID))
  11564. {
  11565. _billInvnowrepository.Delete(p => p.ContGrpBarCode == stock.ContGrpBarCode);
  11566. _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();
  11567. }
  11568. }
  11569. else
  11570. {
  11571. continue;
  11572. }
  11573. }
  11574. }
  11575. catch (Exception ex)
  11576. {
  11577. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11578. res.ResMsg = ex.Message;
  11579. return res;
  11580. }
  11581. return res;
  11582. }
  11583. public SRes FlowDataMoveJob(PalletizingPackStockOutRequest request)
  11584. {
  11585. var res = new SRes();
  11586. //流水表
  11587. try
  11588. {
  11589. var flow = _billInvflow.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddDays(-60)).OrderBy(p => p.Id).Take(100).ToList();
  11590. if (flow.Any())
  11591. {
  11592. var ids = flow.Select(p => p.Id).Distinct().ToList();
  11593. var flowhty = _mapper.Map<List<Bill_InvflowHty>>(flow);
  11594. if (_flowhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  11595. {
  11596. _flowhtyrepository.Context.Deleteable<Bill_InvflowHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  11597. }
  11598. _flowhtyrepository.InsertableSplitTable(flowhty);
  11599. _billInvflow.Delete(p => ids.Contains(p.Id));
  11600. }
  11601. }
  11602. catch (Exception ex)
  11603. {
  11604. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11605. res.ResMsg = ex.Message;
  11606. return res;
  11607. }
  11608. //码垛主表
  11609. try
  11610. {
  11611. 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();
  11612. if (pallet.Any())
  11613. {
  11614. var ids = pallet.Select(p => p.Id).Distinct().ToList();
  11615. var pallethty = _mapper.Map<List<PalletizingHty>>(pallet);
  11616. if (_pallethtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  11617. {
  11618. _pallethtyrepository.Context.Deleteable<PalletizingHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  11619. }
  11620. _pallethtyrepository.InsertableSplitTable(pallethty);
  11621. _palletizrepository.Delete(p => ids.Contains(p.Id));
  11622. }
  11623. }
  11624. catch (Exception ex)
  11625. {
  11626. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11627. res.ResMsg = ex.Message;
  11628. return res;
  11629. }
  11630. //推送表
  11631. try
  11632. {
  11633. var push = _billPushinforepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddMonths(-6)).OrderBy(p => p.Id).Take(100).ToList();
  11634. if (push.Any())
  11635. {
  11636. var ids = push.Select(p => p.Id).Distinct().ToList();
  11637. var pushthty = _mapper.Map<List<BillPushinfoHty>>(push);
  11638. if (_pushhtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  11639. {
  11640. _pushhtyrepository.Context.Deleteable<BillPushinfoHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  11641. }
  11642. _pushhtyrepository.InsertableSplitTable(pushthty);
  11643. _billPushinforepository.Delete(p => ids.Contains(p.Id));
  11644. }
  11645. }
  11646. catch (Exception ex)
  11647. {
  11648. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11649. res.ResMsg = ex.Message;
  11650. return res;
  11651. }
  11652. //箱号表
  11653. try
  11654. {
  11655. 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();
  11656. if (boxrule.Any())
  11657. {
  11658. var ids = boxrule.Select(p => p.Id).Distinct().ToList();
  11659. var boxrulethty = _mapper.Map<List<BillPboxruleHty>>(boxrule);
  11660. if (_pboxrulehtyrepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())
  11661. {
  11662. _pboxrulehtyrepository.Context.Deleteable<BillPboxruleHty>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();
  11663. }
  11664. _pboxrulehtyrepository.InsertableSplitTable(boxrulethty);
  11665. _boxrulerepository.Delete(p => ids.Contains(p.Id));
  11666. }
  11667. }
  11668. catch (Exception ex)
  11669. {
  11670. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11671. res.ResMsg = ex.Message;
  11672. return res;
  11673. }
  11674. return res;
  11675. }
  11676. /// <summary>
  11677. /// 清理任务数据
  11678. /// </summary>
  11679. /// <param name="request"></param>
  11680. /// <returns></returns>
  11681. public SRes RemoveTaskData(PalletizingPackStockOutRequest request)
  11682. {
  11683. var res = new SRes();
  11684. try
  11685. {
  11686. var sysconfcon = int.Parse(_sysconfigrepository.GetFirst(p => p.Code == "TaskRemoveHours").SContent) * (-1);
  11687. 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();
  11688. //var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < DateTime.Now.AddHours(sysconfcon)).SplitTable(p => p.Take(2)).Take(100).ToList();
  11689. if (tasklist.Any())
  11690. {
  11691. var ids = tasklist.Select(p => p.ID).ToList();
  11692. var barlist = tasklist.Select(p => p.BarCode).ToList();
  11693. _taskrepository.Delete(p => ids.Contains(p.ID));//任务表
  11694. var tables = _wcstaskoldrepository.Context.SplitHelper<WCS_TaskOld>().GetTables().Take(2);//
  11695. foreach (var item in tables)
  11696. {
  11697. //删除历史任务表
  11698. _wcstaskoldrepository.Context.Deleteable<WCS_TaskOld>().AS(item.TableName)//使用当前分表名
  11699. .Where(p => ids.Contains(p.Id))
  11700. .ExecuteCommand();
  11701. }
  11702. _billInvinitrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  11703. _billInvnowrepository.Delete(p => barlist.Contains(p.ContGrpBarCode) && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  11704. }
  11705. }
  11706. catch (Exception ex)
  11707. {
  11708. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  11709. res.ResMsg = ex.Message;
  11710. return res;
  11711. }
  11712. return res;
  11713. }
  11714. public void WreTimeOutRecord(List<string> contbars, string msg)
  11715. {
  11716. SxPackingHelp.WreTimeOutRecord(contbars, msg, _timeoutrecord, _logger);
  11717. }
  11718. /// <summary>
  11719. /// 码垛工位与对应的机器人的关系
  11720. /// </summary>
  11721. /// <param name="palletequip"></param>
  11722. /// <returns></returns>
  11723. private string DetermineRoot(string palletequip)
  11724. {
  11725. return SxServiceHelp.DetermineRoot(palletequip);
  11726. }
  11727. /// <summary>
  11728. /// 转换为百分比
  11729. /// </summary>
  11730. /// <param name="value"></param>
  11731. /// <returns></returns>
  11732. private static string ToPercentage(decimal value)
  11733. {
  11734. return (value * 100).ToString("F2") + "%";
  11735. }
  11736. private SRes MoveTask(string code)
  11737. {
  11738. return code.MoveTask(_wcstaskoldrepository, _basewarehouserepository, _billInvnowrepository, _basewarecellrepository,
  11739. _taskrepository, _taskdetailrepository, _db, _logger, _mapper, lockerPalletizingPackTask, lockerApplyLoc);
  11740. }
  11741. }
  11742. }