FJService.cs 415 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text.RegularExpressions;
  6. using AutoMapper;
  7. using Castle.Core.Internal;
  8. using Microsoft.Extensions.Logging;
  9. using Newtonsoft.Json;
  10. using SqlSugar;
  11. using SqlSugar.Extensions;
  12. using WCS.Entity.fj;
  13. using wms.dataservice.IDataSetvice;
  14. using wms.dto;
  15. using wms.dto.request;
  16. using wms.dto.request.fj;
  17. using wms.dto.request.hj;
  18. using wms.dto.request.share;
  19. using wms.dto.response;
  20. using wms.dto.response.fj;
  21. using wms.service.Extensions;
  22. using wms.service.IService;
  23. using wms.sqlsugar;
  24. using wms.sqlsugar.model;
  25. using wms.sqlsugar.model.fj;
  26. using wms.util.Check;
  27. using wms.util.Ext;
  28. using TaskStatus = wms.dto.TaskStatus;
  29. namespace wms.service.Service
  30. {
  31. /// <summary>
  32. /// 分拣服务
  33. /// </summary>
  34. public class FJService : IFJService
  35. {
  36. private static object lockInOrOut = new object();
  37. private readonly IFJDataService _IFJDataService;
  38. private readonly ILogger<FJService> _logger;
  39. private readonly IMapper _mapper;
  40. public FJService(IMapper mapper, ILogger<FJService> logger, IFJDataService IFJDataService)
  41. {
  42. _mapper = mapper;
  43. _logger = logger;
  44. _IFJDataService = IFJDataService;
  45. }
  46. private ITenant _db => SqlSugarHelper.Db; //处理事务
  47. /// <summary>
  48. /// 获取配置内容信息
  49. /// </summary>
  50. /// <param name="code">配置表code值</param>
  51. /// <returns></returns>
  52. public string GetSysConfigContentByCode(string code)
  53. {
  54. //先读缓存
  55. var cacheContent = RedisHelper.Get("sys_config" + code);
  56. if (!string.IsNullOrEmpty(cacheContent)) return cacheContent;
  57. var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);
  58. if (sysconf == null) throw new Exception("数据表没有配置" + code);
  59. var content = sysconf.SContent;
  60. var sysname = sysconf.Default1; //所属系统mes/erp
  61. RedisHelper.Set("sys_config" + code, content + "|" + sysname);
  62. return content;
  63. }
  64. /// <summary>
  65. /// 获取配置信息
  66. /// </summary>
  67. /// <param name="code"></param>
  68. /// <returns></returns>
  69. public fjSysConfig GetSysConfigByCode(string code)
  70. {
  71. return _sysconfigrepository.GetSingle(p => p.Code == code);
  72. }
  73. public fjSysJob GetSysJobEntity(DetailRequest2Str req)
  74. {
  75. return _jobRepository.GetFirst(p => p.Id == long.Parse(req.Id));
  76. }
  77. public fjSysJob GetSysJobEntityByCode(string Code)
  78. {
  79. return _jobRepository.GetSingle(p => p.Code == Code);
  80. }
  81. public List<fjSysJobApiRelation> GetSysApiDetail(long Id)
  82. {
  83. return _jobApiRepository.GetList(p => p.JobId == Id);
  84. }
  85. /// <summary>
  86. /// 创建货位,用于少数虚拟货位及平库
  87. /// </summary>
  88. /// <param name="WarehouseCode">仓库号</param>
  89. /// <param name="Code">货位号</param>
  90. /// <returns></returns>
  91. public SRes CreatWarecell(string WarehouseCode, string Code)
  92. {
  93. var res = new SRes();
  94. //找到对应的仓库
  95. var warehouse = _basewarehouserepository.GetFirst(x => x.Code == WarehouseCode);
  96. var wareCell = new BaseWarecell
  97. {
  98. WarehouseId = warehouse.Id,
  99. WarehouseCode = WarehouseCode,
  100. WareAreaId = 1669154208777113600,
  101. IsStop = 0,
  102. Code = Code,
  103. Name = Code,
  104. StateNum = FjLocationState.Empty,
  105. TypeNum = FjLocationType.Virtual,
  106. Size = 1,
  107. Row = 1,
  108. Col = 1,
  109. Layer = 1,
  110. Depth = 1,
  111. Tunnel = 1,
  112. SCRel = "芯股虚拟货位",
  113. ContGrpBarCode = "0",
  114. ContGrpId = 0,
  115. Shelf = "L",
  116. AddWho = "Admin",
  117. AddTime = DateTime.Now,
  118. EditWho = "Admin",
  119. EditTime = DateTime.Now,
  120. Memo = "芯股货架",
  121. GroupID = 0,
  122. XYNO = 0
  123. };
  124. _db.BeginTran();
  125. try
  126. {
  127. _basewarecellrepository.InsertReturnEntity(wareCell);
  128. }
  129. catch (Exception e)
  130. {
  131. _db.RollbackTran();
  132. _logger.LogInformation(e.Message);
  133. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  134. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();
  135. return res;
  136. }
  137. _db.CommitTran();
  138. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  139. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  140. return res;
  141. }
  142. public List<fjSysJob> GetJobList()
  143. {
  144. return _jobRepository.GetList();
  145. }
  146. /// <summary>
  147. /// 获取配置信息
  148. /// </summary>
  149. /// <param name="code"></param>
  150. /// <returns></returns>
  151. public fjSysConfig GetSysConfigByExpression(Expression<Func<fjSysConfig, bool>> WhereExpression)
  152. {
  153. return _sysconfigrepository.GetSingle(WhereExpression);
  154. }
  155. /// <summary>
  156. /// 获取反馈信息
  157. /// </summary>
  158. /// <param name="code"></param>
  159. /// <returns></returns>
  160. public List<BillPushinfo> GetBillPushinfoList(Expression<Func<BillPushinfo, bool>> WhereExpression,
  161. bool type = false)
  162. {
  163. if (type)
  164. return _billPushinforepository.AsQueryable().Where(WhereExpression).OrderBy(x => x.AddTime).Take(1)
  165. .ToList();
  166. return _billPushinforepository.GetList(WhereExpression);
  167. }
  168. public bool UpdatePushModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  169. {
  170. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  171. }
  172. /// <summary>
  173. /// 更新SysConfig表字段
  174. /// </summary>
  175. /// <param name="updateModel"></param>
  176. /// <returns></returns>
  177. public bool UpdateSysConfigModelColumns(UpdateModelColumns<fjSysConfig> updateModel)
  178. {
  179. return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  180. }
  181. public List<BaseMatinfo> GetBaseMatinfoList(Expression<Func<BaseMatinfo, bool>> WhereExpression)
  182. {
  183. return _basematerrepository.GetList(WhereExpression);
  184. }
  185. /// <summary>
  186. /// 更新物料基础信息表
  187. /// </summary>
  188. /// <param name="updateModel"></param>
  189. /// <returns></returns>
  190. public bool UpdateMaterModelColumns(UpdateModelColumns<BaseMatinfo> updateModel)
  191. {
  192. return _basematerrepository.Update(updateModel.Columns, updateModel.WhereExpression);
  193. }
  194. public bool UpdateMaterModel(BaseMatinfo updateModel)
  195. {
  196. return _basematerrepository.Update(updateModel);
  197. }
  198. /// <summary>
  199. /// 更新BillPushinfo表字段
  200. /// </summary>
  201. /// <param name="updateModel"></param>
  202. /// <returns></returns>
  203. public bool UpdateBillPushinfoModelColumns(UpdateModelColumns<BillPushinfo> updateModel)
  204. {
  205. return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);
  206. }
  207. public bool SyncMaterInfo(List<FJSyncMaterInfoResponseItem> ResData)
  208. {
  209. foreach (var item in ResData)
  210. {
  211. item.UpdatedTime = DateTime.Now;
  212. if (_basematerrepository.IsAny(p => p.Code == item.MatCode))
  213. {
  214. _basematerrepository.UpdateModelColumns(
  215. p => new BaseMatinfo
  216. {
  217. IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName,
  218. EditTime = DateTime.Now, Description = item.Describe
  219. },
  220. p => p.Code == item.MatCode);
  221. }
  222. else
  223. {
  224. var model = _mapper.Map<BaseMatinfo>(item);
  225. model.AddTime = DateTime.Now;
  226. _basematerrepository.Insert(model);
  227. }
  228. }
  229. return true;
  230. }
  231. /// <summary>
  232. /// 帘线同步物料
  233. /// </summary>
  234. /// <param name="ResData"></param>
  235. /// <returns></returns>
  236. public bool SyncMaterInfoLX(List<SxSyncMaterInfoListRequestItem> ResData)
  237. {
  238. foreach (var item in ResData)
  239. if (_basematerrepository.IsAny(p => p.Code == item.MatCode))
  240. {
  241. _basematerrepository.UpdateModelColumns(
  242. p => new BaseMatinfo
  243. {
  244. IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName,
  245. EditTime = DateTime.Now, Description = item.Describe
  246. },
  247. p => p.Code == item.MatCode);
  248. }
  249. else
  250. {
  251. var model = _mapper.Map<BaseMatinfo>(item);
  252. model.AddTime = DateTime.Now;
  253. _basematerrepository.Insert(model);
  254. }
  255. return true;
  256. }
  257. public SRes SyncMachineInfo(SyncMachineInfoRequest req)
  258. {
  259. if (_basemachinforepository.IsAny(p => p.MachNo == req.MachineCode))
  260. {
  261. _basemachinforepository.UpdateModelColumns(
  262. p => new BillMachinfo { Direction = req.VehicleDirection, EditTime = DateTime.Now },
  263. p => p.MachNo == req.MachineCode);
  264. }
  265. else
  266. {
  267. var model = _mapper.Map<BillMachinfo>(req);
  268. model.AddTime = DateTime.Now;
  269. model.EditTime = DateTime.Now;
  270. model.AddWho = "wms";
  271. model.EditWho = "wms";
  272. model.AddWho = "wms";
  273. model.EditWho = "wms";
  274. model.WarehouseCode = "";
  275. model.WarehouseId = 0;
  276. model.WarehouseSort = 0;
  277. model.Direction = "";
  278. model.WareAreaId = 0;
  279. model.IsStop = 0;
  280. model.GrpCode = "";
  281. model.Station = "";
  282. model.BillCode = "";
  283. model.WorkOrder = "";
  284. model.SetGrpCode = "";
  285. model.ProBillCode = "";
  286. model.ProWorkOrder = "";
  287. model.ProSetGrpCode = "";
  288. model.WareDirect = "";
  289. _basemachinforepository.Insert(model);
  290. }
  291. return new SRes();
  292. }
  293. /// <summary>
  294. /// 投料信息接收
  295. /// </summary>
  296. /// <param name="reqDto"></param>
  297. /// <returns></returns>
  298. public SRes WetFormulaInfo(WetFormulaInfoRequest reqDto)
  299. {
  300. var res = new SRes();
  301. //保存表Bill_BomInfo
  302. foreach (var item in reqDto.FeedList)
  303. {
  304. var procodelist = _billBominfoRepository.GetList(p => p.MatCode == item.InMaterialCode)
  305. .Select(p => p.ProCode).Distinct();
  306. if (procodelist.Any() && procodelist.Count() > 1)
  307. {
  308. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  309. res.ResMsg = item.InMaterialCode + "不允许率属于两个投料大类编码,接收失败";
  310. return res;
  311. }
  312. if (_billBominfoRepository.IsAny(p =>
  313. p.Code == reqDto.FeedCode && p.ProMatCode == item.OutMaterialCode &&
  314. p.MatCode == item.InMaterialCode))
  315. {
  316. //var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);
  317. //_billBominfoRepository.UpdateModelColumns(p => new BillBominfo() { MatCode = item.InMaterialCode, MatId = mat.Id, Name = item.InMaterialCode, HWCountQty = item.Count, EditTime = DateTime.Now },
  318. // p => p.Code == reqDto.FeedCode && p.MatCode == item.InMaterialCode);
  319. }
  320. else
  321. {
  322. var procode = string.Join('|',
  323. reqDto.FeedList.Where(p => p.OutMaterialCode == item.OutMaterialCode)
  324. .Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
  325. var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);
  326. if (mat == null)
  327. {
  328. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  329. res.ResMsg = "投入料" + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  330. return res;
  331. }
  332. var model = new BillBominfo
  333. {
  334. ProCode = procode,
  335. Code = reqDto.FeedCode,
  336. Name = reqDto.FeedName,
  337. MatCode = item.InMaterialCode,
  338. MatId = mat.Id,
  339. AddTime = DateTime.Now,
  340. AddWho = "wms",
  341. EditTime = DateTime.Now,
  342. EditWho = "wms",
  343. IsStop = 0,
  344. HWCountQty = item.Count,
  345. ProMatCode = item.OutMaterialCode,
  346. Memo = reqDto.Remark
  347. };
  348. model.AddTime = DateTime.Now;
  349. _billBominfoRepository.Insert(model);
  350. }
  351. }
  352. return res;
  353. }
  354. /// <summary>
  355. /// 帘线工单信息传输
  356. /// </summary>
  357. /// <param name="reqDto"></param>
  358. /// <returns></returns>
  359. public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)
  360. {
  361. var res = new SRes();
  362. //先判断是否有配方信息和物料基础信息
  363. var outmat = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  364. if (outmat == null)
  365. {
  366. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  367. res.ResMsg = reqDto.MatCode + "不存在该物料基础信息,请先同步基础信息";
  368. return res;
  369. }
  370. var procode = string.Join('|', reqDto.FeedList.Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
  371. if (reqDto.ProdFlag == 1)
  372. {
  373. var bominfo =
  374. _billBominfoRepository.GetFirst(p => p.Code == reqDto.FeedCode && p.ProMatCode == reqDto.MatCode);
  375. if (bominfo == null)
  376. {
  377. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  378. res.ResMsg = string.Format("当前产出为芯股,此芯股投料信息不存在请先同步投料信息,投料编码{0},产出物{1}", reqDto.FeedCode,
  379. reqDto.MatCode);
  380. return res;
  381. }
  382. procode = bominfo.ProCode;
  383. }
  384. BillBomsetgrp stack = null; //垛型固定获取最早更新的垛型
  385. //后续一个配方会有多个垛型
  386. if (reqDto.MatCode.StartsWith("57")) //是芯股
  387. {
  388. stack = _billBomsetgrpRepository.GetList(p =>
  389. (p.BomCode == procode || procode.Contains(p.BomCode)) && p.ProMaterCode.StartsWith("57") &&
  390. p.IsStop == 0)
  391. .OrderBy(x => x.EditTime).First();
  392. if (stack == null)
  393. {
  394. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  395. res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
  396. reqDto.FeedCode, procode, reqDto.MatCode);
  397. return res;
  398. }
  399. }
  400. else //不是芯股
  401. {
  402. var stackList = _billBomsetgrpRepository.GetList(p =>
  403. (p.BomCode == procode || procode.Contains(p.BomCode)) && !p.ProMaterCode.StartsWith("57") &&
  404. p.IsStop == 0).ToList();
  405. stack = stackList.OrderBy(x => x.EditTime).First();
  406. if (stack == null)
  407. {
  408. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  409. res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
  410. reqDto.FeedCode, procode, reqDto.MatCode);
  411. return res;
  412. }
  413. }
  414. var reqjson = JsonConvert.SerializeObject(reqDto);
  415. if (reqjson.Length > 5000) reqjson = "内容量过大,已截取";
  416. if (reqDto.BillState == CurtainBillState.初始化.GetHashCode().ToString() ||
  417. reqDto.BillState == CurtainBillState.已合并.GetHashCode().ToString() ||
  418. reqDto.BillState == CurtainBillState.已排产.GetHashCode().ToString())
  419. {
  420. var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
  421. if (doc == null)
  422. {
  423. doc = new BillDocsinfo();
  424. doc.WarehouseId = 0;
  425. doc.ReqNo = reqDto.BillCode;
  426. doc.DocsNo = reqDto.BillCode;
  427. doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
  428. doc.StateNum = DocState.DocState_Create.GetHashCode();
  429. doc.JsonContent = reqjson;
  430. doc.DownQty = 1;
  431. doc.IsStop = 0;
  432. doc.BomCode = reqDto.FeedCode;
  433. doc.ProMaterCode = reqDto.MatCode;
  434. doc.SetGrpCode = stack.Code;
  435. doc.WorkOrder = reqDto.WorkOrder;
  436. doc.SkuCode = reqDto.SkuCode;
  437. doc.PackRule = reqDto.PackRule;
  438. var docinsert = _billdocrepository.Insert(doc);
  439. if (!docinsert)
  440. {
  441. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  442. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
  443. return res;
  444. }
  445. }
  446. _basemachinforepository.UpdateModelColumns(
  447. p => new BillMachinfo
  448. {
  449. ProBillCode = reqDto.BillCode, ProWorkOrder = reqDto.WorkOrder, ProSetGrpCode = stack.Code,
  450. EditTime = DateTime.Now
  451. }, p => reqDto.WbList.Contains(p.MachNo));
  452. //箱号处理
  453. //根据箱号更新装箱信息表
  454. }
  455. else if (reqDto.BillState == CurtainBillState.生产中.GetHashCode().ToString())
  456. {
  457. var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
  458. if (doc == null)
  459. {
  460. doc = new BillDocsinfo();
  461. doc.WarehouseId = 0;
  462. doc.ReqNo = reqDto.BillCode;
  463. doc.DocsNo = reqDto.BillCode;
  464. doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
  465. doc.StateNum = DocState.DocState_Execute.GetHashCode();
  466. doc.JsonContent = reqjson;
  467. doc.DownQty = 1;
  468. doc.IsStop = 0;
  469. doc.BomCode = reqDto.FeedCode;
  470. doc.ProMaterCode = reqDto.MatCode;
  471. doc.SetGrpCode = stack.Code;
  472. doc.WorkOrder = reqDto.WorkOrder;
  473. doc.SkuCode = reqDto.SkuCode;
  474. doc.PackRule = reqDto.PackRule;
  475. var docinsert = _billdocrepository.Insert(doc);
  476. if (!docinsert)
  477. {
  478. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  479. res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
  480. return res;
  481. }
  482. }
  483. var state = DocState.DocState_Execute.GetHashCode();
  484. _billdocrepository.UpdateModelColumns(
  485. p => new BillDocsinfo { StateNum = state, SetGrpCode = stack.Code },
  486. p => p.DocsNo == reqDto.BillCode);
  487. _basemachinforepository.UpdateModelColumns(
  488. p => new BillMachinfo
  489. {
  490. BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, SetGrpCode = stack.Code,
  491. EditTime = DateTime.Now
  492. }, p => reqDto.WbList.Contains(p.MachNo));
  493. //箱号处理
  494. //根据箱号更新装箱信息表
  495. }
  496. else if (reqDto.BillState == CurtainBillState.生产结束.GetHashCode().ToString() ||
  497. reqDto.BillState == CurtainBillState.计划关闭.GetHashCode().ToString())
  498. {
  499. var state = DocState.DocState_Complete.GetHashCode();
  500. _billdocrepository.UpdateModelColumns(p => new BillDocsinfo { StateNum = state },
  501. p => p.DocsNo == reqDto.BillCode);
  502. }
  503. return res;
  504. }
  505. /// <summary>
  506. /// 湿拉工单启动验证
  507. /// </summary>
  508. /// <param name="reqDto"></param>
  509. /// <returns></returns>
  510. public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto)
  511. {
  512. var res = new SRes();
  513. var doc = _billdocrepository.GetList(p => p.WorkOrder == reqDto.BillCode);
  514. if (doc == null || !doc.Any())
  515. {
  516. res.ResCode = 0;
  517. res.ResMsg = reqDto.BillCode + "工单不存在";
  518. return res;
  519. }
  520. if (doc.Any(p => string.IsNullOrEmpty(p.BomCode)))
  521. {
  522. res.ResCode = 0;
  523. res.ResMsg = reqDto.BillCode + "帘线工序工单没有配置垛型信息,请先配置垛型";
  524. return res;
  525. }
  526. return res;
  527. }
  528. public SRes ManualBuildEmptyStock(ManualBuildEmptyStockRequest request)
  529. {
  530. var result = new SRes();
  531. if (string.IsNullOrEmpty(request.ContGrpBarCode))
  532. {
  533. result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  534. result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  535. return result;
  536. }
  537. var mater = _basematerrepository.GetSingle(p => request.ContGrpBarCode.Substring(0, 3) == p.Code);
  538. if (mater == null)
  539. {
  540. result.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();
  541. result.ResMsg = request.ContGrpBarCode.Substring(0, 3) + "托盘类型不存在";
  542. return result;
  543. }
  544. var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  545. .Where(p => p.BarCode == request.ContGrpBarCode && p.Status < TaskStatus.Finish)
  546. .SplitTable(p => p.Take(2)).ToList();
  547. if (taskold.Any())
  548. {
  549. result.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  550. result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription() + "不允许绑定";
  551. return result;
  552. }
  553. var BarCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.ContGrpBarCode);
  554. if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_In.ToString())
  555. {
  556. result.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();
  557. result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();
  558. return result;
  559. }
  560. if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  561. {
  562. result.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();
  563. result.ResMsg = request.ContGrpBarCode +
  564. ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();
  565. return result;
  566. }
  567. if (BarCode != null)
  568. {
  569. result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  570. result.ResMsg = request.ContGrpBarCode + "存在库存信息,请先处理遗留的库存信息";
  571. return result;
  572. }
  573. //空托盘
  574. var code = _baseContinfo.GetSingle(p => p.ContBarCode == request.ContGrpBarCode);
  575. if (code == null)
  576. {
  577. var init = new BaseContinfo
  578. {
  579. ContBarCode = request.ContGrpBarCode,
  580. Name = mater.Name,
  581. IsStop = 0,
  582. WarehouseId = 0,
  583. TypeCode = "1",
  584. PrintQty = 1,
  585. AddWho = "wms",
  586. EditWho = "wms"
  587. };
  588. _baseContinfo.Insert(init);
  589. }
  590. try
  591. {
  592. var nov = new BillInvnow
  593. {
  594. WarehouseId = 0,
  595. ContGrpBarCode = request.ContGrpBarCode,
  596. ContGrpId = IdFactory.NewId(),
  597. BoxBarCode = "",
  598. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  599. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  600. MatId = mater.Id,
  601. MatCode = mater.Code,
  602. MatName = mater.Name,
  603. RFIDBarCode = request.ContGrpBarCode,
  604. HWBarCode = request.ContGrpBarCode,
  605. HWTypeCode = "",
  606. InvInOut = FJInvInOutType.In,
  607. Size = 2,
  608. ContGrpType = FJContGrpType.EmptyCon,
  609. LengthQty = request.Count //存放托盘数量
  610. };
  611. _db.BeginTran();
  612. _billInvnowrepository.Insert(nov);
  613. _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));
  614. _db.CommitTran();
  615. }
  616. catch (Exception ex)
  617. {
  618. _db.RollbackTran();
  619. result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  620. result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  621. return result;
  622. }
  623. return result;
  624. }
  625. /// <summary>
  626. /// 获取工字轮流向(江锦调用)
  627. /// </summary>
  628. /// <param name="reqDto"></param>
  629. /// <returns></returns>
  630. public SRes<string> AllocatedSpoolFlow(AllocatedSpoolFlowRequest reqDto)
  631. {
  632. var spoolbar = _billSpoolTransrepository.AsQueryable().With(SqlWith.NoLock)
  633. .Where(p => p.ConBarCode == reqDto.SpoolBarCode).OrderByDescending(x => x.AddTime).First();
  634. if (spoolbar == null)
  635. {
  636. var error = new BaseErrorInfo
  637. {
  638. BusName = "江景获取流向",
  639. Message = $"{reqDto.SpoolBarCode}没有工字轮信息,{DateTime.Now:yyyyMMddHH}",
  640. Count = 1,
  641. Memo = "WCS"
  642. };
  643. error.UpdataErrorinfo(_baseErrorInfoRepository);
  644. return new SRes<string>
  645. {
  646. ResMsg = reqDto.SpoolBarCode + "没有工字轮信息",
  647. ResData = "",
  648. ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()
  649. };
  650. }
  651. //验证产品等级与下线时间
  652. var invInt = _billInvinitrepository.AsQueryable().With(SqlWith.NoLock)
  653. .Single(x => x.HWBarCode == spoolbar.ConBarCode);
  654. if (invInt == null)
  655. {
  656. var error = new BaseErrorInfo
  657. {
  658. BusName = "江景获取流向",
  659. Message = $"{reqDto.SpoolBarCode}没有工字轮信息,{DateTime.Now:yyyyMMddHH}",
  660. Count = 1,
  661. Memo = "WCS"
  662. };
  663. error.UpdataErrorinfo(_baseErrorInfoRepository);
  664. return new SRes<string>
  665. {
  666. ResMsg = reqDto.SpoolBarCode + "没有工字轮条码信息",
  667. ResData = "",
  668. ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()
  669. };
  670. }
  671. if (invInt.Grade != "A")
  672. {
  673. var error = new BaseErrorInfo
  674. {
  675. BusName = "江景获取流向",
  676. Message = $"{reqDto.SpoolBarCode}-{invInt.Grade}质量,进入BC区,{DateTime.Now:yyyyMMddHH}",
  677. Count = 1,
  678. Memo = "WCS"
  679. };
  680. error.UpdataErrorinfo(_baseErrorInfoRepository);
  681. return new SRes<string>
  682. {
  683. ResMsg = $"{invInt.Grade}质量,进入BC区",
  684. ResData = "",
  685. ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()
  686. };
  687. }
  688. if (invInt.ProductTime < DateTime.Now.AddHours(-12))
  689. {
  690. var error = new BaseErrorInfo
  691. {
  692. BusName = "江景获取流向",
  693. Message = $"{reqDto.SpoolBarCode}生产时间超时十二小时,{DateTime.Now:yyyyMMddHH}",
  694. Count = 1,
  695. Memo = "WCS"
  696. };
  697. error.UpdataErrorinfo(_baseErrorInfoRepository);
  698. return new SRes<string>
  699. {
  700. ResMsg = "生产时间超时十二小时",
  701. ResData = "",
  702. ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()
  703. };
  704. }
  705. return new SRes<string>
  706. {
  707. ResMsg = "成功",
  708. ResData = spoolbar.Direct,
  709. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode()
  710. };
  711. }
  712. /// <summary>
  713. /// 取分流异常的结果
  714. /// </summary>
  715. /// <param name="reqDto"></param>
  716. /// <returns></returns>
  717. public SRes QueryFlowDirectionExceptions(GetFlowExceptionResultsRequest reqDto)
  718. {
  719. var res = new SRes();
  720. //时间处理
  721. var prodate = reqDto.ProductDate.GetDateTime(_logger).AddMinutes(-1);
  722. //是否有异常
  723. if (_baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock)
  724. .Any(x => x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate))
  725. {
  726. var regInfo = _baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock).First(x =>
  727. x.BusName.Contains("湿拉下盘注册") && x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate);
  728. if (regInfo != null) //表示此工字轮注册时失败
  729. {
  730. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  731. res.ResMsg = regInfo.Message + $"[{reqDto.ProductDate}]";
  732. return res;
  733. }
  734. var flow = _baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock).First(x =>
  735. x.BusName.Contains("江景获取流向") && x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate);
  736. if (flow != null) //表示此工字轮获取流向时出现的错误结果
  737. {
  738. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  739. res.ResMsg = flow.Message + $"[{reqDto.ProductDate}]";
  740. return res;
  741. }
  742. }
  743. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  744. res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();
  745. return res;
  746. }
  747. /// <summary>
  748. /// 人工创建满托入库任务
  749. /// </summary>
  750. /// <param name="reqDto"></param>
  751. /// <returns></returns>
  752. public SRes CreateMaterialPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto)
  753. {
  754. var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
  755. var taskMax = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  756. .First(x => x.Code == "FullPalletInMax").SContent);
  757. var taskCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  758. x.BusType == FJTaskBusType.人工满托入库.GetDescription() && x.Status < TaskStatus.Finish);
  759. if (string.IsNullOrEmpty(reqDto.LocCode))
  760. {
  761. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  762. res.ResMsg = "站台编号不可为空,请扫描站台编号!!!!!!";
  763. return res;
  764. }
  765. if (string.IsNullOrEmpty(reqDto.TrayCode))
  766. {
  767. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  768. res.ResMsg = "托盘条码不可为空,请扫描托盘条码!!!!!!";
  769. return res;
  770. }
  771. //获取工字轮任务信息
  772. var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  773. .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
  774. if (taskInfo != null)
  775. {
  776. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  777. res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
  778. return res;
  779. }
  780. //托盘
  781. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
  782. if (container == null)
  783. {
  784. var insertcon = new BaseContinfo
  785. {
  786. ContBarCode = reqDto.TrayCode,
  787. Name = reqDto.TrayCode,
  788. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  789. PrintQty = 1,
  790. IsStop = 0,
  791. WarehouseId = 0,
  792. WeightQty = 0,
  793. AddWho = "wms",
  794. AddTime = DateTime.Now
  795. };
  796. //新加载具信息
  797. if (!_baseContinfo.Insert(insertcon))
  798. {
  799. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  800. res.ResMsg = "托盘载具初始化失败";
  801. return res;
  802. }
  803. }
  804. //工字轮
  805. var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);
  806. if (spoolNr == null)
  807. {
  808. var insertcon = new BaseContinfo
  809. {
  810. ContBarCode = reqDto.TrayCode,
  811. Name = reqDto.TrayCode,
  812. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  813. PrintQty = 1,
  814. IsStop = 0,
  815. WarehouseId = 0,
  816. WeightQty = 0,
  817. AddWho = "wms",
  818. AddTime = DateTime.Now
  819. };
  820. //新加载具信息
  821. if (!_baseContinfo.Insert(insertcon))
  822. {
  823. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  824. res.ResMsg = "工字轮载具初始化失败";
  825. return res;
  826. }
  827. }
  828. //物料
  829. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);
  830. if (mater == null)
  831. {
  832. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  833. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  834. return res;
  835. }
  836. //工字轮库存
  837. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);
  838. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  839. {
  840. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  841. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  842. return res;
  843. }
  844. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  845. {
  846. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  847. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  848. return res;
  849. }
  850. //托盘库存
  851. var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
  852. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
  853. {
  854. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  855. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  856. return res;
  857. }
  858. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  859. {
  860. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  861. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  862. return res;
  863. }
  864. //通过投入物料找到垛型编码
  865. var stackdetail =
  866. _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);
  867. if (stackdetail == null)
  868. {
  869. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  870. res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;
  871. return res;
  872. }
  873. //获取垛型主表
  874. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);
  875. //获取工字轮任务信息
  876. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);
  877. if (task == null)
  878. {
  879. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  880. res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";
  881. return res;
  882. }
  883. //工字轮条码信息
  884. var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);
  885. if (barInfo == null)
  886. {
  887. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  888. res.ResMsg = reqDto.SpoolNr + "没有条码信息";
  889. return res;
  890. }
  891. try
  892. {
  893. _db.BeginTran();
  894. //更新条码信息
  895. _billInvinitrepository.UpdateModelColumns(p => new BillInvinit
  896. {
  897. ContGrpBarCode = reqDto.TrayCode,
  898. EditTime = DateTime.Now
  899. }, p => p.HWBarCode == reqDto.SpoolNr);
  900. //删除因异常导致残留的对应库存信息
  901. _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);
  902. barInfo.ContGrpBarCode = reqDto.TrayCode;
  903. //创建库存信息
  904. //将条码表映射到库存表
  905. var invnow = _mapper.Map<BillInvnow>(barInfo);
  906. invnow.IsTorsChk = true;
  907. invnow.AddTime = DateTime.Now;
  908. invnow.Id = IdFactory.NewId();
  909. if (!_billInvnowrepository.Insert(invnow))
  910. {
  911. _db.RollbackTran();
  912. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  913. res.ResMsg = "人工满轮入库存储库存失败";
  914. return res;
  915. }
  916. //删除这个任务的阻盘记录
  917. var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  918. .Where(x => x.BarCode == reqDto.SpoolNr).Select(x => x.ID).ToList();
  919. if (taskIdList != null)
  920. {
  921. //删除当前任务与更新历史任务
  922. _taskrepository.Delete(x => taskIdList.Contains(x.ID));
  923. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  924. {
  925. Status = TaskStatus.Cancel,
  926. ManualRemarks = "人工满托入库,清除信息"
  927. }, x => taskIdList.Contains(x.Id));
  928. //TODO:入库算法
  929. //TODO:出库算法
  930. //TODO:最优验证算法
  931. }
  932. //判断对应仓库中空货位数量
  933. var invnowCount_1N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  934. x.WarehouseCode == "1N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);
  935. var invnowCount_2N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  936. x.WarehouseCode == "2N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);
  937. var taskInfoCount_1N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  938. x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&
  939. x.WarehouseCode == "1N");
  940. var taskInfoCount_2N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  941. x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&
  942. x.WarehouseCode == "2N");
  943. //创建对应任务
  944. var count_1N = invnowCount_1N - taskInfoCount_1N;
  945. var count_2N = invnowCount_2N - taskInfoCount_2N;
  946. var wCode = count_1N >= count_2N ? "1N" : "2N";
  947. if (taskMax > 0 && taskCount > 0)
  948. if ((wCode == "1N" && taskMax <= taskInfoCount_1N) ||
  949. (wCode == "2N" && taskMax <= taskInfoCount_2N))
  950. {
  951. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  952. res.ResMsg = $"禁止入库,最大入库任务数量已达{taskMax}";
  953. return res;
  954. }
  955. //创建入库记录
  956. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  957. {
  958. BusType = FJTaskBusType.人工满托入库.GetDescription(),
  959. ContGrpBarCode = reqDto.TrayCode,
  960. Qty = 1,
  961. Floor = 2,
  962. MatCode = reqDto.InMaterialCode,
  963. EquCode = reqDto.LocCode,
  964. Type = TaskType.EnterDepot,
  965. DocCode = "",
  966. WorkBench = task.WorkBench,
  967. WarehouseCode = wCode /*(count_1N <= count_2N) ? "1N" : "2N"*/
  968. };
  969. //下发wcs任务 - 分解方法
  970. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, task.Grade, true);
  971. if (taskRes.ResCode != 200)
  972. {
  973. _db.RollbackTran();
  974. res.ResCode = taskRes.ResCode;
  975. res.ResMsg = taskRes.ResMsg;
  976. return res;
  977. }
  978. _db.CommitTran();
  979. }
  980. catch (Exception ex)
  981. {
  982. _db.RollbackTran();
  983. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  984. res.ResMsg = ex.StackTrace;
  985. return res;
  986. }
  987. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  988. res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
  989. return res;
  990. }
  991. /// <summary>
  992. /// 人工创建UT满托入库任务
  993. /// </summary>
  994. /// <param name="reqDto"></param>
  995. /// <returns></returns>
  996. public SRes CreateMaterialUTPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto)
  997. {
  998. var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
  999. var taskMax = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  1000. .First(x => x.Code == "UTFullPalletInMax").SContent);
  1001. var taskCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  1002. x.BusType == FJTaskBusType.UT人工满托入库.GetDescription() && x.Status < TaskStatus.Finish);
  1003. if (string.IsNullOrEmpty(reqDto.LocCode))
  1004. {
  1005. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1006. res.ResMsg = "站台编号不可为空,请扫描站台编号!!!!!!";
  1007. return res;
  1008. }
  1009. if (string.IsNullOrEmpty(reqDto.TrayCode))
  1010. {
  1011. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1012. res.ResMsg = "托盘条码不可为空,请扫描托盘条码!!!!!!";
  1013. return res;
  1014. }
  1015. //获取工字轮任务信息
  1016. var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1017. .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
  1018. if (taskInfo != null)
  1019. {
  1020. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1021. res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
  1022. return res;
  1023. }
  1024. //托盘
  1025. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
  1026. if (container == null)
  1027. {
  1028. var insertcon = new BaseContinfo
  1029. {
  1030. ContBarCode = reqDto.TrayCode,
  1031. Name = reqDto.TrayCode,
  1032. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1033. PrintQty = 1,
  1034. IsStop = 0,
  1035. WarehouseId = 0,
  1036. WeightQty = 0,
  1037. AddWho = "wms",
  1038. AddTime = DateTime.Now
  1039. };
  1040. //新加载具信息
  1041. if (!_baseContinfo.Insert(insertcon))
  1042. {
  1043. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1044. res.ResMsg = "托盘载具初始化失败";
  1045. return res;
  1046. }
  1047. }
  1048. //工字轮
  1049. var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);
  1050. if (spoolNr == null)
  1051. {
  1052. var insertcon = new BaseContinfo
  1053. {
  1054. ContBarCode = reqDto.TrayCode,
  1055. Name = reqDto.TrayCode,
  1056. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1057. PrintQty = 1,
  1058. IsStop = 0,
  1059. WarehouseId = 0,
  1060. WeightQty = 0,
  1061. AddWho = "wms",
  1062. AddTime = DateTime.Now
  1063. };
  1064. //新加载具信息
  1065. if (!_baseContinfo.Insert(insertcon))
  1066. {
  1067. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1068. res.ResMsg = "工字轮载具初始化失败";
  1069. return res;
  1070. }
  1071. }
  1072. //物料
  1073. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);
  1074. if (mater == null)
  1075. {
  1076. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  1077. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  1078. return res;
  1079. }
  1080. //工字轮库存
  1081. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);
  1082. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  1083. {
  1084. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1085. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  1086. return res;
  1087. }
  1088. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1089. {
  1090. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1091. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  1092. return res;
  1093. }
  1094. //托盘库存
  1095. var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
  1096. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
  1097. {
  1098. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1099. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  1100. return res;
  1101. }
  1102. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1103. {
  1104. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1105. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  1106. return res;
  1107. }
  1108. //通过投入物料找到垛型编码
  1109. var stackdetail =
  1110. _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);
  1111. if (stackdetail == null)
  1112. {
  1113. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1114. res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;
  1115. return res;
  1116. }
  1117. //获取垛型主表
  1118. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);
  1119. //获取工字轮任务信息
  1120. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);
  1121. if (task == null)
  1122. {
  1123. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1124. res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";
  1125. return res;
  1126. }
  1127. //工字轮条码信息
  1128. var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);
  1129. if (barInfo == null)
  1130. {
  1131. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1132. res.ResMsg = reqDto.SpoolNr + "没有条码信息";
  1133. return res;
  1134. }
  1135. try
  1136. {
  1137. _db.BeginTran();
  1138. //更新条码信息
  1139. _billInvinitrepository.UpdateModelColumns(p => new BillInvinit
  1140. {
  1141. ContGrpBarCode = reqDto.TrayCode,
  1142. EditTime = DateTime.Now
  1143. }, p => p.HWBarCode == reqDto.SpoolNr);
  1144. //删除因异常导致残留的对应库存信息
  1145. _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);
  1146. barInfo.ContGrpBarCode = reqDto.TrayCode;
  1147. //创建库存信息
  1148. //将条码表映射到库存表
  1149. var invnow = _mapper.Map<BillInvnow>(barInfo);
  1150. invnow.IsTorsChk = true;
  1151. invnow.AddTime = DateTime.Now;
  1152. invnow.Id = IdFactory.NewId();
  1153. if (!_billInvnowrepository.Insert(invnow))
  1154. {
  1155. _db.RollbackTran();
  1156. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1157. res.ResMsg = "人工满轮入库存储库存失败";
  1158. return res;
  1159. }
  1160. //删除这个任务的阻盘记录
  1161. var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1162. .Where(x => x.BarCode == reqDto.SpoolNr).Select(x => x.ID).ToList();
  1163. if (taskIdList != null)
  1164. {
  1165. //删除当前任务与更新历史任务
  1166. _taskrepository.Delete(x => taskIdList.Contains(x.ID));
  1167. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  1168. {
  1169. Status = TaskStatus.Cancel,
  1170. ManualRemarks = "人工满托入库,清除信息"
  1171. }, x => taskIdList.Contains(x.Id));
  1172. //TODO:入库算法
  1173. //TODO:出库算法
  1174. //TODO:最优验证算法
  1175. }
  1176. //判断对应仓库中空货位数量
  1177. var invnowCount_1N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  1178. x.WarehouseCode == "1N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);
  1179. var invnowCount_2N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  1180. x.WarehouseCode == "2N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);
  1181. var taskInfoCount_1N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  1182. x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&
  1183. x.WarehouseCode == "1N");
  1184. var taskInfoCount_2N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  1185. x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&
  1186. x.WarehouseCode == "2N");
  1187. //创建对应任务
  1188. var count_1N = invnowCount_1N - taskInfoCount_1N;
  1189. var count_2N = invnowCount_2N - taskInfoCount_2N;
  1190. var wCode = count_1N >= count_2N ? "1N" : "2N";
  1191. if (taskMax > 0 && taskCount > 0)
  1192. if ((wCode == "1N" && taskMax <= taskInfoCount_1N) ||
  1193. (wCode == "2N" && taskMax <= taskInfoCount_2N))
  1194. {
  1195. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1196. res.ResMsg = $"禁止入库,最大入库任务数量已达{taskMax}";
  1197. return res;
  1198. }
  1199. //创建入库记录
  1200. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  1201. {
  1202. BusType = FJTaskBusType.UT人工满托入库.GetDescription(),
  1203. ContGrpBarCode = reqDto.TrayCode,
  1204. Qty = 1,
  1205. Floor = 2,
  1206. MatCode = reqDto.InMaterialCode,
  1207. EquCode = reqDto.LocCode,
  1208. Type = TaskType.EnterDepot,
  1209. DocCode = "",
  1210. WorkBench = task.WorkBench,
  1211. WarehouseCode = wCode /*(count_1N <= count_2N) ? "1N" : "2N"*/
  1212. };
  1213. //下发wcs任务 - 分解方法
  1214. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, task.Grade, true);
  1215. if (taskRes.ResCode != 200)
  1216. {
  1217. _db.RollbackTran();
  1218. res.ResCode = taskRes.ResCode;
  1219. res.ResMsg = taskRes.ResMsg;
  1220. return res;
  1221. }
  1222. _db.CommitTran();
  1223. }
  1224. catch (Exception ex)
  1225. {
  1226. _db.RollbackTran();
  1227. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1228. res.ResMsg = ex.StackTrace;
  1229. return res;
  1230. }
  1231. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1232. res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
  1233. return res;
  1234. }
  1235. /// <summary>
  1236. /// 芯股满托创建库存信息
  1237. /// </summary>
  1238. /// <param name="reqDto"></param>
  1239. /// <returns></returns>
  1240. public SRes CreateMaterialPalletWarehouTask1(CreateMaterialPalletWarehouTask1Request reqDto)
  1241. {
  1242. var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
  1243. //获取工字轮任务信息
  1244. var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1245. .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
  1246. if (taskInfo != null)
  1247. {
  1248. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1249. res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
  1250. return res;
  1251. }
  1252. //托盘
  1253. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
  1254. if (container == null)
  1255. {
  1256. var insertcon = new BaseContinfo
  1257. {
  1258. ContBarCode = reqDto.TrayCode,
  1259. Name = reqDto.TrayCode,
  1260. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1261. PrintQty = 1,
  1262. IsStop = 0,
  1263. WarehouseId = 0,
  1264. WeightQty = 0,
  1265. AddWho = "wms",
  1266. AddTime = DateTime.Now
  1267. };
  1268. //新加载具信息
  1269. if (!_baseContinfo.Insert(insertcon))
  1270. {
  1271. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1272. res.ResMsg = "托盘载具初始化失败";
  1273. return res;
  1274. }
  1275. }
  1276. //工字轮
  1277. var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);
  1278. if (spoolNr == null)
  1279. {
  1280. var insertcon = new BaseContinfo
  1281. {
  1282. ContBarCode = reqDto.TrayCode,
  1283. Name = reqDto.TrayCode,
  1284. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1285. PrintQty = 1,
  1286. IsStop = 0,
  1287. WarehouseId = 0,
  1288. WeightQty = 0,
  1289. AddWho = "wms",
  1290. AddTime = DateTime.Now
  1291. };
  1292. //新加载具信息
  1293. if (!_baseContinfo.Insert(insertcon))
  1294. {
  1295. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1296. res.ResMsg = "工字轮载具初始化失败";
  1297. return res;
  1298. }
  1299. }
  1300. //物料
  1301. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);
  1302. if (mater == null)
  1303. {
  1304. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  1305. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  1306. return res;
  1307. }
  1308. //工字轮库存
  1309. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);
  1310. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  1311. {
  1312. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1313. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  1314. return res;
  1315. }
  1316. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1317. {
  1318. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1319. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  1320. return res;
  1321. }
  1322. //托盘库存
  1323. var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
  1324. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
  1325. {
  1326. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1327. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  1328. return res;
  1329. }
  1330. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1331. {
  1332. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1333. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  1334. return res;
  1335. }
  1336. //通过投入物料找到垛型编码
  1337. var stackdetail =
  1338. _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);
  1339. if (stackdetail == null)
  1340. {
  1341. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1342. res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;
  1343. return res;
  1344. }
  1345. //获取垛型主表
  1346. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);
  1347. //获取工字轮任务信息
  1348. var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);
  1349. if (task == null)
  1350. {
  1351. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1352. res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";
  1353. return res;
  1354. }
  1355. //工字轮条码信息
  1356. var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);
  1357. if (barInfo == null)
  1358. {
  1359. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1360. res.ResMsg = reqDto.SpoolNr + "没有条码信息";
  1361. return res;
  1362. }
  1363. //对应货位是否存在
  1364. var wareCell = _basewarecellrepository.GetFirst(p => p.Code == reqDto.LocCode);
  1365. if (wareCell == null)
  1366. {
  1367. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1368. res.ResMsg = reqDto.LocCode + "没有货位信息";
  1369. return res;
  1370. }
  1371. //判断货位是否已经存储
  1372. if (wareCell.StateNum != FjLocationState.Empty)
  1373. {
  1374. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1375. res.ResMsg = $"货位{reqDto.LocCode}状态不是空,当前状态位{wareCell.StateNum.GetDescription()},请联系相关人员进行处理!!!";
  1376. return res;
  1377. }
  1378. try
  1379. {
  1380. _db.BeginTran();
  1381. //更新条码信息
  1382. _billInvinitrepository.UpdateModelColumns(p => new BillInvinit
  1383. {
  1384. ContGrpBarCode = reqDto.TrayCode,
  1385. EditTime = DateTime.Now
  1386. }, p => p.HWBarCode == reqDto.SpoolNr);
  1387. //删除因异常导致残留的对应库存信息
  1388. _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);
  1389. wareCell.ContGrpBarCode = reqDto.TrayCode;
  1390. //创建库存信息
  1391. //将条码表映射到库存表
  1392. var invnow = _mapper.Map<BillInvnow>(barInfo);
  1393. invnow.IsTorsChk = true;
  1394. invnow.AddTime = DateTime.Now;
  1395. invnow.InvStateCode = FJInvState.InvEcecState_In.ToString();
  1396. invnow.ContGrpBarCode = reqDto.TrayCode;
  1397. invnow.Id = IdFactory.NewId();
  1398. invnow.WarehouseId = wareCell.WarehouseId;
  1399. if (!_billInvnowrepository.Insert(invnow))
  1400. {
  1401. _db.RollbackTran();
  1402. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1403. res.ResMsg = "芯股满托存储库存失败";
  1404. return res;
  1405. }
  1406. //存储进入对应的货位
  1407. //更新条码信息
  1408. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  1409. {
  1410. ContGrpBarCode = reqDto.TrayCode,
  1411. ContGrpId = invnow.ContGrpId,
  1412. StateNum = FjLocationState.Full,
  1413. EditTime = DateTime.Now
  1414. }, p => p.Code == reqDto.LocCode);
  1415. _db.CommitTran();
  1416. }
  1417. catch (Exception ex)
  1418. {
  1419. _db.RollbackTran();
  1420. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1421. res.ResMsg = ex.StackTrace;
  1422. return res;
  1423. }
  1424. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1425. res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
  1426. return res;
  1427. }
  1428. /// <summary>
  1429. /// 重绕区组盘信息
  1430. /// </summary>
  1431. /// <param name="reqDto"></param>
  1432. /// <returns></returns>
  1433. public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto)
  1434. {
  1435. var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
  1436. //获取工字轮任务信息
  1437. var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1438. .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
  1439. if (taskInfo != null)
  1440. {
  1441. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1442. res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";
  1443. return res;
  1444. }
  1445. //托盘
  1446. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
  1447. if (container == null)
  1448. {
  1449. var insertcon = new BaseContinfo
  1450. {
  1451. ContBarCode = reqDto.TrayCode,
  1452. Name = reqDto.TrayCode,
  1453. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1454. PrintQty = 1,
  1455. IsStop = 0,
  1456. WarehouseId = 0,
  1457. WeightQty = 0,
  1458. AddWho = "wms",
  1459. AddTime = DateTime.Now
  1460. };
  1461. //新加载具信息
  1462. if (!_baseContinfo.Insert(insertcon))
  1463. {
  1464. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1465. res.ResMsg = "托盘载具初始化失败";
  1466. return res;
  1467. }
  1468. }
  1469. //托盘库存
  1470. var trayCode = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == reqDto.TrayCode);
  1471. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_BuildUp.ToString())
  1472. {
  1473. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1474. res.ResMsg = $"{reqDto.TrayCode}已有组盘信息,请确认库存信息";
  1475. return res;
  1476. }
  1477. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
  1478. {
  1479. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1480. res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
  1481. return res;
  1482. }
  1483. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1484. {
  1485. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1486. res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
  1487. return res;
  1488. }
  1489. var SpoolNoGroup = reqDto.SpoolGroup.Select(x => x.SpoolCode).ToList();
  1490. var stackHeaderSet = new List<BillBomsetgrp>();
  1491. var matCodes = "";
  1492. #region 校验工字轮信息并获取对应垛型
  1493. foreach (var spool in reqDto.SpoolGroup)
  1494. {
  1495. var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == spool.SpoolCode);
  1496. if (spoolNr == null)
  1497. {
  1498. var insertcon = new BaseContinfo
  1499. {
  1500. ContBarCode = spool.SpoolCode,
  1501. Name = spool.SpoolCode,
  1502. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1503. PrintQty = 1,
  1504. IsStop = 0,
  1505. WarehouseId = 0,
  1506. WeightQty = 0,
  1507. AddWho = "wms",
  1508. AddTime = DateTime.Now
  1509. };
  1510. //新加载具信息
  1511. if (!_baseContinfo.Insert(insertcon))
  1512. {
  1513. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1514. res.ResMsg = "工字轮载具初始化失败";
  1515. return res;
  1516. }
  1517. }
  1518. //物料
  1519. var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
  1520. if (mater == null)
  1521. {
  1522. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  1523. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  1524. return res;
  1525. }
  1526. //工字轮库存
  1527. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spool.SpoolCode);
  1528. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  1529. {
  1530. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1531. res.ResMsg = "该工字轮条码号已在库中,请检查工字轮条码号是否重复";
  1532. return res;
  1533. }
  1534. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1535. {
  1536. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1537. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  1538. return res;
  1539. }
  1540. //通过投入物料找到垛型编码
  1541. var stackDetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == spool.MatCode && p.IsStop == 0);
  1542. if (stackDetail == null)
  1543. {
  1544. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1545. res.ResMsg = reqDto.SpoolGroup + "没有对应的垛型信息,物料编码" + spool.MatCode;
  1546. return res;
  1547. }
  1548. //获取垛型主表
  1549. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackDetail.BomSetHdrId && p.IsStop == 0);
  1550. var mat = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
  1551. if (mat != null && string.IsNullOrEmpty(matCodes))
  1552. {
  1553. matCodes += mat.Code;
  1554. }
  1555. else if(mat != null && !string.IsNullOrEmpty(matCodes) && !matCodes.Contains(mat.Code))
  1556. {
  1557. matCodes += "," + mat.Code;
  1558. }
  1559. stackHeaderSet.Add(stack);
  1560. }
  1561. //if (stackHeaderSet.GroupBy(x => x.Id).Count() != 1)
  1562. //{
  1563. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1564. // res.ResMsg = "扫描托盘不属于同一个垛型,请手动处理后重新组盘";
  1565. // return res;
  1566. //}
  1567. #endregion
  1568. var stackHeader = stackHeaderSet.First();
  1569. try
  1570. {
  1571. _db.BeginTran();
  1572. #region 删除所有工字轮信息,并创建新信息
  1573. _billInvinitrepository.Delete(x => SpoolNoGroup.Contains(x.ContGrpBarCode));
  1574. _billSpoolTransrepository.Delete(x => SpoolNoGroup.Contains(x.ConBarCode));
  1575. var materiel = _basematerrepository.GetSingle(p => p.Code == stackHeader.ProMaterCode);
  1576. var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "CRZP"); //TODO:1换成满托平库满盘Code
  1577. var barInfoList = new List<BillInvinit>();
  1578. var invNowList = new List<BillInvnow>();
  1579. var invFlowList = new List<BillInvflow>();
  1580. foreach (var spool in reqDto.SpoolGroup)
  1581. {
  1582. var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);
  1583. //工字轮需要用到的托盘类型
  1584. var fJPalletType = FJPalletType.Pallet09;
  1585. if (spool.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;
  1586. var barinfo = InitInvinitInfo(spool, wareHouse, stackHeader, mater, materiel, fJPalletType);
  1587. barInfoList.Add(barinfo);
  1588. //删除因异常导致残留的对应库存信息
  1589. _billInvnowrepository.Delete(x =>
  1590. x.ContGrpBarCode == barinfo.ContGrpBarCode || x.HWBarCode == barinfo.ContGrpBarCode);
  1591. //将条码表映射到库存表
  1592. var invnow = _mapper.Map<BillInvnow>(barinfo);
  1593. invnow.IsTorsChk = true;
  1594. invnow.AddTime = DateTime.Now;
  1595. invnow.InvStateCode = FJInvState.InvEcecState_BuildUp.ToString();
  1596. invnow.ContGrpBarCode = reqDto.TrayCode;
  1597. invnow.Id = IdFactory.NewId();
  1598. invnow.WarehouseId = wareHouse.Id;
  1599. invnow.MatCode = matCodes;
  1600. invnow.Memo = mater.Code;
  1601. invNowList.Add(invnow);
  1602. }
  1603. if (!_billInvinitrepository.InsertRange(barInfoList))
  1604. {
  1605. _db.RollbackTran();
  1606. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1607. res.ResMsg = "重绕满托存储条码信息失败";
  1608. return res;
  1609. }
  1610. if (!_billInvnowrepository.InsertRange(invNowList))
  1611. {
  1612. _db.RollbackTran();
  1613. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1614. res.ResMsg = "重绕满托存储库存信息失败";
  1615. return res;
  1616. }
  1617. //if (!_billInvflow.InsertRange(invFlowList))
  1618. //{
  1619. // _db.RollbackTran();
  1620. // res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  1621. // res.ResMsg = "重绕满托存储库存流水信息失败";
  1622. // return res;
  1623. //}
  1624. //创建入库记录
  1625. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  1626. {
  1627. BusType = FJTaskBusType.重绕满托入库.GetDescription(),
  1628. ContGrpBarCode = reqDto.TrayCode,
  1629. Qty = 1,
  1630. Floor = 1,
  1631. MatCode = "",
  1632. EquCode = "",
  1633. Type = TaskType.EnterDepot,
  1634. DocCode = "",
  1635. WorkBench = "",
  1636. WarehouseCode = wareHouse.Code
  1637. };
  1638. //下发wcs任务 - 分解方法
  1639. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);
  1640. if (taskRes.ResCode != 200)
  1641. {
  1642. _db.RollbackTran();
  1643. res.ResCode = taskRes.ResCode;
  1644. res.ResMsg = taskRes.ResMsg;
  1645. return res;
  1646. }
  1647. _db.CommitTran();
  1648. #endregion
  1649. }
  1650. catch (Exception e)
  1651. {
  1652. _db.RollbackTran();
  1653. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1654. res.ResMsg = e.Message;
  1655. return res;
  1656. }
  1657. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1658. res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
  1659. return res;
  1660. }
  1661. /// <summary>
  1662. /// 创建退料任务
  1663. /// </summary>
  1664. /// <param name="reqDto"></param>
  1665. /// <returns></returns>
  1666. public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto)
  1667. {
  1668. var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };
  1669. var taskMaxNum = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  1670. .First(x => x.Code == "CRBackNum").SContent);
  1671. var taskNum = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1672. .Count(x => x.BusType == FJTaskBusType.帘线退料重绕.GetDescription() && x.Status < TaskStatus.Finish);
  1673. if (taskMaxNum > 0 && taskMaxNum <= taskNum)
  1674. {
  1675. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1676. res.ResMsg = $"任务数量已达{taskNum},请稍后再操作!!!!!!";
  1677. return res;
  1678. }
  1679. var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  1680. .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);
  1681. if (taskInfo != null)
  1682. {
  1683. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1684. res.ResMsg = reqDto.TrayCode + "已有任务,不要重复申请,请联系智能制造人员确认处理!!!!!!";
  1685. return res;
  1686. }
  1687. //托盘
  1688. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);
  1689. if (container == null)
  1690. {
  1691. var insertcon = new BaseContinfo
  1692. {
  1693. ContBarCode = reqDto.TrayCode,
  1694. Name = reqDto.TrayCode,
  1695. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  1696. PrintQty = 1,
  1697. IsStop = 0,
  1698. WarehouseId = 0,
  1699. WeightQty = 0,
  1700. AddWho = "wms",
  1701. AddTime = DateTime.Now
  1702. };
  1703. //新加载具信息
  1704. if (!_baseContinfo.Insert(insertcon))
  1705. {
  1706. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1707. res.ResMsg = "托盘载具初始化失败";
  1708. return res;
  1709. }
  1710. }
  1711. //托盘库存
  1712. var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);
  1713. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())
  1714. {
  1715. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1716. res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";
  1717. return res;
  1718. }
  1719. if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  1720. {
  1721. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1722. res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";
  1723. return res;
  1724. }
  1725. var mac = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.LocCode);
  1726. try
  1727. {
  1728. _db.BeginTran();
  1729. var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "CRTL"); //TODO:1换成退料平库满盘Code
  1730. //创建入库记录
  1731. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  1732. {
  1733. BusType = FJTaskBusType.帘线退料重绕.GetDescription(),
  1734. ContGrpBarCode = reqDto.TrayCode,
  1735. Qty = 1,
  1736. Floor = 1,
  1737. MatCode = "",
  1738. EquCode = mac.Station,
  1739. Type = TaskType.EnterDepot,
  1740. DocCode = "",
  1741. WorkBench = mac.Station, //TODO:是否是AGV站台
  1742. WarehouseCode = wareHouse.Code
  1743. };
  1744. //下发wcs任务 - 分解方法
  1745. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);
  1746. if (taskRes.ResCode != 200)
  1747. {
  1748. _db.RollbackTran();
  1749. res.ResCode = taskRes.ResCode;
  1750. res.ResMsg = taskRes.ResMsg;
  1751. return res;
  1752. }
  1753. _db.CommitTran();
  1754. }
  1755. catch (Exception e)
  1756. {
  1757. _db.RollbackTran();
  1758. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1759. res.ResMsg = e.StackTrace;
  1760. return res;
  1761. }
  1762. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  1763. res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();
  1764. return res;
  1765. }
  1766. public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)
  1767. {
  1768. var res = new SRes();
  1769. return res;
  1770. }
  1771. /// <summary>
  1772. /// 分配分拣库
  1773. /// </summary>
  1774. /// <returns></returns>
  1775. public bool AllocationWarehouseSort(AllocationWarehouseSortRequest reqDto)
  1776. {
  1777. return true;
  1778. }
  1779. /// <summary>
  1780. /// agv状态同步接口
  1781. /// </summary>
  1782. /// <param name="reqDto">请求信息</param>
  1783. /// <returns></returns>
  1784. public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto)
  1785. {
  1786. var res = new AgvCallbackResponse { code = AgvResponseCode.Error, message = "失败" };
  1787. try
  1788. {
  1789. _db.BeginTran();
  1790. //跟据AGVid找到对应的AGV任务
  1791. var agvTask = _agvTaskInfoRepository.AsQueryable().With(SqlWith.RowLock)
  1792. .SplitTable(tabs => tabs.Take(2))
  1793. .First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
  1794. if (agvTask == null)
  1795. {
  1796. _db.RollbackTran();
  1797. res.code = AgvResponseCode.Fail;
  1798. res.message = "未找到对应的AGV任务";
  1799. return res;
  1800. }
  1801. switch (reqDto.method)
  1802. {
  1803. case "applyContinue": //表示请求巷道
  1804. agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
  1805. break;
  1806. case "outbin": //小车退出取货位
  1807. agvTask.AgvStatus = AGVTaskStatus.LeaveGet;
  1808. break;
  1809. case "applySecurity": //表示请求放货或取货
  1810. agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
  1811. break;
  1812. case "applySecurityPut": //表示请求放货或取货
  1813. agvTask.AgvStatus = AGVTaskStatus.PutRequestOrPermission;
  1814. break;
  1815. case "FJend": //任务完成
  1816. agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
  1817. break;
  1818. case "cancel": //取消任务
  1819. if (agvTask.TaskType == AGVTaskType.EnterDepot) agvTask.AgvStatus = AGVTaskStatus.Cancel;
  1820. break;
  1821. }
  1822. //更新agv任务状态
  1823. if (!_agvTaskInfoRepository.UpdateSplitTableModelColumns(x => new WCS_AgvTaskInfo
  1824. {
  1825. AgvStatus = agvTask.AgvStatus
  1826. }, x => x.ID == agvTask.ID && x.AgvID == agvTask.AgvID))
  1827. {
  1828. _db.RollbackTran();
  1829. res.code = AgvResponseCode.Fail;
  1830. res.message = $"agv任务{agvTask.AgvID}更新状态至{agvTask.AgvStatus}失败";
  1831. return res;
  1832. }
  1833. _db.CommitTran();
  1834. res.code = AgvResponseCode.Success;
  1835. res.message = "成功";
  1836. }
  1837. catch (Exception ex)
  1838. {
  1839. _db.RollbackTran();
  1840. res.code = AgvResponseCode.Error;
  1841. res.message = ex.Message;
  1842. }
  1843. return res;
  1844. }
  1845. /// <summary>
  1846. /// 帘线领料出库
  1847. /// </summary>
  1848. /// <param name="reqDto"></param>
  1849. /// <returns></returns>
  1850. public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto)
  1851. {
  1852. var res = new SRes();
  1853. var agvMaxSm = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  1854. .First(x => x.Code == "AGVSendsMaxQuantity").SContent);
  1855. var agvMaxFk = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  1856. .First(x => x.Code == "AGVMaxNumberEmptyRetur").SContent);
  1857. var agvSmNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)
  1858. .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.CallMaterial)
  1859. .SplitTable(x => x.Take(2)).Count();
  1860. var agvFkNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)
  1861. .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.EnterDepot)
  1862. .SplitTable(x => x.Take(2)).Count();
  1863. switch (reqDto.Type)
  1864. {
  1865. case "1":
  1866. if (agvMaxSm <= agvSmNumber)
  1867. {
  1868. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1869. res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";
  1870. return res;
  1871. }
  1872. if (agvMaxFk <= agvFkNumber)
  1873. {
  1874. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1875. res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";
  1876. return res;
  1877. }
  1878. break;
  1879. case "2":
  1880. if (agvMaxFk <= agvFkNumber)
  1881. {
  1882. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1883. res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";
  1884. return res;
  1885. }
  1886. break;
  1887. case "3":
  1888. if (agvMaxSm <= agvSmNumber)
  1889. {
  1890. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  1891. res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";
  1892. return res;
  1893. }
  1894. break;
  1895. }
  1896. if (reqDto.Type == "1" || reqDto.Type == "3")
  1897. {
  1898. var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
  1899. if (doc == null)
  1900. {
  1901. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1902. res.ResMsg = reqDto.BillCode + "工单信息不存在";
  1903. return res;
  1904. }
  1905. //获取机台信息
  1906. var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);
  1907. if (mach == null || string.IsNullOrEmpty(mach.Station))
  1908. {
  1909. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1910. res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";
  1911. return res;
  1912. }
  1913. //找到所有的立库货位
  1914. var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage)
  1915. .Select(x => x.Id).ToList();
  1916. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  1917. .Where(p => p.WorkBench == mach.Station && p.Status < TaskStatus.Finish)
  1918. .SplitTable(tabs => tabs.Take(2));
  1919. if (task != null && task.Any())
  1920. {
  1921. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  1922. res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";
  1923. return res;
  1924. }
  1925. var setGrpCode = reqDto.TypeCode;
  1926. if (setGrpCode.IsNullOrEmpty()) setGrpCode = doc.SetGrpCode;
  1927. //获取所有的立库有货库位信息
  1928. var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  1929. new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })
  1930. .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) && loc.IsStop == 0 &&
  1931. loc.StateNum == FjLocationState.Full &&
  1932. inv.InvStateCode == InvState.InvEcecState_In.ToString() &&
  1933. inv.SetGrpCode == setGrpCode &&
  1934. (!inv.Secondary || inv.ProductTime < DateTime.Now.AddHours(-6)))
  1935. .Where((loc, inv) => inv.IsTorsChk == false)
  1936. .Select((loc, inv) => new
  1937. {
  1938. locId = loc.Id,
  1939. loc.ContGrpBarCode,
  1940. loc.WarehouseId,
  1941. loc.WarehouseCode,
  1942. loc.Code,
  1943. loc.Row,
  1944. loc.Col,
  1945. loc.Layer,
  1946. loc.Depth,
  1947. loc.EditTime,
  1948. inv.MatCode,
  1949. inv.SideNum,
  1950. inv.CLBarCode,
  1951. inv.ProductTime,
  1952. invId = inv.Id
  1953. }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();
  1954. if (!wareCellList.Any())
  1955. {
  1956. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  1957. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription();
  1958. return res;
  1959. }
  1960. var warehouseCodes = new List<string>();
  1961. switch (mach.WarehouseCode)
  1962. {
  1963. case "1N":
  1964. warehouseCodes.AddRange(new List<string> { "1N", "1S", "2N", "2S", "3N", "3S" });
  1965. break;
  1966. case "1S":
  1967. warehouseCodes.AddRange(new List<string> { "1S", "1N", "2S", "2N", "3S", "3N" });
  1968. break;
  1969. case "2N":
  1970. warehouseCodes.AddRange(new List<string> { "2N", "2S", "1N", "1S", "3N", "3S" });
  1971. break;
  1972. case "2S":
  1973. warehouseCodes.AddRange(new List<string> { "2S", "2N", "1S", "1N", "3S", "3N" });
  1974. break;
  1975. case "3N":
  1976. warehouseCodes.AddRange(new List<string> { "3N", "3S", "2N", "2S", "1N", "1S" });
  1977. break;
  1978. case "3S":
  1979. warehouseCodes.AddRange(new List<string> { "3S", "3N", "2S", "2N", "1S", "1N" });
  1980. break;
  1981. }
  1982. var wareCell = wareCellList.OrderBy(x => warehouseCodes.IndexOf(x.WarehouseCode)) //按照优先级排序
  1983. .ThenBy(x => x.ProductTime)
  1984. .FirstOrDefault();
  1985. try
  1986. {
  1987. //获取所有的库存信息
  1988. var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCell.ContGrpBarCode);
  1989. var nowTime = DateTime.Now;
  1990. //创建流水信息
  1991. var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);
  1992. foreach (var invFlow in invFlowList)
  1993. {
  1994. invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  1995. invFlow.AddTime = nowTime;
  1996. invFlow.Id = IdFactory.NewId();
  1997. }
  1998. _db.BeginTran(); //创建事务
  1999. //更新货位信息
  2000. if (!_basewarecellrepository.UpdateModelColumns(
  2001. p => new BaseWarecell { StateNum = FjLocationState.StockOut },
  2002. p => p.Id == wareCell.locId && p.StateNum == FjLocationState.Full))
  2003. {
  2004. _db.RollbackTran();
  2005. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2006. res.ResMsg = $"请重新叫料,{wareCell.Code}货位货物已被其他机台叫走!";
  2007. return res;
  2008. }
  2009. //跟新库存
  2010. _billInvnowrepository.UpdateModelColumns(
  2011. p => new BillInvnow
  2012. {
  2013. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  2014. EditTime = nowTime
  2015. }, p => p.ContGrpBarCode == wareCell.ContGrpBarCode);
  2016. //新建流水
  2017. _billInvflow.InsertRange(invFlowList);
  2018. //添加出库任务
  2019. RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  2020. {
  2021. ContGrpBarCode = wareCell.ContGrpBarCode,
  2022. CellNo = wareCell.Code,
  2023. MatCode = wareCell.MatCode,
  2024. EquCode = "1",
  2025. Floor = 1,
  2026. Device = wareCell.WarehouseCode switch
  2027. {
  2028. "1N" => "SRM1",
  2029. "1S" => "SRM2",
  2030. "2N" => "SRM3",
  2031. "2S" => "SRM4",
  2032. "3N" => "SRM5",
  2033. "3S" => "SRM6",
  2034. _ => "ERROR"
  2035. },
  2036. WorkBench = mach.Station,
  2037. WarehouseCode = wareCell.WarehouseCode,
  2038. BusType = FJTaskBusType.车间叫料,
  2039. LastInteractionPoint = reqDto.Type,
  2040. MesNo = reqDto.ReqId,
  2041. EmptyInventory = mach.NearestWarehouseName.IsNullOrEmpty()
  2042. ? wareCell.WarehouseCode
  2043. : mach.NearestWarehouseName
  2044. });
  2045. _db.CommitTran();
  2046. }
  2047. catch (Exception ex)
  2048. {
  2049. _db.RollbackTran();
  2050. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2051. res.ResMsg = ex.Message;
  2052. }
  2053. }
  2054. else if (reqDto.Type == "2") //单独取空
  2055. {
  2056. //获取对应机台绑定的仓库
  2057. var mach = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.WbCode);
  2058. if (mach == null)
  2059. {
  2060. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2061. res.ResMsg = $"没有对应机台-{reqDto.WbCode}";
  2062. return res;
  2063. }
  2064. var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p =>
  2065. p.WorkBench == mach.Station && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish)
  2066. .SplitTable(tabs => tabs.Take(2));
  2067. if (taskold != null && taskold.Any())
  2068. {
  2069. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2070. res.ResMsg = mach.Station + "站台号存在进行中的单独取空任务任务,不要重复申请";
  2071. return res;
  2072. }
  2073. if (string.IsNullOrEmpty(mach.Station))
  2074. {
  2075. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2076. res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";
  2077. return res;
  2078. }
  2079. //获取对应仓库
  2080. var warehouse = _basewarehouserepository.GetFirst(x => x.Id == mach.WarehouseId);
  2081. if (warehouse == null)
  2082. {
  2083. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2084. res.ResMsg = $"当前机台没有分配对应仓库-{reqDto.WbCode}";
  2085. return res;
  2086. }
  2087. //创建入库任务
  2088. var wcstask = new WCS_TaskInfo
  2089. {
  2090. Type = TaskType.EnterDepot,
  2091. Status = TaskStatus.NewBuild,
  2092. Priority = 0,
  2093. Device = warehouse.Code switch
  2094. {
  2095. "1N" => "SRM1",
  2096. "1S" => "SRM2",
  2097. "2N" => "SRM3",
  2098. "2S" => "SRM4",
  2099. "3N" => "SRM5",
  2100. "3S" => "SRM6",
  2101. _ => "ERROR"
  2102. },
  2103. AddrFrom = reqDto.WbCode,
  2104. AddrTo = warehouse.Code switch
  2105. {
  2106. "1N" => "SRM1",
  2107. "1S" => "SRM2",
  2108. "2N" => "SRM3",
  2109. "2S" => "SRM4",
  2110. "3N" => "SRM5",
  2111. "3S" => "SRM6",
  2112. _ => "ERROR"
  2113. },
  2114. LastInteractionPoint = reqDto.Type,
  2115. BarCode = reqDto.WbCode,
  2116. Floor = 1,
  2117. Length = 1,
  2118. AddTime = DateTime.Now,
  2119. DocID = 0,
  2120. PalletType = 1,
  2121. ProdLine = 1,
  2122. FullQty = 1,
  2123. AddWho = "WMS",
  2124. WarehouseCode = warehouse.Code,
  2125. Enabled = true,
  2126. WorkBench = mach.Station,
  2127. GoodsType = 1,
  2128. BusType = FJTaskBusType.皮盘入库.GetDescription(),
  2129. MatCode = "",
  2130. MaterialCode = mach.NearestWarehouseName.IsNullOrEmpty()
  2131. ? warehouse.Code
  2132. : mach.NearestWarehouseName
  2133. };
  2134. var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);
  2135. try
  2136. {
  2137. var task = _taskrepository.InsertReturnEntity(wcstask);
  2138. wcstaskhis.Id = task.ID;
  2139. _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);
  2140. var taskdetail = new WCS_TaskDtl
  2141. {
  2142. ID = Guid.NewGuid(),
  2143. CurPoint = reqDto.WbCode,
  2144. AddTime = DateTime.Now,
  2145. AddWho = "wms",
  2146. Enabled = true,
  2147. ParentTaskCode = task.ID,
  2148. Desc = "单独返空任务"
  2149. };
  2150. _taskdetailrepository.InsertableSplitTable(taskdetail);
  2151. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2152. }
  2153. catch (Exception ex)
  2154. {
  2155. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  2156. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  2157. _logger.LogInformation("保存任务异常:" + ex);
  2158. return res;
  2159. }
  2160. return res;
  2161. }
  2162. else
  2163. {
  2164. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2165. res.ResMsg = $"位置业务类型-{reqDto.Type}";
  2166. }
  2167. return res;
  2168. }
  2169. /// <summary>
  2170. /// 帘线叫料接口(人工码垛托盘/芯股)
  2171. /// </summary>
  2172. /// <param name="reqDto"></param>
  2173. /// <returns></returns>
  2174. public SRes CurtainProductionStockOut1(CurtainProductionStockOutRequest1 reqDto)
  2175. {
  2176. var res = new SRes();
  2177. var agvMaxSm = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  2178. .First(x => x.Code == "AGVSendsMaxQuantity").SContent);
  2179. var agvMaxFk = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)
  2180. .First(x => x.Code == "AGVMaxNumberEmptyRetur").SContent);
  2181. var agvSmNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)
  2182. .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.CallMaterial)
  2183. .SplitTable(x => x.Take(2)).Count();
  2184. var agvFkNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)
  2185. .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.EnterDepot)
  2186. .SplitTable(x => x.Take(2)).Count();
  2187. switch (reqDto.Type)
  2188. {
  2189. case "1":
  2190. if (agvMaxSm <= agvSmNumber)
  2191. {
  2192. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2193. res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";
  2194. return res;
  2195. }
  2196. if (agvMaxFk <= agvFkNumber)
  2197. {
  2198. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2199. res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";
  2200. return res;
  2201. }
  2202. break;
  2203. case "2":
  2204. if (agvMaxFk <= agvFkNumber)
  2205. {
  2206. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2207. res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";
  2208. return res;
  2209. }
  2210. break;
  2211. case "3":
  2212. if (agvMaxSm <= agvSmNumber)
  2213. {
  2214. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2215. res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";
  2216. return res;
  2217. }
  2218. break;
  2219. }
  2220. if (reqDto.Type == "1" || reqDto.Type == "3")
  2221. {
  2222. var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
  2223. if (doc == null)
  2224. {
  2225. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2226. res.ResMsg = reqDto.BillCode + "工单信息不存在";
  2227. return res;
  2228. }
  2229. //获取机台信息
  2230. var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);
  2231. if (mach == null || string.IsNullOrEmpty(mach.Station))
  2232. {
  2233. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2234. res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";
  2235. return res;
  2236. }
  2237. var warehouse = reqDto.Grade == "A" ? _basewarehouserepository
  2238. .GetList(x =>x.TypeNum == FjLocationType.Storage || x.TypeNum == FjLocationType.Virtual).Select(x => x.Id).ToList() : _basewarehouserepository
  2239. .GetList(x => x.TypeNum == FjLocationType.Pingku).Select(x => x.Id).ToList();
  2240. //判断平库是否有该物料,如有先取平库料
  2241. var sotck1 = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.WarehouseId == 1703346265607246826 && x.MatCode.Contains(reqDto.Materialcodecall) && x.InvStateCode ==
  2242. InvState.InvEcecState_In.ToString()).First();
  2243. if (sotck1 != null && _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x => x.ContGrpBarCode == sotck1.ContGrpBarCode && x.IsStop == 0 && x.StateNum == FjLocationState.Full)
  2244. && reqDto.Grade == "B")
  2245. {
  2246. warehouse = _basewarehouserepository
  2247. .GetList(x => x.TypeNum == FjLocationType.Pingku).Select(x => x.Id).ToList();
  2248. }
  2249. else
  2250. {
  2251. //找到所有的立库/虚拟货位/平库货位
  2252. warehouse = _basewarehouserepository
  2253. .GetList(x =>
  2254. x.TypeNum == FjLocationType.Storage || x.TypeNum == FjLocationType.Virtual
  2255. ).Select(x => x.Id).ToList();
  2256. }
  2257. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  2258. .Where(p => p.WorkBench == mach.Station && p.Status < TaskStatus.Finish)
  2259. .SplitTable(tabs => tabs.Take(2));
  2260. if (task != null && task.Any())
  2261. {
  2262. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2263. res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";
  2264. return res;
  2265. }
  2266. //获取所有的立库/虚拟有货库位信息
  2267. var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  2268. new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })
  2269. .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) && loc.IsStop == 0 &&
  2270. loc.StateNum == FjLocationState.Full &&
  2271. inv.InvStateCode == InvState.InvEcecState_In.ToString() &&
  2272. inv.MatCode.Contains(reqDto.Materialcodecall) &&
  2273. (!inv.Secondary || inv.ProductTime < DateTime.Now.AddHours(-6)))
  2274. .Where((loc, inv) => inv.IsTorsChk == true)
  2275. .Select((loc, inv) => new
  2276. {
  2277. locId = loc.Id,
  2278. loc.ContGrpBarCode,
  2279. loc.WarehouseId,
  2280. loc.WarehouseCode,
  2281. loc.Code,
  2282. loc.Row,
  2283. loc.Col,
  2284. loc.Layer,
  2285. loc.Depth,
  2286. loc.EditTime,
  2287. loc.TypeNum,
  2288. inv.MatCode,
  2289. inv.SideNum,
  2290. inv.CLBarCode,
  2291. inv.ProductTime,
  2292. invId = inv.Id
  2293. }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();
  2294. if (!wareCellList.Any())
  2295. {
  2296. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  2297. res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription();
  2298. return res;
  2299. }
  2300. //var warehouseCodes = new List<string>();
  2301. //switch (mach.WarehouseCode)
  2302. //{
  2303. // case "1N":
  2304. // warehouseCodes.AddRange(new List<string>() { "1N", "1S", "2N", "2S", "3N", "3S" });
  2305. // break;
  2306. // case "1S":
  2307. // warehouseCodes.AddRange(new List<string>() { "1S", "1N", "2S", "2N", "3S", "3N" });
  2308. // break;
  2309. // case "2N":
  2310. // warehouseCodes.AddRange(new List<string>() { "2N", "2S", "1N", "1S", "3N", "3S" });
  2311. // break;
  2312. // case "2S":
  2313. // warehouseCodes.AddRange(new List<string>() { "2S", "2N", "1S", "1N", "3S", "3N" });
  2314. // break;
  2315. // case "3N":
  2316. // warehouseCodes.AddRange(new List<string>() { "3N", "3S", "2N", "2S", "1N", "1S" });
  2317. // break;
  2318. // case "3S":
  2319. // warehouseCodes.AddRange(new List<string>() { "3S", "3N", "2S", "2N", "1S", "1N" });
  2320. // break;
  2321. //}
  2322. var wareCell = wareCellList.OrderBy(x => x.ProductTime).FirstOrDefault(); //按照优先级排序
  2323. try
  2324. {
  2325. //获取所有的库存信息
  2326. var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCell.ContGrpBarCode);
  2327. var nowTime = DateTime.Now;
  2328. //创建流水信息
  2329. var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);
  2330. foreach (var invFlow in invFlowList)
  2331. {
  2332. invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  2333. invFlow.AddTime = nowTime;
  2334. invFlow.Id = IdFactory.NewId();
  2335. }
  2336. _db.BeginTran(); //创建事务
  2337. //更新货位信息
  2338. if (!_basewarecellrepository.UpdateModelColumns(
  2339. p => new BaseWarecell { StateNum = FjLocationState.StockOut },
  2340. p => p.Id == wareCell.locId && p.StateNum == FjLocationState.Full))
  2341. {
  2342. _db.RollbackTran();
  2343. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2344. res.ResMsg = $"请重新叫料,{wareCell.Code}货位货物已被其他机台叫走!";
  2345. return res;
  2346. }
  2347. //更新库存
  2348. _billInvnowrepository.UpdateModelColumns(
  2349. p => new BillInvnow
  2350. {
  2351. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  2352. EditTime = nowTime
  2353. }, p => p.ContGrpBarCode == wareCell.ContGrpBarCode);
  2354. //新建流水
  2355. _billInvflow.InsertRange(invFlowList);
  2356. //添加出库任务
  2357. RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  2358. {
  2359. ContGrpBarCode = wareCell.ContGrpBarCode,
  2360. CellNo = wareCell.Code,
  2361. MatCode = wareCell.MatCode,
  2362. EquCode = wareCell.TypeNum == FjLocationType.Storage ? "1" : wareCell.Code,
  2363. Floor = 1,
  2364. Device = wareCell.WarehouseCode switch
  2365. {
  2366. "1N" => "SRM1",
  2367. "1S" => "SRM2",
  2368. "2N" => "SRM3",
  2369. "2S" => "SRM4",
  2370. "3N" => "SRM5",
  2371. "3S" => "SRM6",
  2372. "CRZP" => "CR",
  2373. _ => wareCell.WarehouseCode
  2374. },
  2375. WorkBench = mach.Station,
  2376. WarehouseCode = wareCell.TypeNum == FjLocationType.Storage
  2377. ? wareCell.WarehouseCode
  2378. : mach.WarehouseCode, //如果是芯股的话就使用叫料机台对应的仓库
  2379. BusType = FJTaskBusType.车间叫料,
  2380. LastInteractionPoint = reqDto.Type,
  2381. MesNo = reqDto.ReqId,
  2382. EmptyInventory = mach.NearestWarehouseName.IsNullOrEmpty()
  2383. ? wareCell.WarehouseCode
  2384. : mach.NearestWarehouseName
  2385. });
  2386. //如果是从芯股虚拟机台叫料的话需要记录芯股组盘机台的送空托需求
  2387. if (wareCell.TypeNum == FjLocationType.Virtual)
  2388. {
  2389. //检查对应芯股支架是否有对应的送空托任务
  2390. var taskList = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  2391. .Where(p => p.WorkBench == wareCell.Code && p.Type == TaskType.OutDepot
  2392. && p.BusType == FJTaskBusType.芯股站台送空托
  2393. .GetDescription()
  2394. && p.Status < TaskStatus.Finish)
  2395. .SplitTable(tabs => tabs.Take(2)).ToList();
  2396. if (taskList != null && taskList.Any())
  2397. {
  2398. _logger.LogInformation(wareCell.Code + "已有执行中的空托输送任务,不要重复申请");
  2399. }
  2400. else
  2401. {
  2402. //检查是否有对应配置信息
  2403. var sysConfig =
  2404. _sysconfigrepository.GetFirst(x => x.Code == $"{wareCell.Code}-EmptyPallet");
  2405. if (sysConfig == null)
  2406. {
  2407. sysConfig = new fjSysConfig
  2408. {
  2409. Code = $"{wareCell.Code}-EmptyPallet",
  2410. Name = $"芯股支架补空托-{wareCell.Code}",
  2411. SContent = "0",
  2412. SType = "1",
  2413. AddWho = "WMS",
  2414. EditWho = "WMS",
  2415. Default1 = "1",
  2416. Default2 = "2",
  2417. Default3 = "3",
  2418. Memo = "值为0表示不需要补充空托,1表示有空托需求"
  2419. };
  2420. _sysconfigrepository.Insert(sysConfig);
  2421. sysConfig = _sysconfigrepository.GetFirst(x =>
  2422. x.Code == $"{wareCell.Code}-EmptyPallet");
  2423. }
  2424. //检查当前站台是否已经有空托需求,无的话改为需要空托盘
  2425. if (sysConfig.SContent == "0")
  2426. //更新库存
  2427. _sysconfigrepository.UpdateModelColumns(
  2428. p => new fjSysConfig
  2429. {
  2430. SContent = "1",
  2431. EditTime = nowTime
  2432. }, p => p.Id == sysConfig.Id);
  2433. }
  2434. }
  2435. _db.CommitTran();
  2436. }
  2437. catch (Exception ex)
  2438. {
  2439. _db.RollbackTran();
  2440. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2441. res.ResMsg = ex.Message;
  2442. }
  2443. }
  2444. else if (reqDto.Type == "2") //单独取空
  2445. {
  2446. //获取对应机台绑定的仓库
  2447. var mach = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.WbCode);
  2448. if (mach == null)
  2449. {
  2450. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2451. res.ResMsg = $"没有对应机台-{reqDto.WbCode}";
  2452. return res;
  2453. }
  2454. var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p =>
  2455. p.WorkBench == mach.Station && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish)
  2456. .SplitTable(tabs => tabs.Take(2));
  2457. if (taskold != null && taskold.Any())
  2458. {
  2459. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2460. res.ResMsg = mach.Station + "站台号存在进行中的单独取空任务任务,不要重复申请";
  2461. return res;
  2462. }
  2463. if (string.IsNullOrEmpty(mach.Station))
  2464. {
  2465. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2466. res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";
  2467. return res;
  2468. }
  2469. //获取对应仓库
  2470. var warehouse = _basewarehouserepository.GetFirst(x => x.Id == mach.WarehouseId);
  2471. if (warehouse == null)
  2472. {
  2473. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2474. res.ResMsg = $"当前机台没有分配对应仓库-{reqDto.WbCode}";
  2475. return res;
  2476. }
  2477. //创建入库任务
  2478. var wcstask = new WCS_TaskInfo
  2479. {
  2480. Type = TaskType.EnterDepot,
  2481. Status = TaskStatus.NewBuild,
  2482. Priority = 0,
  2483. Device = warehouse.Code switch
  2484. {
  2485. "1N" => "SRM1",
  2486. "1S" => "SRM2",
  2487. "2N" => "SRM3",
  2488. "2S" => "SRM4",
  2489. "3N" => "SRM5",
  2490. "3S" => "SRM6",
  2491. _ => "ERROR"
  2492. },
  2493. AddrFrom = reqDto.WbCode,
  2494. AddrTo = warehouse.Code switch
  2495. {
  2496. "1N" => "SRM1",
  2497. "1S" => "SRM2",
  2498. "2N" => "SRM3",
  2499. "2S" => "SRM4",
  2500. "3N" => "SRM5",
  2501. "3S" => "SRM6",
  2502. _ => "ERROR"
  2503. },
  2504. LastInteractionPoint = reqDto.Type,
  2505. BarCode = reqDto.WbCode,
  2506. Floor = 1,
  2507. Length = 1,
  2508. AddTime = DateTime.Now,
  2509. DocID = 0,
  2510. PalletType = 1,
  2511. ProdLine = 1,
  2512. FullQty = 1,
  2513. AddWho = "WMS",
  2514. WarehouseCode = warehouse.Code,
  2515. Enabled = true,
  2516. WorkBench = mach.Station,
  2517. GoodsType = 1,
  2518. BusType = FJTaskBusType.皮盘入库.GetDescription(),
  2519. MatCode = "",
  2520. MaterialCode = mach.NearestWarehouseName.IsNullOrEmpty()
  2521. ? warehouse.Code
  2522. : mach.NearestWarehouseName
  2523. };
  2524. var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);
  2525. try
  2526. {
  2527. var task = _taskrepository.InsertReturnEntity(wcstask);
  2528. wcstaskhis.Id = task.ID;
  2529. _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);
  2530. var taskdetail = new WCS_TaskDtl
  2531. {
  2532. ID = Guid.NewGuid(),
  2533. CurPoint = reqDto.WbCode,
  2534. AddTime = DateTime.Now,
  2535. AddWho = "wms",
  2536. Enabled = true,
  2537. ParentTaskCode = task.ID,
  2538. Desc = "单独返空任务"
  2539. };
  2540. _taskdetailrepository.InsertableSplitTable(taskdetail);
  2541. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2542. }
  2543. catch (Exception ex)
  2544. {
  2545. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  2546. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  2547. _logger.LogInformation("保存任务异常:" + ex);
  2548. return res;
  2549. }
  2550. return res;
  2551. }
  2552. else
  2553. {
  2554. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2555. res.ResMsg = $"位置业务类型-{reqDto.Type}";
  2556. }
  2557. return res;
  2558. }
  2559. /// <summary>
  2560. /// 帘线手动领料出库
  2561. /// </summary>
  2562. /// <param name="reqDto"></param>
  2563. /// <returns></returns>
  2564. public SRes ManualCurtainProductionStockOut(ManualCurtainProductionStockOut reqDto)
  2565. {
  2566. var res = new SRes();
  2567. //获取机台信息
  2568. var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);
  2569. if (mach == null || string.IsNullOrEmpty(mach.Station))
  2570. {
  2571. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2572. res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";
  2573. return res;
  2574. }
  2575. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  2576. .Where(p => p.AddrTo == mach.Station && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2));
  2577. if (task != null && task.Any())
  2578. {
  2579. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  2580. res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";
  2581. return res;
  2582. }
  2583. //货位信息验证
  2584. var location =
  2585. _basewarecellrepository.GetSingle(p => p.Code == reqDto.cellCode && p.WarehouseCode == reqDto.wareCode);
  2586. if (location == null)
  2587. {
  2588. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  2589. res.ResMsg = reqDto.cellCode + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  2590. return res;
  2591. }
  2592. if (location.StateNum != FjLocationState.Full)
  2593. {
  2594. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2595. res.ResMsg = reqDto.cellCode + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件";
  2596. return res;
  2597. }
  2598. if (location.IsStop == 1)
  2599. {
  2600. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2601. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + reqDto.cellCode + "被禁用";
  2602. return res;
  2603. }
  2604. //库存信息验证
  2605. var stock = _billInvnowrepository.GetFirst(p =>
  2606. p.ContGrpBarCode == location.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  2607. if (stock == null)
  2608. {
  2609. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  2610. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  2611. return res;
  2612. }
  2613. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  2614. {
  2615. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2616. res.ResMsg = reqDto.cellCode + "组盘状态不是已入库";
  2617. return res;
  2618. }
  2619. try
  2620. {
  2621. //获取所有的库存信息
  2622. var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == location.ContGrpBarCode);
  2623. var nowTime = DateTime.Now;
  2624. //创建流水信息
  2625. var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);
  2626. foreach (var invFlow in invFlowList)
  2627. {
  2628. invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  2629. invFlow.AddTime = nowTime;
  2630. invFlow.Id = IdFactory.NewId();
  2631. }
  2632. _db.BeginTran(); //创建事务
  2633. //更新货位信息
  2634. if (!_basewarecellrepository.UpdateModelColumns(
  2635. p => new BaseWarecell { StateNum = FjLocationState.StockOut },
  2636. p => p.Id == location.Id && p.StateNum == FjLocationState.Full))
  2637. {
  2638. _db.RollbackTran();
  2639. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2640. res.ResMsg = $"请重新叫料,{location.Code}货位货物已被其他机台叫走!";
  2641. return res;
  2642. }
  2643. //跟新库存
  2644. _billInvnowrepository.UpdateModelColumns(
  2645. p => new BillInvnow
  2646. {
  2647. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  2648. EditTime = nowTime
  2649. }, p => p.ContGrpBarCode == location.ContGrpBarCode);
  2650. //新建流水
  2651. _billInvflow.InsertRange(invFlowList);
  2652. //添加出库任务
  2653. RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  2654. {
  2655. ContGrpBarCode = location.ContGrpBarCode,
  2656. CellNo = location.Code,
  2657. MatCode = stock.MatCode,
  2658. EquCode = "1",
  2659. Floor = 1,
  2660. Device = location.WarehouseCode switch
  2661. {
  2662. "1N" => "SRM1",
  2663. "1S" => "SRM2",
  2664. "2N" => "SRM3",
  2665. "2S" => "SRM4",
  2666. "3N" => "SRM5",
  2667. "3S" => "SRM6",
  2668. _ => "ERROR"
  2669. },
  2670. WorkBench = mach.Station,
  2671. WarehouseCode = location.WarehouseCode,
  2672. BusType = FJTaskBusType.车间手动叫料
  2673. });
  2674. _db.CommitTran();
  2675. }
  2676. catch (Exception ex)
  2677. {
  2678. _db.RollbackTran();
  2679. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2680. res.ResMsg = ex.Message;
  2681. }
  2682. return res;
  2683. }
  2684. public SRes ProductionBack(FjProductionBackRequest reqDto)
  2685. {
  2686. var res = new SRes();
  2687. return res;
  2688. }
  2689. /// <summary>
  2690. /// 变更流向
  2691. /// </summary>
  2692. /// <param name="reqDto"></param>
  2693. /// <returns></returns>
  2694. public SRes EditorialFlow(FjEditorialFlowRequest reqDto)
  2695. {
  2696. var res = new SRes();
  2697. //获取对应任务信息
  2698. var taskInfo = _wcstaskoldrepository.AsQueryable().Where(x => x.Id == reqDto.TaskId)
  2699. .SplitTable(tabs => tabs.Take(2)).First();
  2700. if (taskInfo == null)
  2701. {
  2702. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2703. res.ResMsg = $"不存在任务{reqDto.TaskId}";
  2704. return res;
  2705. }
  2706. if (taskInfo.Status > TaskStatus.WaitingToExecute)
  2707. {
  2708. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2709. res.ResMsg = $"任务状态大于待执行{reqDto.TaskId}";
  2710. return res;
  2711. }
  2712. //库存
  2713. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == taskInfo.BarCode);
  2714. if (stock != null)
  2715. {
  2716. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2717. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  2718. return res;
  2719. }
  2720. //仓库
  2721. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode);
  2722. if (stock != null)
  2723. {
  2724. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2725. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  2726. return res;
  2727. }
  2728. #region 变更仓库信息
  2729. try
  2730. {
  2731. _db.BeginTran();
  2732. //变更码垛信息所属仓库
  2733. _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
  2734. {
  2735. WarehouseCode = reqDto.WareCode,
  2736. WarehouseSort = int.Parse(reqDto.WareCode.Substring(0, 1)),
  2737. EditTime = DateTime.Now
  2738. }, p => p.ConBarCode == taskInfo.BarCode);
  2739. //变更条码所属仓库信息
  2740. _billInvinitrepository.UpdateModelColumns(x => new BillInvinit
  2741. {
  2742. WarehouseId = warehouse.Id
  2743. }, x => x.ContGrpBarCode == taskInfo.BarCode);
  2744. _db.CommitTran();
  2745. }
  2746. catch (Exception e)
  2747. {
  2748. _db.RollbackTran();
  2749. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2750. res.ResMsg = e.StackTrace;
  2751. }
  2752. #endregion
  2753. return res;
  2754. }
  2755. public SRes ProductionLeftFeedBack(string doccode)
  2756. {
  2757. var res = new SRes();
  2758. return res;
  2759. }
  2760. public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto)
  2761. {
  2762. var res = new SRes();
  2763. return res;
  2764. }
  2765. public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto)
  2766. {
  2767. var res = new SRes();
  2768. return res;
  2769. }
  2770. public SRes StockChange(FjStockChangeRequest reqDto)
  2771. {
  2772. var res = new SRes();
  2773. return res;
  2774. }
  2775. public SRes BomInfoTrans(BomInfoTransRequest reqDto)
  2776. {
  2777. var res = new SRes();
  2778. return res;
  2779. }
  2780. public SRes FJ1NorthAutoGenerateLocation()
  2781. {
  2782. var res = new SRes();
  2783. var BaseWarearea = new BaseWarehouse
  2784. {
  2785. Id = IdFactory.NewId(),
  2786. IsStop = 0,
  2787. Code = "1N",
  2788. Name = "分拣库1北",
  2789. AddTime = DateTime.Now,
  2790. AddWho = "admin",
  2791. EditTime = DateTime.Now,
  2792. EditWho = "admin",
  2793. TypeNum = FjLocationType.Storage
  2794. };
  2795. var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);
  2796. var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();
  2797. var shelfcode = "";
  2798. var list = new List<BaseWarecell>();
  2799. var codes = new List<string>();
  2800. for (var row = 1; row <= 2; row++) //行
  2801. {
  2802. var tunnel = 1;
  2803. //12行 48列9层
  2804. for (var layer = 1; layer <= 10; layer++) //层
  2805. for (var col = 1; col <= 10; col++) //列
  2806. {
  2807. var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +
  2808. layer.ToString().PadLeft(2, '0') + "-" + tunnel;
  2809. codes.Add(code);
  2810. var name = row + "行" + col + "列" + layer + "层";
  2811. list.Add(new BaseWarecell
  2812. {
  2813. Id = IdFactory.NewId(),
  2814. WarehouseId = baseWareareaEntity.Id,
  2815. WareAreaId = 1669154208777113600,
  2816. IsStop = 0,
  2817. Code = code,
  2818. Name = name,
  2819. StateNum = FjLocationState.Empty,
  2820. TypeNum = FjLocationType.Storage,
  2821. Size = 1,
  2822. Shelf = tunnel + shelfcode,
  2823. WarehouseCode = BaseWarearea.Code,
  2824. Row = row,
  2825. Col = col,
  2826. Layer = layer,
  2827. Depth = 1,
  2828. Tunnel = tunnel,
  2829. SCRel = "SRM" + tunnel.ToString().PadLeft(2, '0'),
  2830. ContGrpId = 0,
  2831. ContGrpBarCode = "",
  2832. Memo = "",
  2833. AddWho = "admin",
  2834. AddTime = DateTime.Now,
  2835. EditWho = "admin",
  2836. EditTime = DateTime.Now
  2837. });
  2838. }
  2839. }
  2840. _basewarecellrepository.InsertRange(list);
  2841. return res;
  2842. }
  2843. public SRes FJSouthAutoGenerateLocation()
  2844. {
  2845. var res = new SRes();
  2846. var BaseWarearea = new BaseWarehouse
  2847. {
  2848. Id = IdFactory.NewId(),
  2849. IsStop = 0,
  2850. Code = "1S",
  2851. Name = "分拣库1南",
  2852. AddTime = DateTime.Now,
  2853. AddWho = "admin",
  2854. EditTime = DateTime.Now,
  2855. EditWho = "admin",
  2856. TypeNum = FjLocationType.Storage
  2857. };
  2858. var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);
  2859. var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();
  2860. var shelfcode = "";
  2861. var list = new List<BaseWarecell>();
  2862. var codes = new List<string>();
  2863. for (var row = 1; row <= 2; row++) //行
  2864. {
  2865. var tunnel = 1;
  2866. //12行 48列9层
  2867. for (var layer = 1; layer <= 10; layer++) //层
  2868. for (var col = 11; col <= 20; col++) //列
  2869. {
  2870. var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +
  2871. layer.ToString().PadLeft(2, '0') + "-" + tunnel;
  2872. codes.Add(code);
  2873. var name = row + "行" + col + "列" + layer + "层";
  2874. list.Add(new BaseWarecell
  2875. {
  2876. Id = IdFactory.NewId(),
  2877. WarehouseId = baseWareareaEntity.Id,
  2878. WareAreaId = 1669154208777113600,
  2879. IsStop = 0,
  2880. Code = code,
  2881. Name = name,
  2882. StateNum = FjLocationState.Empty,
  2883. TypeNum = FjLocationType.Storage,
  2884. Size = 1,
  2885. Shelf = tunnel + shelfcode,
  2886. WarehouseCode = BaseWarearea.Code,
  2887. Row = row,
  2888. Col = col,
  2889. Layer = layer,
  2890. Depth = 1,
  2891. Tunnel = tunnel,
  2892. SCRel = "SRM" + 2,
  2893. ContGrpId = 0,
  2894. ContGrpBarCode = "",
  2895. Memo = "",
  2896. AddWho = "admin",
  2897. AddTime = DateTime.Now,
  2898. EditWho = "admin",
  2899. EditTime = DateTime.Now
  2900. });
  2901. }
  2902. }
  2903. _basewarecellrepository.InsertRange(list);
  2904. return res;
  2905. }
  2906. /// <summary>
  2907. /// 获取垛型数组
  2908. /// </summary>
  2909. /// <param name="req"></param>
  2910. /// <returns></returns>
  2911. public SRes<List<BillBomsetgrp>> FjGetSetGrpList(FjGetSetGrpListRequest req)
  2912. {
  2913. var res = new SRes<List<BillBomsetgrp>>();
  2914. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  2915. res.ResMsg = "失败";
  2916. var setGrps = _BillBomsetgrpRepository.GetList(x => x.ProMaterCode == req.OutMaterialCode && x.IsStop == 0);
  2917. if (req.ListmatInfo.Any(v => v == "null"))
  2918. {
  2919. res.ResMsg = "请重新打开界面";
  2920. return res;
  2921. }
  2922. foreach (var setGrpList in req.ListmatInfo.Select(info =>
  2923. _BillBomsetgrpRepository.GetList(x =>
  2924. (x.BomCode == info || x.BomCode.Contains(info)) && x.IsStop == 0)))
  2925. setGrps.AddRange(setGrpList);
  2926. setGrps = setGrps.DistinctBy(x => x.Id).ToList();
  2927. if (setGrps != null && setGrps.Any())
  2928. {
  2929. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  2930. res.ResMsg = "成功";
  2931. res.Listinfo = setGrps;
  2932. return res;
  2933. }
  2934. res.ResMsg = $"{req}没有对应启用垛型";
  2935. return res;
  2936. }
  2937. /// <summary>
  2938. /// 分拣南环形库自动生成库位
  2939. /// </summary>
  2940. /// <returns></returns>
  2941. public SRes RingLibraryAutoGenerateLocation(string WareCode)
  2942. {
  2943. var res = new SRes();
  2944. var wareHouse = _basewarehouserepository.GetSingle(x => x.Code == WareCode);
  2945. var list = new List<BaseWarecell>();
  2946. var codes = new List<string>();
  2947. for (var row = 1; row <= 3; row++) //3行
  2948. for (var layer = 1; layer <= 7; layer++) //7层
  2949. for (var col = 1; col <= 17; col++) //17列
  2950. {
  2951. //行列层深度
  2952. var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +
  2953. layer.ToString().PadLeft(2, '0') + "-" + row.ToString().PadLeft(2, '0');
  2954. codes.Add(code);
  2955. var name = row + "行" + col + "列" + layer + "层" + row + "深";
  2956. list.Add(new BaseWarecell
  2957. {
  2958. Id = IdFactory.NewId(),
  2959. WarehouseId = wareHouse.Id,
  2960. WareAreaId = 1669154208777113600,
  2961. IsStop = 0,
  2962. Code = code,
  2963. Name = name,
  2964. StateNum = FjLocationState.Empty,
  2965. TypeNum = FjLocationType.RingLibrary,
  2966. Size = 1,
  2967. Shelf = "1",
  2968. WarehouseCode = wareHouse.Code,
  2969. Row = row,
  2970. Col = col,
  2971. Layer = layer,
  2972. Depth = row,
  2973. SCRel = "Robot" + 2,
  2974. ContGrpId = 0,
  2975. ContGrpBarCode = "",
  2976. Memo = "",
  2977. AddWho = "admin",
  2978. AddTime = DateTime.Now,
  2979. EditWho = "admin",
  2980. EditTime = DateTime.Now
  2981. });
  2982. }
  2983. _basewarecellrepository.InsertRange(list);
  2984. return res;
  2985. }
  2986. /// <summary>
  2987. /// 实时库存查询接口
  2988. /// </summary>
  2989. /// <param name="reqDto"></param>
  2990. /// <returns></returns>
  2991. public GetFJCurStockListResponse GetCurStockList(GetFJCurStockListRequest reqDto)
  2992. {
  2993. var res = new GetFJCurStockListResponse
  2994. {
  2995. ResData = new List<FJResDataItem>()
  2996. };
  2997. var totalCount = 0;
  2998. var list = _billInvnowrepository.Context.Queryable<BillInvnow>()
  2999. .Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString())
  3000. .WhereIF(!string.IsNullOrEmpty(reqDto.MatCode), p => p.MatCode.Contains(reqDto.MatCode))
  3001. .WhereIF(!string.IsNullOrEmpty(reqDto.MatName), p => p.MatName.Contains(reqDto.MatName))
  3002. .ToPageList(reqDto.PageIndex, reqDto.PageSize, ref totalCount)
  3003. .Select(p => new FJResDataItem
  3004. {
  3005. MatCode = p.MatCode,
  3006. MatName = p.MatName,
  3007. MatBarCode = p.CLBarCode,
  3008. Describe = "",
  3009. LocCell = p.PutCol.ToString(),
  3010. LocLayer = p.PutLayer.ToString(),
  3011. LocRow = p.PutRow.ToString(),
  3012. LocCode = p.PutRow + p.PutCol.ToString() + p.PutLayer,
  3013. ConBarCode = p.ContGrpBarCode,
  3014. HWBarCode = p.HWBarCode,
  3015. UpdatedTime = p.EditTime
  3016. }
  3017. );
  3018. res.TotalCount = totalCount;
  3019. res.ResData = list.ToList();
  3020. return res;
  3021. }
  3022. /// <summary>
  3023. /// 创建芯股用空托入库任务
  3024. /// </summary>
  3025. /// <returns></returns>
  3026. public void CreateCoreStrandEmptyPalletEnterWarehouse()
  3027. {
  3028. //查询配置最大库存数量
  3029. var sycon = _sysconfigrepository.GetList(x => x.Code.Contains("CoreStrandEmptyPalletMaxNumber"));
  3030. foreach (var config in sycon)
  3031. {
  3032. //获取仓库编号
  3033. var warehouseCode = config.Code.Split("-")[1];
  3034. var warehouse = _basewarehouserepository.GetFirst(x => x.Code == warehouseCode);
  3035. if (warehouse == null)
  3036. {
  3037. _logger.LogInformation($"找不到仓库{warehouse}");
  3038. return;
  3039. }
  3040. //判断对应仓库中是否存在指定缓存数量的空托盘
  3041. var invnowCount = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  3042. x.ContGrpType == FJContGrpType.EmptyPal && x.InvStateCode == InvState.InvEcecState_In.ToString() &&
  3043. x.WarehouseId == warehouse.Id);
  3044. //获取正在执行中的任务
  3045. var taskInfoCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>
  3046. x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.芯股用空托盘入库.GetDescription() &&
  3047. x.WarehouseCode == warehouse.Code);
  3048. //创建对应任务
  3049. var maxNumber = Convert.ToInt32(config.SContent);
  3050. var now = invnowCount + taskInfoCount;
  3051. if (now < maxNumber) //已有任务数量和库存数量小于最大缓存数量
  3052. {
  3053. _db.BeginTran();
  3054. //开始生成WCS
  3055. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  3056. {
  3057. BusType = FJTaskBusType.芯股用空托盘入库.GetDescription(),
  3058. Qty = 1,
  3059. WarehouseCode = warehouse.Code,
  3060. Floor = 2,
  3061. MatCode = "",
  3062. EquCode = "",
  3063. Type = TaskType.EnterDepot,
  3064. DocCode = "",
  3065. WorkBench = ""
  3066. };
  3067. createStockInWcsTaskReqest.ContGrpBarCode = $"{createStockInWcsTaskReqest.BusType}-{warehouseCode}";
  3068. //下发wcs任务 - 分解方法
  3069. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);
  3070. if (taskRes.ResCode != 200)
  3071. {
  3072. _db.RollbackTran();
  3073. _logger.LogInformation($"{taskRes.ResMsg}");
  3074. }
  3075. _db.CommitTran();
  3076. }
  3077. }
  3078. }
  3079. /// <summary>
  3080. /// 创建芯股站台用的空托出库任务
  3081. /// </summary>
  3082. /// <returns></returns>
  3083. public SRes CoreStrandSupportReplenishEmptyPallet()
  3084. {
  3085. var res = new SRes
  3086. {
  3087. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  3088. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  3089. };
  3090. //芯股支架补空托,获取需要空托的支架
  3091. var sycon = _sysconfigrepository.GetList(x =>
  3092. x.Code.Contains("EmptyPallet") && x.Name.Contains("芯股支架补空托") && x.SContent == "1");
  3093. var isEnd = false;
  3094. foreach (var config in sycon)
  3095. {
  3096. if (isEnd) continue;
  3097. //获取仓库编号
  3098. var wareCellCode = config.Code.Split("-")[0];
  3099. var wareCell = _basewarecellrepository.GetFirst(x => x.Code == wareCellCode);
  3100. if (wareCell == null)
  3101. {
  3102. _logger.LogInformation($"找不到货位{wareCellCode}");
  3103. continue;
  3104. }
  3105. var taskInfo = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  3106. .Where(p => p.WorkBench == wareCell.Code && p.Type == TaskType.OutDepot
  3107. && p.BusType == FJTaskBusType.芯股站台送空托.GetDescription()
  3108. && p.Status < TaskStatus.Finish)
  3109. .SplitTable(tabs => tabs.Take(2)).First();
  3110. if (taskInfo != null)
  3111. {
  3112. _logger.LogInformation(wareCell.Code + "已有执行中的空托输送任务,不要重复申请");
  3113. continue;
  3114. }
  3115. //找到所有的立库货位
  3116. var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage)
  3117. .Select(x => x.Id).ToList();
  3118. //获取所有的立库有货库位信息
  3119. var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  3120. new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })
  3121. .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) && loc.IsStop == 0 &&
  3122. loc.StateNum == FjLocationState.Full &&
  3123. inv.InvStateCode == InvState.InvEcecState_In.ToString())
  3124. .Where((loc, inv) => inv.ContGrpType == FJContGrpType.EmptyPal)
  3125. .Select((loc, inv) => new
  3126. {
  3127. locId = loc.Id,
  3128. loc.ContGrpBarCode,
  3129. loc.WarehouseId,
  3130. loc.WarehouseCode,
  3131. loc.Code,
  3132. loc.Row,
  3133. loc.Col,
  3134. loc.Layer,
  3135. loc.Depth,
  3136. loc.EditTime,
  3137. loc.TypeNum,
  3138. inv.MatCode,
  3139. inv.SideNum,
  3140. inv.CLBarCode,
  3141. inv.OneInTime,
  3142. invId = inv.Id
  3143. }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();
  3144. if (!wareCellList.Any())
  3145. {
  3146. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  3147. res.ResMsg = "没有可用空托盘";
  3148. isEnd = true;
  3149. continue;
  3150. }
  3151. //TODO:暂时不按照芯股支架的位置进行空托盘的出库
  3152. var wareCellInfo = wareCellList.OrderBy(x => x.OneInTime).First();
  3153. //获取所有的库存信息
  3154. var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCellInfo.ContGrpBarCode);
  3155. var nowTime = DateTime.Now;
  3156. //创建流水信息
  3157. var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);
  3158. foreach (var invFlow in invFlowList)
  3159. {
  3160. invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  3161. invFlow.AddTime = nowTime;
  3162. invFlow.Id = IdFactory.NewId();
  3163. }
  3164. _db.BeginTran(); //创建事务
  3165. //更新货位信息
  3166. if (!_basewarecellrepository.UpdateModelColumns(
  3167. p => new BaseWarecell { StateNum = FjLocationState.StockOut },
  3168. p => p.Id == wareCellInfo.locId && p.StateNum == FjLocationState.Full))
  3169. {
  3170. _db.RollbackTran();
  3171. _logger.LogInformation($"请重新叫料,{wareCellInfo.Code}货位货物已被其他机台叫走!");
  3172. continue;
  3173. }
  3174. //更新库存
  3175. _billInvnowrepository.UpdateModelColumns(
  3176. p => new BillInvnow
  3177. {
  3178. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  3179. EditTime = nowTime
  3180. }, p => p.ContGrpBarCode == wareCellInfo.ContGrpBarCode);
  3181. //新建流水
  3182. _billInvflow.InsertRange(invFlowList);
  3183. //添加出库任务
  3184. RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  3185. {
  3186. ContGrpBarCode = wareCellInfo.ContGrpBarCode,
  3187. CellNo = wareCellInfo.Code,
  3188. MatCode = wareCellInfo.MatCode,
  3189. EquCode = wareCellInfo.TypeNum == FjLocationType.Storage ? "1" : wareCellInfo.Code,
  3190. Floor = 1,
  3191. Device = wareCellInfo.WarehouseCode switch
  3192. {
  3193. "1N" => "SRM1",
  3194. "1S" => "SRM2",
  3195. "2N" => "SRM3",
  3196. "2S" => "SRM4",
  3197. "3N" => "SRM5",
  3198. "3S" => "SRM6",
  3199. _ => wareCellInfo.WarehouseCode
  3200. },
  3201. WorkBench = wareCell.Code,
  3202. WarehouseCode = wareCellInfo.WarehouseCode, //如果是芯股的话就使用叫料机台对应的仓库
  3203. BusType = FJTaskBusType.芯股站台送空托,
  3204. LastInteractionPoint = "1"
  3205. });
  3206. _sysconfigrepository.UpdateModelColumns(
  3207. p => new fjSysConfig
  3208. {
  3209. SContent = "0",
  3210. EditTime = nowTime
  3211. }, p => p.Id == config.Id);
  3212. _db.CommitTran();
  3213. isEnd = true;
  3214. }
  3215. return res;
  3216. }
  3217. /// <summary>
  3218. /// 二次扫码分配输送地址
  3219. /// </summary>
  3220. /// <param name="reqDto"></param>
  3221. /// <returns></returns>
  3222. public SRes AllocationConveyorSort(AllocationConveyorSortRequest reqDto)
  3223. {
  3224. var res = new SRes();
  3225. var baritem = _billSpoolTransrepository.GetFirst(p => p.ConBarCode == reqDto.BarCode);
  3226. //判断当前库是否有mix垛型
  3227. //var mixrow = _billBomsetinfoRepository.AsQueryable().Where(p => p.IsMixRow == 1 && p.WarehouseCode == baritem.WarehouseCode);
  3228. //if (mixrow == null || !mixrow.Any())
  3229. //{
  3230. // var matcodelist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode);
  3231. // var curmatrate = matcodelist.Where(p => p.MatCode == baritem.MatCode).Count() / matcodelist.Count();
  3232. // //需要的总量
  3233. //}
  3234. //else
  3235. //{
  3236. //}
  3237. //var translist = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode).ToList();
  3238. //foreach (var item in translist.GroupBy(p => p.ConveyorSort))
  3239. //{
  3240. //}
  3241. return res;
  3242. }
  3243. #region 初始化仓储
  3244. private Repository<fjSysConfig> _sysconfigrepository => new Repository<fjSysConfig>();
  3245. /// <summary>
  3246. /// 容器表
  3247. /// </summary>
  3248. private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();
  3249. /// <summary>
  3250. /// 环形库码垛缓存信息
  3251. /// </summary>
  3252. private Repository<BillRingPalletizingInfo> _billRingPalletizingInfo =>
  3253. new Repository<BillRingPalletizingInfo>();
  3254. /// <summary>
  3255. /// 当前任务表
  3256. /// </summary>
  3257. private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();
  3258. /// <summary>
  3259. /// 库存表
  3260. /// </summary>
  3261. private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();
  3262. /// <summary>
  3263. /// 条码表
  3264. /// </summary>
  3265. private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();
  3266. /// <summary>
  3267. /// 物料表
  3268. /// </summary>
  3269. private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();
  3270. /// <summary>
  3271. /// 码垛工字轮信息
  3272. /// </summary>
  3273. private Repository<BillSpoolTrans> _billSpoolTransrepository => new Repository<BillSpoolTrans>();
  3274. /// <summary>
  3275. /// 异常信息
  3276. /// </summary>
  3277. private RepositoryTask<BaseErrorInfo> _baseErrorInfoRepository => new RepositoryTask<BaseErrorInfo>();
  3278. private Repository<BillBominfo> _billBominfoRepository => new Repository<BillBominfo>();
  3279. /// <summary>
  3280. /// 垛形主表
  3281. /// </summary>
  3282. private Repository<BillBomsetgrp> _BillBomsetgrpRepository => new Repository<BillBomsetgrp>();
  3283. /// <summary>
  3284. /// 垛形信息
  3285. /// </summary>
  3286. private Repository<BillBomsetinfo> _billBomsetinfoRepository => new Repository<BillBomsetinfo>();
  3287. /// <summary>
  3288. /// 单据表
  3289. /// </summary>
  3290. private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();
  3291. /// <summary>
  3292. /// 任务历史表
  3293. /// </summary>
  3294. private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();
  3295. /// <summary>
  3296. /// agv任务表
  3297. /// </summary>
  3298. private RepositoryTask<WCS_AgvTaskInfo> _agvTaskInfoRepository => new RepositoryTask<WCS_AgvTaskInfo>();
  3299. /// <summary>
  3300. /// 流水表
  3301. /// </summary>
  3302. private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();
  3303. /// <summary>
  3304. /// 甲方管理系统推送反馈
  3305. /// </summary>
  3306. private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();
  3307. /// <summary>
  3308. /// 货位表
  3309. /// </summary>
  3310. private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();
  3311. /// <summary>
  3312. /// 仓库表
  3313. /// </summary>
  3314. private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();
  3315. private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();
  3316. /// <summary>
  3317. /// 机台表
  3318. /// </summary>
  3319. private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();
  3320. private Repository<BillBomsetgrp> _billBomsetgrpRepository => new Repository<BillBomsetgrp>();
  3321. private Repository<fjSysJob> _jobRepository => new Repository<fjSysJob>();
  3322. private Repository<fjSysJobApiRelation> _jobApiRepository => new Repository<fjSysJobApiRelation>();
  3323. #endregion 初始化仓储
  3324. #region 湿拉工字轮/帘线芯股信息初始化
  3325. /// <summary>
  3326. /// 湿拉工字轮/帘线芯股信息初始化
  3327. /// </summary>
  3328. /// <param name="reqDto"></param>
  3329. /// <returns></returns>
  3330. public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto)
  3331. {
  3332. var res = new SRes();
  3333. var dateTime = DateTime.Now.AddHours(-12);
  3334. #region 超时判断
  3335. //获取时间
  3336. var prodate = reqDto.ProductDate.GetDateTime(_logger);
  3337. if (prodate < dateTime)
  3338. {
  3339. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3340. res.ResMsg = $"工字轮注册时间为{reqDto.ProductDate},已超过12小时不允许创建自动化上线任务!!!";
  3341. var error = new BaseErrorInfo
  3342. {
  3343. BusName = "湿拉下盘注册",
  3344. Message = $"{res.ResMsg},[{DateTime.Now:yyyyMMddHH}]",
  3345. Count = 1,
  3346. Memo = "WCS"
  3347. };
  3348. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3349. return res;
  3350. }
  3351. #endregion
  3352. //清除十二小时小时前的新建数据
  3353. if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>
  3354. x.Status == TaskStatus.NewBuild && x.Type == TaskType.SetPlate && x.AddTime < dateTime))
  3355. {
  3356. var taskIdList = _taskrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  3357. .Where(x => x.Status == TaskStatus.NewBuild && x.Type == TaskType.SetPlate && x.AddTime < dateTime)
  3358. .ToList();
  3359. var ids = taskIdList.Select(x => x.ID).ToList();
  3360. //有超过十二小时小时的数据,开始清除
  3361. _taskrepository.Delete(x => ids.Contains(x.ID));
  3362. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  3363. {
  3364. Status = TaskStatus.Cancel,
  3365. ManualRemarks = "产品超时,自动清除任务"
  3366. }, x => ids.Contains(x.Id));
  3367. //清除相关条码、码垛信息
  3368. var barCodes = taskIdList.Select(x => x.BarCode).ToList();
  3369. _billSpoolTransrepository.Delete(x => barCodes.Contains(x.ConBarCode));
  3370. _billInvinitrepository.Delete(x => barCodes.Contains(x.HWBarCode));
  3371. }
  3372. //容器
  3373. var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);
  3374. if (container == null)
  3375. {
  3376. var insertcon = new BaseContinfo
  3377. {
  3378. ContBarCode = reqDto.SpoolCode,
  3379. Name = reqDto.SpoolCode,
  3380. TypeCode = ContainerType.ContainerType_Spool.ToString(),
  3381. PrintQty = 1,
  3382. IsStop = 0,
  3383. WarehouseId = 0,
  3384. WeightQty = 0,
  3385. AddWho = "wms",
  3386. AddTime = DateTime.Now
  3387. };
  3388. //新加载具信息
  3389. if (!_baseContinfo.Insert(insertcon))
  3390. {
  3391. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  3392. res.ResMsg = "工字轮载具初始化失败";
  3393. var error = new BaseErrorInfo
  3394. {
  3395. BusName = "湿拉下盘注册",
  3396. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3397. Count = 1,
  3398. Memo = "WCS"
  3399. };
  3400. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3401. return res;
  3402. }
  3403. }
  3404. //物料
  3405. var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
  3406. if (mater == null)
  3407. {
  3408. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  3409. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  3410. var error = new BaseErrorInfo
  3411. {
  3412. BusName = "湿拉下盘注册",
  3413. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3414. Count = 1,
  3415. Memo = "WCS"
  3416. };
  3417. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3418. return res;
  3419. }
  3420. //码垛工字轮
  3421. var billSpoolTrans = new BillSpoolTrans();
  3422. billSpoolTrans.ConBarCode = reqDto.SpoolCode;
  3423. billSpoolTrans.BillCode = reqDto.BillCode;
  3424. billSpoolTrans.WorkOrder = reqDto.WorkOrder;
  3425. billSpoolTrans.MatCode = reqDto.MatCode;
  3426. billSpoolTrans.WarehouseCode = "";
  3427. billSpoolTrans.WarehouseSort = 0;
  3428. billSpoolTrans.LocSort = 0;
  3429. billSpoolTrans.ConveyorSort = 0;
  3430. billSpoolTrans.Direct = "";
  3431. billSpoolTrans.ErrType = 0;
  3432. billSpoolTrans.AddTime = DateTime.Now;
  3433. billSpoolTrans.EditTime = DateTime.Now;
  3434. billSpoolTrans.AddWho = "wms";
  3435. billSpoolTrans.EditWho = "wms";
  3436. //库存
  3437. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolCode);
  3438. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  3439. {
  3440. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3441. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  3442. return res;
  3443. }
  3444. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  3445. {
  3446. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3447. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  3448. var error = new BaseErrorInfo
  3449. {
  3450. BusName = "湿拉下盘注册",
  3451. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3452. Count = 1,
  3453. Memo = "WCS"
  3454. };
  3455. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3456. return res;
  3457. }
  3458. //工字轮需要用到的托盘类型
  3459. var fJPalletType = FJPalletType.Pallet09;
  3460. if (reqDto.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;
  3461. //通过订单找到对应的机台信息
  3462. //通过投入物料找到垛型编码
  3463. var stackdetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.MatCode && p.IsStop == 0);
  3464. if (stackdetail == null)
  3465. {
  3466. _logger.LogInformation(reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode);
  3467. _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);
  3468. _billSpoolTransrepository.Delete(x => x.ConBarCode == billSpoolTrans.ConBarCode);
  3469. _logger.LogInformation($"找不到垛形信息时删除缓存信息{billSpoolTrans.ConBarCode}");
  3470. var task = _taskrepository.GetSingle(x => x.BarCode == billSpoolTrans.ConBarCode);
  3471. if (task != null)
  3472. {
  3473. //删除当前任务与更新历史任务
  3474. _taskrepository.Delete(x => x.ID == task.ID);
  3475. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  3476. {
  3477. Status = TaskStatus.Cancel,
  3478. ManualRemarks = "产品重新投放,自动覆盖历史信息"
  3479. }, x => x.Id == task.ID);
  3480. }
  3481. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3482. res.ResMsg = reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode;
  3483. var error = new BaseErrorInfo
  3484. {
  3485. BusName = "湿拉下盘注册",
  3486. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3487. Count = 1,
  3488. Memo = "WCS"
  3489. };
  3490. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3491. return res;
  3492. }
  3493. //机台垛型编码
  3494. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);
  3495. var macList = _basemachinforepository.GetList(p => stack.Code == p.SetGrpCode); //找到垛型对应的机台信息
  3496. //查询出来的垛型没有对应的机台,开始尝试通过产出匹配机台(适配同产出配多个垛型的情况)
  3497. if (macList.Count <= 0)
  3498. {
  3499. //查出当前这个垛型同产出对应的所有启用垛型
  3500. var stacks =
  3501. _BillBomsetgrpRepository.GetList(p => p.ProMaterCode == stack.ProMaterCode && p.IsStop == 0);
  3502. var stackCodes = stacks.Select(x => x.Code).ToList();
  3503. macList = _basemachinforepository.GetList(p => stackCodes.Contains(p.SetGrpCode));
  3504. }
  3505. //查询机台
  3506. var wareList = macList.Where(x => !x.WarehouseCode.IsNullOrEmpty()).Select(p => p.WarehouseCode).Distinct()
  3507. .OrderBy(v => v); //找到机台对应的仓库信息
  3508. if (!wareList.Any()) //当前订单没有对应仓库信息
  3509. {
  3510. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3511. res.ResMsg = stack.Code + "垛型没有配置机台信息";
  3512. var error = new BaseErrorInfo
  3513. {
  3514. BusName = "湿拉下盘注册",
  3515. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3516. Count = 1,
  3517. Memo = "WCS"
  3518. };
  3519. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3520. return res;
  3521. }
  3522. if (wareList.Count() == 1) //当前订单对应一个仓库信息
  3523. {
  3524. var sort = int.Parse(wareList.First().Substring(0, 1));
  3525. _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
  3526. {
  3527. WarehouseCode = wareList.First(),
  3528. WarehouseSort = sort,
  3529. Direct = wareList.First().Substring(1, 1),
  3530. EditTime = DateTime.Now
  3531. }, p => p.ConBarCode == billSpoolTrans.ConBarCode);
  3532. billSpoolTrans.WarehouseCode = wareList.First();
  3533. billSpoolTrans.WarehouseSort = sort;
  3534. billSpoolTrans.Direct = wareList.First().Substring(1, 1);
  3535. }
  3536. else //当前订单对应多个仓库信息
  3537. {
  3538. //先计算出当前物料在各仓库中应该的占比
  3539. var wareTempList = macList.Where(x => !x.WarehouseCode.IsNullOrEmpty())
  3540. .Select(p => new { p.WarehouseCode }).Distinct();
  3541. var statTime = DateTime.Now.AddHours(-3);
  3542. var warehouseGoods = _billSpoolTransrepository
  3543. .GetList(s => s.MatCode == reqDto.MatCode && s.AddTime > statTime).ToList();
  3544. var specificGravity = wareTempList.Select(x =>
  3545. {
  3546. decimal currentWarehouseGoodsSum = warehouseGoods.Count(s =>
  3547. s.MatCode == reqDto.MatCode && s.WarehouseCode == x.WarehouseCode);
  3548. decimal warehouseGoodsSum = warehouseGoods.Count;
  3549. var a = Convert.ToDecimal(macList.Count(m => m.WarehouseCode == x.WarehouseCode));
  3550. var b = Convert.ToDecimal(macList.Count);
  3551. var specificGravityValue = b == 0 ? 0 : a / b;
  3552. var currentSpecificGravityValue =
  3553. warehouseGoodsSum == 0 ? 0 : currentWarehouseGoodsSum / warehouseGoodsSum;
  3554. return new
  3555. {
  3556. x.WarehouseCode,
  3557. a,
  3558. b,
  3559. SpecificGravity = specificGravityValue, //预期比重
  3560. WarehouseGoods = warehouseGoodsSum, //三个分拣中心实际数量
  3561. CurrentWarehouseGoods = currentWarehouseGoodsSum, //当前分拣中心实际数量
  3562. CurrentSpecificGravity = currentSpecificGravityValue, //当前分拣库实际已有货物占比
  3563. //实际比重与预期比重差值
  3564. //实际比重大于预期比重的默认排在最后
  3565. //实际比重减去预期比重,结果值越大应优先送往
  3566. ProportionGap = currentSpecificGravityValue > specificGravityValue
  3567. ? 0
  3568. : specificGravityValue - currentSpecificGravityValue,
  3569. Direct = x.WarehouseCode.Substring(1, 1)
  3570. };
  3571. }).OrderByDescending(x => x.ProportionGap) //比差越大应当越优先送过去
  3572. .ThenByDescending(x => x.SpecificGravity); //在各库已有货物实际占比达到预期值时按照预期占比最多的优先分配
  3573. _logger.LogInformation($"SpoolMaterialInfoTrans:{JsonConvert.SerializeObject(specificGravity)}");
  3574. var sort = int.Parse(wareList.First().Substring(0, 1));
  3575. _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans
  3576. {
  3577. WarehouseCode = specificGravity.FirstOrDefault().WarehouseCode,
  3578. WarehouseSort = sort,
  3579. Direct = specificGravity.FirstOrDefault().Direct,
  3580. EditTime = DateTime.Now
  3581. }, p => p.ConBarCode == billSpoolTrans.ConBarCode);
  3582. billSpoolTrans.WarehouseCode = specificGravity.FirstOrDefault().WarehouseCode;
  3583. billSpoolTrans.WarehouseSort = sort;
  3584. billSpoolTrans.Direct = specificGravity.FirstOrDefault().Direct;
  3585. }
  3586. var promat = _basematerrepository.GetSingle(p => p.Code == stack.ProMaterCode);
  3587. //创建条码
  3588. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == billSpoolTrans.WarehouseCode);
  3589. //检查条码
  3590. var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolCode);
  3591. var gra = "";
  3592. if (reqDto.Grade != null && !string.IsNullOrEmpty(reqDto.Grade)) gra = reqDto.Grade;
  3593. if (barInfo == null) //当前条码无残留信息
  3594. {
  3595. var barinfo = InitInvinitInfo(reqDto, wareHosue, stack, mater, promat, fJPalletType);
  3596. try
  3597. {
  3598. _db.BeginTran();
  3599. _billInvinitrepository.InsertReturnEntity(barinfo);
  3600. _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);
  3601. //删除因异常导致残留的对应库存信息
  3602. _billInvnowrepository.Delete(x =>
  3603. x.ContGrpBarCode == billSpoolTrans.ConBarCode || x.HWBarCode == billSpoolTrans.ConBarCode);
  3604. //开始生成WCS
  3605. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  3606. {
  3607. BusType = FJTaskBusType.二楼组盘.GetDescription(),
  3608. ContGrpBarCode = reqDto.SpoolCode,
  3609. Qty = 1,
  3610. WarehouseCode = billSpoolTrans.WarehouseCode,
  3611. Floor = 2,
  3612. MatCode = billSpoolTrans.MatCode,
  3613. EquCode = "Robot",
  3614. Type = TaskType.SetPlate,
  3615. DocCode = billSpoolTrans.WorkOrder,
  3616. WorkBench = reqDto.WbCode
  3617. };
  3618. //下发wcs任务 - 分解方法
  3619. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, gra, true);
  3620. if (taskRes.ResCode != 200)
  3621. {
  3622. _db.RollbackTran();
  3623. res.ResCode = taskRes.ResCode;
  3624. res.ResMsg = taskRes.ResMsg;
  3625. var error = new BaseErrorInfo
  3626. {
  3627. BusName = "湿拉下盘注册",
  3628. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3629. Count = 1,
  3630. Memo = "WCS"
  3631. };
  3632. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3633. return res;
  3634. }
  3635. _db.CommitTran();
  3636. RedisHelper.Set($"AllocationWarehouseSort:{reqDto.SpoolCode}", JsonConvert.SerializeObject(
  3637. new MainlineDiversion
  3638. {
  3639. TaskId = taskRes.ResData.ID,
  3640. WarehouseCode = billSpoolTrans.WarehouseCode
  3641. }));
  3642. }
  3643. catch (Exception ex)
  3644. {
  3645. _db.RollbackTran();
  3646. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3647. res.ResMsg = ex.StackTrace;
  3648. }
  3649. }
  3650. else //有残留条码信息更新
  3651. {
  3652. try
  3653. {
  3654. //开始生成WCS
  3655. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  3656. {
  3657. BusType = FJTaskBusType.二楼组盘.GetDescription(),
  3658. ContGrpBarCode = reqDto.SpoolCode,
  3659. Qty = 1,
  3660. WarehouseCode = billSpoolTrans.WarehouseCode,
  3661. Floor = 2,
  3662. MatCode = billSpoolTrans.MatCode,
  3663. EquCode = "Robot",
  3664. Type = TaskType.SetPlate,
  3665. DocCode = billSpoolTrans.WorkOrder,
  3666. WorkBench = reqDto.WbCode
  3667. };
  3668. var barinfo = InitInvinitInfo(reqDto, wareHosue, stack, mater, promat, fJPalletType);
  3669. _db.BeginTran();
  3670. //更新条码信息
  3671. _billInvinitrepository.Delete(x => x.Id == barInfo.Id);
  3672. _billInvinitrepository.InsertReturnEntity(barinfo);
  3673. //更新码垛信息
  3674. _billSpoolTransrepository.UpdateModelColumns(x => new BillSpoolTrans
  3675. {
  3676. ConBarCode = reqDto.SpoolCode,
  3677. BillCode = reqDto.BillCode,
  3678. WorkOrder = reqDto.WorkOrder,
  3679. MatCode = reqDto.MatCode,
  3680. WarehouseCode = billSpoolTrans.WarehouseCode,
  3681. WarehouseSort = billSpoolTrans.WarehouseSort,
  3682. LocSort = 0,
  3683. ConveyorSort = 0,
  3684. Direct = billSpoolTrans.Direct,
  3685. ErrType = 0,
  3686. EditTime = DateTime.Now,
  3687. EditWho = "wms"
  3688. }, x => x.ConBarCode == billSpoolTrans.ConBarCode);
  3689. if (!_billSpoolTransrepository.GetList(x => x.ConBarCode == billSpoolTrans.ConBarCode).Any())
  3690. _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);
  3691. //删除对应的库存信息
  3692. _billInvnowrepository.Delete(x =>
  3693. x.ContGrpBarCode == billSpoolTrans.ConBarCode || x.HWBarCode == billSpoolTrans.ConBarCode);
  3694. var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)
  3695. .Where(x => x.BarCode == billSpoolTrans.ConBarCode).Select(x => x.ID).ToList();
  3696. //下发wcs任务 - 分解方法
  3697. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, gra, true);
  3698. if (taskRes.ResCode != 200)
  3699. {
  3700. _db.RollbackTran();
  3701. res.ResCode = taskRes.ResCode;
  3702. res.ResMsg = taskRes.ResMsg;
  3703. var error = new BaseErrorInfo
  3704. {
  3705. BusName = "湿拉下盘注册",
  3706. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3707. Count = 1,
  3708. Memo = "WCS"
  3709. };
  3710. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3711. return res;
  3712. }
  3713. if (taskIdList != null)
  3714. {
  3715. //删除当前任务与更新历史任务
  3716. _taskrepository.Delete(x => taskIdList.Contains(x.ID));
  3717. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  3718. {
  3719. Status = TaskStatus.Cancel,
  3720. ManualRemarks = "产品重新投放,自动覆盖历史信息"
  3721. }, x => taskIdList.Contains(x.Id));
  3722. }
  3723. _db.CommitTran();
  3724. //RedisHelper.Set($"AllocationWarehouseSort:{reqDto.SpoolCode}", JsonConvert.SerializeObject(new MainlineDiversion
  3725. //{
  3726. // TaskId = taskRes.ResData.ID,
  3727. // WarehouseCode = billSpoolTrans.WarehouseCode
  3728. //}));
  3729. }
  3730. catch (Exception ex)
  3731. {
  3732. _db.RollbackTran();
  3733. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3734. res.ResMsg = ex.StackTrace;
  3735. var error = new BaseErrorInfo
  3736. {
  3737. BusName = "湿拉下盘注册",
  3738. Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",
  3739. Count = 1,
  3740. Memo = "WCS"
  3741. };
  3742. error.UpdataErrorinfo(_baseErrorInfoRepository);
  3743. }
  3744. }
  3745. return res;
  3746. }
  3747. /// <summary>
  3748. /// 生成条码信息
  3749. /// </summary>
  3750. /// <param name="reqDto">请求实体</param>
  3751. /// <param name="wareHosue">仓库信息</param>
  3752. /// <param name="stack">垛形信息</param>
  3753. /// <param name="mater">物料信息</param>
  3754. /// <param name="promat">帘线物料信息</param>
  3755. /// <param name="fJPalletType">托盘类型</param>
  3756. /// <returns></returns>
  3757. public BillInvinit InitInvinitInfo(SpoolMaterialInfoTransRequest reqDto, BaseWarehouse wareHosue,
  3758. BillBomsetgrp stack, BaseMatinfo mater, BaseMatinfo promat, FJPalletType fJPalletType)
  3759. {
  3760. var invInit = new BillInvinit();
  3761. invInit.InvBarCode = reqDto.MatBarCode;
  3762. invInit.WarehouseId = wareHosue != null ? wareHosue.Id : 0;
  3763. invInit.ExecStateCode = InvLockState.InvState_Normal.ToString();
  3764. invInit.ExecDocsNo = reqDto.WorkOrder;
  3765. invInit.ExecDocsRowNo = reqDto.MatBarCode;
  3766. invInit.ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString();
  3767. invInit.InvInOut = FJInvInOutType.In;
  3768. invInit.ExecWho = "MES";
  3769. invInit.EditTime = DateTime.Now;
  3770. invInit.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  3771. invInit.InDocsNo = reqDto.BillCode;
  3772. invInit.InDocsRowNo = reqDto.MatBarCode;
  3773. invInit.SuppCode = "";
  3774. invInit.BomDocsNo = stack.BomCode;
  3775. invInit.BomSetId = stack.Id;
  3776. invInit.SetGrpCode = stack.Code;
  3777. invInit.BomMatCode = promat.Code;
  3778. invInit.BomMatId = promat.Id;
  3779. invInit.BomMatName = promat.Name;
  3780. invInit.MatId = mater.Id;
  3781. invInit.MatCode = mater.Code;
  3782. invInit.MatName = mater.Name;
  3783. invInit.LengthQty = reqDto.Length;
  3784. invInit.TareWQty = reqDto.Weight;
  3785. invInit.ProductTime = DateTime.Parse(reqDto.ProductDate);
  3786. invInit.RFIDBarCode = "";
  3787. invInit.ProductLineNo = reqDto.WbCode;
  3788. invInit.Grade = reqDto.Grade;
  3789. invInit.HWBarCode = reqDto.SpoolCode;
  3790. invInit.HWTypeCode = reqDto.SpoolType; //工字轮类型
  3791. invInit.ContGrpBarCode = reqDto.SpoolCode;
  3792. invInit.ContGrpType = FJContGrpType.Material;
  3793. invInit.ContGrpId = IdFactory.NewId();
  3794. invInit.IsFast = reqDto.IsFast;
  3795. invInit.IsRework = false;
  3796. invInit.CLBarCode = reqDto.MatBarCode;
  3797. invInit.Size = 1;
  3798. invInit.AddTime = DateTime.Now;
  3799. invInit.BackReason = "";
  3800. invInit.IsBack = reqDto.IsBack;
  3801. invInit.SilkTypeCode = reqDto.SilkType;
  3802. invInit.IsCore = reqDto.BusType == 1;
  3803. invInit.PalletType = fJPalletType;
  3804. return invInit;
  3805. }
  3806. #endregion 湿拉工字轮/帘线芯股信息初始化
  3807. #region 同WCS交互部分
  3808. #region 满轮主线
  3809. /// <summary>
  3810. /// 工字轮/芯股进入主线扫码
  3811. /// </summary>
  3812. /// <returns></returns>
  3813. public SRes<SRes> EnteMainLine(FJEnteMainLineRequest reqDto)
  3814. {
  3815. var res = new SRes<SRes>();
  3816. return res;
  3817. }
  3818. /// <summary>
  3819. /// 码垛创建异常任务
  3820. /// </summary>
  3821. /// <param name="reqDto"></param>
  3822. /// <returns></returns>
  3823. public SRes PalletizingCreateseErrorTasks(PalletizingCreateseErrorTasksRequest reqDto)
  3824. {
  3825. var res = new SRes();
  3826. //异常物料的物料号使用Error + 型号组合而成
  3827. var matCode = "Error" + reqDto.Type;
  3828. //物料
  3829. var mater = _basematerrepository.GetSingle(p => p.Code == matCode);
  3830. if (mater == null)
  3831. {
  3832. res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();
  3833. res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();
  3834. return res;
  3835. }
  3836. //判断任务表中是否有相同物料号、起始地址且未结束的任务
  3837. var wcsTask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  3838. .Where(p => p.MatCode == matCode && p.AddrFrom == reqDto.EquNo && p.Status < TaskStatus.Finish)
  3839. .SplitTable(tabs => tabs.Take(2)).First();
  3840. ;
  3841. if (wcsTask != null && wcsTask.Status < TaskStatus.FinishOfShunt) // 如果任务状态小于分流结束,表示已有任务,无需重新生成
  3842. {
  3843. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3844. res.ResMsg = $"{reqDto.EquNo}已有新建任务,需优先处理任务{wcsTask.Id}";
  3845. return res;
  3846. }
  3847. //生成一个随机条码
  3848. var spoolCode = $"Error{reqDto.Type}{IdFactory.GetInstance().NextId()}";
  3849. //码垛工字轮
  3850. var billSpoolTrans = new BillSpoolTrans();
  3851. billSpoolTrans.ConBarCode = spoolCode;
  3852. billSpoolTrans.BillCode = "";
  3853. billSpoolTrans.WorkOrder = "";
  3854. billSpoolTrans.MatCode = matCode;
  3855. billSpoolTrans.WarehouseCode = reqDto.WarehouseCode;
  3856. billSpoolTrans.WarehouseSort = 0;
  3857. billSpoolTrans.LocSort = 0;
  3858. billSpoolTrans.ConveyorSort = 0;
  3859. billSpoolTrans.Direct = "";
  3860. billSpoolTrans.ErrType = 0;
  3861. billSpoolTrans.AddTime = DateTime.Now;
  3862. billSpoolTrans.EditTime = DateTime.Now;
  3863. billSpoolTrans.AddWho = "wms";
  3864. billSpoolTrans.EditWho = "wms";
  3865. //库存
  3866. var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spoolCode);
  3867. if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())
  3868. {
  3869. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3870. res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";
  3871. return res;
  3872. }
  3873. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  3874. {
  3875. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3876. res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";
  3877. return res;
  3878. }
  3879. //检查条码
  3880. var barstock = _billInvinitrepository.GetFirst(p => p.HWBarCode == spoolCode);
  3881. if (barstock != null)
  3882. {
  3883. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3884. res.ResMsg = barstock.HWBarCode + "已使用请检查条码是否重复";
  3885. return res;
  3886. }
  3887. //工字轮需要用到的托盘类型
  3888. var fJPalletType = FJPalletType.Pallet09;
  3889. if (reqDto.Type != "9") fJPalletType = FJPalletType.PalletNo09;
  3890. var prodate = DateTime.Now;
  3891. //通过投入物料找到垛型编码
  3892. var stackdetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == matCode);
  3893. if (stackdetail == null)
  3894. {
  3895. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3896. res.ResMsg = $"请配置{reqDto.Type}工字轮对应的异常垛形";
  3897. return res;
  3898. }
  3899. var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId);
  3900. var promat = _basematerrepository.GetSingle(p => p.Code == stack.ProMaterCode);
  3901. //创建条码
  3902. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == billSpoolTrans.WarehouseCode);
  3903. var barinfo = new BillInvinit
  3904. {
  3905. InvBarCode = "",
  3906. WarehouseId = wareHosue != null ? wareHosue.Id : 0,
  3907. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  3908. ExecDocsNo = "",
  3909. ExecDocsRowNo = "",
  3910. ExecDocsTypeCode = "",
  3911. InvInOut = FJInvInOutType.In,
  3912. ExecWho = "WMS",
  3913. EditTime = DateTime.Now,
  3914. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  3915. InDocsNo = "",
  3916. InDocsRowNo = "",
  3917. SuppCode = "",
  3918. BomDocsNo = stack.BomCode,
  3919. BomSetId = stack.Id,
  3920. SetGrpCode = stack.Code,
  3921. BomMatCode = promat.Code,
  3922. BomMatId = promat.Id,
  3923. BomMatName = promat.Name,
  3924. MatId = mater.Id,
  3925. MatCode = mater.Code,
  3926. MatName = mater.Name,
  3927. LengthQty = 0,
  3928. TareWQty = 0,
  3929. ProductTime = prodate,
  3930. RFIDBarCode = "",
  3931. ProductLineNo = reqDto.EquNo,
  3932. Grade = "",
  3933. HWBarCode = spoolCode,
  3934. HWTypeCode = reqDto.Type, //工字轮类型
  3935. ContGrpBarCode = spoolCode,
  3936. ContGrpType = FJContGrpType.Material,
  3937. ContGrpId = IdFactory.NewId(),
  3938. IsFast = false,
  3939. IsRework = false,
  3940. CLBarCode = "",
  3941. Size = 1,
  3942. AddTime = DateTime.Now,
  3943. BackReason = "",
  3944. IsBack = false,
  3945. SilkTypeCode = "",
  3946. IsCore = false,
  3947. PalletType = fJPalletType
  3948. };
  3949. try
  3950. {
  3951. //构造WCS信息
  3952. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  3953. {
  3954. BusType = FJTaskBusType.二楼异常组盘.GetDescription(),
  3955. ContGrpBarCode = spoolCode,
  3956. Qty = 1,
  3957. WarehouseCode = billSpoolTrans.WarehouseCode,
  3958. Floor = 2,
  3959. MatCode = billSpoolTrans.MatCode,
  3960. EquCode = reqDto.EquNo,
  3961. Type = TaskType.SetPlate,
  3962. DocCode = billSpoolTrans.WorkOrder,
  3963. GoodsType = Convert.ToInt32(reqDto.Type)
  3964. };
  3965. _db.BeginTran();
  3966. _billInvinitrepository.InsertReturnEntity(barinfo);
  3967. _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);
  3968. //下发wcs任务 - 分解方法
  3969. var graMemo = "";
  3970. if (reqDto.errType == 2)
  3971. graMemo = "南北流错";
  3972. else if (reqDto.errType == 3) graMemo = "BC";
  3973. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, graMemo);
  3974. if (taskRes.ResCode != 200)
  3975. {
  3976. _db.RollbackTran();
  3977. res.ResCode = taskRes.ResCode;
  3978. res.ResMsg = taskRes.ResMsg;
  3979. return res;
  3980. }
  3981. _db.CommitTran();
  3982. RedisHelper.Set($"ErrorTasks:{reqDto.EquNo}:{reqDto.Type}", JsonConvert.SerializeObject(
  3983. new MainlineDiversion
  3984. {
  3985. TaskId = taskRes.ResData.ID,
  3986. WarehouseCode = billSpoolTrans.WarehouseCode
  3987. }));
  3988. }
  3989. catch (Exception ex)
  3990. {
  3991. _db.RollbackTran();
  3992. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  3993. res.ResMsg = ex.ToString();
  3994. }
  3995. return res;
  3996. }
  3997. #endregion 满轮主线
  3998. #region 环形库
  3999. #region 环形库申请货位(二深)
  4000. /// <summary>
  4001. /// 环形库申请货位
  4002. /// </summary>
  4003. /// <returns></returns>
  4004. public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc1(FJApplyStockInLocRequest reqEntity)
  4005. {
  4006. var res = new SRes<FJApplyStockInLocResponse>
  4007. {
  4008. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  4009. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  4010. ResData = new FJApplyStockInLocResponse()
  4011. };
  4012. try
  4013. {
  4014. #region 任务信息是否正常
  4015. var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  4016. .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  4017. ;
  4018. if (wcsTask == null)
  4019. {
  4020. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  4021. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  4022. return res;
  4023. }
  4024. if (wcsTask.Type == TaskType.OutDepot)
  4025. {
  4026. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4027. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;
  4028. return res;
  4029. }
  4030. if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人
  4031. {
  4032. res.ResData.CellNo = wcsTask.AddrTo;
  4033. res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null
  4034. ? int.Parse(wcsTask.AddrTo.Split('-')[0])
  4035. : 0;
  4036. res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null
  4037. ? int.Parse(wcsTask.AddrTo.Split('-')[1])
  4038. : 0;
  4039. res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null
  4040. ? int.Parse(wcsTask.AddrTo.Split('-')[2])
  4041. : 0;
  4042. return res;
  4043. }
  4044. #endregion 任务信息是否正常
  4045. //验证仓库信息
  4046. var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);
  4047. if (wareHouse == null)
  4048. {
  4049. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  4050. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  4051. return res;
  4052. }
  4053. //验证库存
  4054. var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);
  4055. if (stock == null)
  4056. {
  4057. //获取条码表相关信息
  4058. var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode)
  4059. .OrderByDescending(x => x.AddTime).FirstOrDefault();
  4060. if (billInvinit == null)
  4061. {
  4062. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4063. res.ResMsg = "无条码信息";
  4064. return res;
  4065. }
  4066. //将条码表映射到库存表
  4067. stock = _mapper.Map<BillInvnow>(billInvinit);
  4068. stock.AddTime = DateTime.Now;
  4069. stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  4070. stock.Id = IdFactory.NewId();
  4071. if (!_billInvnowrepository.Insert(stock))
  4072. {
  4073. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  4074. res.ResMsg = "满轮库存信息存储失败";
  4075. return res;
  4076. }
  4077. }
  4078. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  4079. {
  4080. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4081. res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";
  4082. return res;
  4083. }
  4084. //获取包含当前物料、计划个数大于已有个数、未出库
  4085. var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x =>
  4086. x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty &&
  4087. !x.Out).OrderBy(x => x.AddTime);
  4088. BillRingPalletizingInfo ringPalletizingInfo = null;
  4089. if (ringPalletizingInfoList.Any())
  4090. foreach (var ringPalletizing in ringPalletizingInfoList)
  4091. {
  4092. if (ringPalletizingInfo != null) continue;
  4093. //取当前任务SKU在货位中已有的信息
  4094. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4095. new object[]
  4096. {
  4097. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4098. }).Where((loc, inv) =>
  4099. loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full ||
  4100. loc.StateNum == FjLocationState.StockIn))
  4101. .Select((loc, inv) => new
  4102. {
  4103. loc.GroupID,
  4104. inv.MatCode,
  4105. loc.XYNO
  4106. }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);
  4107. var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
  4108. x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 &&
  4109. x.MatCode == wcsTask.MatCode).ToList();
  4110. if (cells.Count() == bomSetInfo.Count)
  4111. {
  4112. res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  4113. ringPalletizingInfo = null;
  4114. }
  4115. else
  4116. {
  4117. ringPalletizingInfo = ringPalletizing;
  4118. }
  4119. }
  4120. if (ringPalletizingInfo != null)
  4121. {
  4122. //取当前任务SKU在货位中已有的信息
  4123. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4124. new object[]
  4125. {
  4126. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4127. }).Where((loc, inv) =>
  4128. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4129. loc.StateNum == FjLocationState.StockIn))
  4130. .Select((loc, inv) => new
  4131. {
  4132. loc.GroupID,
  4133. inv.MatCode,
  4134. loc.XYNO
  4135. }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);
  4136. var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
  4137. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4138. x.MatCode == wcsTask.MatCode).ToList();
  4139. if (cells.Count() == bomSetInfo.Count)
  4140. {
  4141. res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  4142. ringPalletizingInfo = null;
  4143. }
  4144. }
  4145. if (ringPalletizingInfo == null) //如果没有码垛信息
  4146. {
  4147. var bomsetGrp =
  4148. _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));
  4149. if (bomsetGrp == null)
  4150. {
  4151. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4152. res.ResMsg = "未找到对应垛型信息,请确认是否被禁用";
  4153. return res;
  4154. }
  4155. var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)
  4156. .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();
  4157. //跟据垛形信息生成
  4158. ringPalletizingInfo = new BillRingPalletizingInfo
  4159. {
  4160. Id = IdFactory.NewId(),
  4161. WareHouseId = wareHouse.Id,
  4162. BomSetGrpId = bomsetGrp.Id,
  4163. HWCountQty = bomsetGrp.HWCountQty,
  4164. BomCode = bomsetGrp.BomCode,
  4165. HaveQty = 0,
  4166. Out = false,
  4167. LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0
  4168. };
  4169. if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))
  4170. {
  4171. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  4172. res.ResMsg = "环形库满轮码垛信息存储失败";
  4173. return res;
  4174. }
  4175. res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";
  4176. }
  4177. //获取所有可用货位
  4178. var emptyLocList = _basewarecellrepository.Context
  4179. .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(
  4180. (loc1, inv1, loc2, inv2) => new object[]
  4181. {
  4182. JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,
  4183. JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
  4184. JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode
  4185. })
  4186. .Where((loc1, inv1, loc2, inv2) =>
  4187. loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  4188. .Where((loc1, inv1, loc2, inv2) => loc1.IsStop == 0 && loc2.IsStop == 0)
  4189. .Where((loc1, inv1, loc2, inv2) => loc2.Size == loc1.Size)
  4190. .Where((loc1, inv1, loc2, inv2) =>
  4191. wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  4192. .Where((loc1, inv1, loc2, inv2) => loc1.Depth == 1 && loc2.Depth == 2) //保证三个深度与字段对应
  4193. .Where((loc1, inv1, loc2, inv2) => loc2.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID
  4194. .Where((loc1, inv1, loc2, inv2) =>
  4195. (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full ||
  4196. loc2.StateNum ==
  4197. FjLocationState.StockIn)) //1空、2有/入锁、3有
  4198. || (loc1.StateNum == FjLocationState.Empty &&
  4199. loc2.StateNum == FjLocationState.Empty) //1空、2空、3有/入锁
  4200. || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty)
  4201. ) //1空、2空、3空
  4202. .Where((loc1, inv1, loc2, inv2) =>
  4203. loc2.StateNum == FjLocationState.Empty ||
  4204. ((loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) &&
  4205. inv2.MatCode == wcsTask.MatCode)
  4206. )
  4207. .Select((loc1, inv1, loc2, inv2) => new
  4208. {
  4209. Loc1Code = loc1.Code,
  4210. Loc1Id = loc1.Id,
  4211. Loc1Row = loc1.Row,
  4212. Loc1Col = loc1.Col,
  4213. Loc1Layer = loc1.Layer,
  4214. Loc1Depth = loc1.Depth,
  4215. Loc1Size = loc1.Size,
  4216. Loc1StateNum = loc1.StateNum,
  4217. Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  4218. Inv1MatCode = inv1.MatCode,
  4219. Loc2Code = loc2.Code,
  4220. Loc2Id = loc2.Id,
  4221. Loc2Row = loc2.Row,
  4222. Loc2Col = loc2.Col,
  4223. Loc2Layer = loc2.Layer,
  4224. Loc2Depth = loc2.Depth,
  4225. Loc2Size = loc2.Size,
  4226. Loc2StateNum = loc2.StateNum,
  4227. Loc2ContGrpBarCode = loc2.ContGrpBarCode,
  4228. Inv2MatCode = inv2.MatCode
  4229. }).ToList();
  4230. if (emptyLocList.Any()) //有货位
  4231. {
  4232. var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc2StateNum)
  4233. .ThenByDescending(x => x.Loc1StateNum)
  4234. .First();
  4235. if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2
  4236. {
  4237. res.ResData.CellNo = emptyLoc.Loc2Code;
  4238. res.ResData.Row = emptyLoc.Loc2Row;
  4239. res.ResData.Colomn = emptyLoc.Loc2Col;
  4240. res.ResData.Layer = emptyLoc.Loc2Layer;
  4241. res.ResData.Depth = emptyLoc.Loc2Depth;
  4242. }
  4243. else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1
  4244. {
  4245. res.ResData.CellNo = emptyLoc.Loc1Code;
  4246. res.ResData.Row = emptyLoc.Loc1Row;
  4247. res.ResData.Colomn = emptyLoc.Loc1Col;
  4248. res.ResData.Layer = emptyLoc.Loc1Layer;
  4249. res.ResData.Depth = emptyLoc.Loc1Depth;
  4250. }
  4251. }
  4252. else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息
  4253. {
  4254. var emptyLocList1 = _basewarecellrepository.Context
  4255. .Queryable<BaseWarecell, BaseWarecell>(
  4256. (loc1, loc2) => new object[]
  4257. {
  4258. JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer
  4259. })
  4260. .Where((loc1, loc2) =>
  4261. loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  4262. .Where((loc1, loc2) => loc1.IsStop == 0 && loc2.IsStop == 0)
  4263. .Where((loc1, loc2) => loc2.Size == loc1.Size)
  4264. .Where((loc1, loc2) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  4265. .Where((loc1, loc2) => loc1.Depth == 1 && loc2.Depth == 2) //保证三个深度与字段对应
  4266. .Where((loc1, loc2) => loc1.GroupID == 0 && loc2.GroupID == 0) //获取三个货位都是没有绑定缓存信息的
  4267. .Where((loc1, loc2) =>
  4268. loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty) //1空、2空、3空
  4269. .Select((loc1, loc2) => new
  4270. {
  4271. Loc1Code = loc1.Code,
  4272. Loc1Id = loc1.Id,
  4273. Loc1Row = loc1.Row,
  4274. Loc1Col = loc1.Col,
  4275. Loc1Layer = loc1.Layer,
  4276. Loc1Depth = loc1.Depth,
  4277. Loc1Size = loc1.Size,
  4278. Loc1StateNum = loc1.StateNum,
  4279. Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  4280. Loc2Code = loc2.Code,
  4281. Loc2Id = loc2.Id,
  4282. Loc2Row = loc2.Row,
  4283. Loc2Col = loc2.Col,
  4284. Loc2Layer = loc2.Layer,
  4285. Loc2Depth = loc2.Depth,
  4286. Loc2Size = loc2.Size,
  4287. Loc2StateNum = loc2.StateNum,
  4288. Loc2ContGrpBarCode = loc2.ContGrpBarCode
  4289. }).ToList();
  4290. if (emptyLocList1.Any())
  4291. {
  4292. var emptyLoc = emptyLocList1.OrderBy(x => x.Loc2Layer).ThenBy(x => x.Loc2Col).First();
  4293. res.ResData.CellNo = emptyLoc.Loc2Code;
  4294. res.ResData.Row = emptyLoc.Loc2Row;
  4295. res.ResData.Colomn = emptyLoc.Loc2Col;
  4296. res.ResData.Layer = emptyLoc.Loc2Layer;
  4297. res.ResData.Depth = emptyLoc.Loc2Depth;
  4298. }
  4299. }
  4300. if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位
  4301. {
  4302. res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  4303. res.ResMsg = "有空货位单无可用货位";
  4304. return res;
  4305. }
  4306. List<BillBomsetinfo> bomSetInfos = new List<BillBomsetinfo>();
  4307. //分配当前轮子在垛形中的位置
  4308. if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;
  4309. {
  4310. //取当前任务SKU在货位中已有的信息
  4311. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4312. new object[]
  4313. {
  4314. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4315. }).Where((loc, inv) =>
  4316. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4317. loc.StateNum == FjLocationState.StockIn))
  4318. .Select((loc, inv) => new
  4319. {
  4320. loc.GroupID,
  4321. inv.MatCode,
  4322. loc.XYNO
  4323. }).ToList();
  4324. if (cells.Count != ringPalletizingInfo.HaveQty)
  4325. {
  4326. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4327. res.ResMsg =
  4328. $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  4329. return res;
  4330. }
  4331. var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  4332. //取当前SKU在垛形明细中所有的信息
  4333. bomSetInfos = _billBomsetinfoRepository.GetList(x =>
  4334. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4335. x.MatCode == wcsTask.MatCode).ToList();
  4336. //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个
  4337. var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo))
  4338. .OrderByDescending(x => x).First());
  4339. if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的
  4340. {
  4341. lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;
  4342. var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)
  4343. .OrderByDescending(x => x).First();
  4344. ringPalletizingInfo.LastXYNO = xyNo;
  4345. }
  4346. else
  4347. {
  4348. ringPalletizingInfo.LastXYNO = lastXYNO;
  4349. }
  4350. }
  4351. else //南侧小到大,出的时候刚好可用反过来;
  4352. {
  4353. //取当前任务SKU在货位中已有的信息
  4354. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4355. new object[]
  4356. {
  4357. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4358. }).Where((loc, inv) =>
  4359. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4360. loc.StateNum == FjLocationState.StockIn))
  4361. .Select((loc, inv) => new
  4362. {
  4363. loc.GroupID,
  4364. inv.MatCode,
  4365. loc.XYNO
  4366. }).ToList();
  4367. if (cells.Count != ringPalletizingInfo.HaveQty)
  4368. {
  4369. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4370. res.ResMsg =
  4371. $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  4372. return res;
  4373. }
  4374. var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  4375. //取当前SKU在垛形明细中所有的信息
  4376. bomSetInfos = _billBomsetinfoRepository.GetList(x =>
  4377. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4378. x.MatCode == wcsTask.MatCode).ToList();
  4379. //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个
  4380. var lastXYNO =
  4381. Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());
  4382. if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的
  4383. {
  4384. lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;
  4385. var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)
  4386. .OrderBy(x => x).First();
  4387. ringPalletizingInfo.LastXYNO = xyNo;
  4388. }
  4389. else
  4390. {
  4391. ringPalletizingInfo.LastXYNO = lastXYNO;
  4392. }
  4393. }
  4394. if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>
  4395. x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))
  4396. {
  4397. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4398. res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";
  4399. return res;
  4400. }
  4401. try
  4402. {
  4403. _db.BeginTran();
  4404. var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  4405. .Where(p => p.Id == reqEntity.TaskNum)
  4406. .SplitTable(x => x.Take(2)).First();
  4407. if (task == null)
  4408. {
  4409. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  4410. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  4411. return res;
  4412. }
  4413. if (task.Type == TaskType.OutDepot)
  4414. {
  4415. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4416. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;
  4417. return res;
  4418. }
  4419. var outTime = ringPalletizingInfo.AddTime;
  4420. if (stock.ProductTime < ringPalletizingInfo.AddTime) outTime = stock.ProductTime;
  4421. //更新目标缓存信息
  4422. if (!_billRingPalletizingInfo.UpdateModelColumns(
  4423. p => new BillRingPalletizingInfo
  4424. {
  4425. HaveQty = ringPalletizingInfo.HaveQty + 1, LastXYNO = ringPalletizingInfo.LastXYNO,
  4426. AddTime = outTime
  4427. }, p => p.Id == ringPalletizingInfo.Id))
  4428. {
  4429. _db.RollbackTran();
  4430. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4431. res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  4432. return res;
  4433. }
  4434. //更新目标货位
  4435. if (!_basewarecellrepository.UpdateModelColumns(
  4436. p => new BaseWarecell
  4437. {
  4438. StateNum = FjLocationState.StockIn,
  4439. ContGrpBarCode = task.BarCode,
  4440. ContGrpId = stock.ContGrpId,
  4441. GroupID = ringPalletizingInfo.Id,
  4442. EditTime = DateTime.Now,
  4443. XYNO = ringPalletizingInfo.LastXYNO
  4444. },
  4445. p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo &&
  4446. p.StateNum == FjLocationState.Empty))
  4447. {
  4448. _db.RollbackTran();
  4449. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4450. res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  4451. return res;
  4452. }
  4453. //更新货位信息至历史表,防止WCS重复请求,导致信息异常
  4454. if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  4455. {
  4456. AddrTo = res.ResData.CellNo
  4457. }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))
  4458. {
  4459. _db.RollbackTran();
  4460. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4461. res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";
  4462. return res;
  4463. }
  4464. var bomSetInfo = bomSetInfos.First(x => x.XYNo == ringPalletizingInfo.LastXYNO.ToString());
  4465. //更新库存货物大小信息
  4466. _billInvnowrepository.UpdateModelColumns(
  4467. x => new BillInvnow { Size = reqEntity.Height, SideNum = bomSetInfo.SideNum },
  4468. x => x.Id == stock.Id);
  4469. _db.CommitTran();
  4470. }
  4471. catch (Exception ex)
  4472. {
  4473. _db.RollbackTran();
  4474. _logger.LogInformation(ex.ToString());
  4475. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4476. res.ResMsg = ex.Message;
  4477. }
  4478. }
  4479. catch (Exception ex)
  4480. {
  4481. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4482. res.ResMsg = ex.Message + ex.StackTrace;
  4483. }
  4484. return res;
  4485. }
  4486. /// <summary>
  4487. /// 环形库申请货位
  4488. /// </summary>
  4489. /// <returns></returns>
  4490. public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
  4491. {
  4492. var res = new SRes<FJApplyStockInLocResponse>
  4493. {
  4494. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  4495. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  4496. ResData = new FJApplyStockInLocResponse()
  4497. };
  4498. try
  4499. {
  4500. #region 任务信息是否正常
  4501. var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  4502. .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  4503. ;
  4504. if (wcsTask == null)
  4505. {
  4506. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  4507. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  4508. return res;
  4509. }
  4510. if (wcsTask.Type == TaskType.OutDepot)
  4511. {
  4512. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4513. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;
  4514. return res;
  4515. }
  4516. if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人
  4517. {
  4518. res.ResData.CellNo = wcsTask.AddrTo;
  4519. res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null
  4520. ? int.Parse(wcsTask.AddrTo.Split('-')[0])
  4521. : 0;
  4522. res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null
  4523. ? int.Parse(wcsTask.AddrTo.Split('-')[1])
  4524. : 0;
  4525. res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null
  4526. ? int.Parse(wcsTask.AddrTo.Split('-')[2])
  4527. : 0;
  4528. return res;
  4529. }
  4530. #endregion 任务信息是否正常
  4531. //验证仓库信息
  4532. var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);
  4533. if (wareHouse == null)
  4534. {
  4535. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  4536. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  4537. return res;
  4538. }
  4539. //验证库存
  4540. var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);
  4541. if (stock == null)
  4542. {
  4543. //获取条码表相关信息
  4544. var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode)
  4545. .OrderByDescending(x => x.AddTime).FirstOrDefault();
  4546. if (billInvinit == null)
  4547. {
  4548. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4549. res.ResMsg = "无条码信息";
  4550. return res;
  4551. }
  4552. //将条码表映射到库存表
  4553. stock = _mapper.Map<BillInvnow>(billInvinit);
  4554. stock.AddTime = DateTime.Now;
  4555. stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  4556. stock.Id = IdFactory.NewId();
  4557. if (!_billInvnowrepository.Insert(stock))
  4558. {
  4559. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  4560. res.ResMsg = "满轮库存信息存储失败";
  4561. return res;
  4562. }
  4563. }
  4564. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  4565. {
  4566. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4567. res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";
  4568. return res;
  4569. }
  4570. //获取包含当前物料、计划个数大于已有个数、未出库
  4571. var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x =>
  4572. x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty &&
  4573. !x.Out).OrderBy(x => x.AddTime);
  4574. BillRingPalletizingInfo ringPalletizingInfo = null;
  4575. if (ringPalletizingInfoList.Any())
  4576. foreach (var ringPalletizing in ringPalletizingInfoList)
  4577. {
  4578. if (ringPalletizingInfo != null) continue;
  4579. //取当前任务SKU在货位中已有的信息
  4580. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4581. new object[]
  4582. {
  4583. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4584. }).Where((loc, inv) =>
  4585. loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full ||
  4586. loc.StateNum == FjLocationState.StockIn))
  4587. .Select((loc, inv) => new
  4588. {
  4589. loc.GroupID,
  4590. inv.MatCode,
  4591. loc.XYNO
  4592. }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);
  4593. var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
  4594. x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 &&
  4595. x.MatCode == wcsTask.MatCode).ToList();
  4596. if (cells.Count() == bomSetInfo.Count)
  4597. {
  4598. res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  4599. ringPalletizingInfo = null;
  4600. }
  4601. else
  4602. {
  4603. ringPalletizingInfo = ringPalletizing;
  4604. }
  4605. }
  4606. if (ringPalletizingInfo != null)
  4607. {
  4608. //取当前任务SKU在货位中已有的信息
  4609. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4610. new object[]
  4611. {
  4612. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4613. }).Where((loc, inv) =>
  4614. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4615. loc.StateNum == FjLocationState.StockIn))
  4616. .Select((loc, inv) => new
  4617. {
  4618. loc.GroupID,
  4619. inv.MatCode,
  4620. loc.XYNO
  4621. }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);
  4622. var bomSetInfo = _billBomsetinfoRepository.GetList(x =>
  4623. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4624. x.MatCode == wcsTask.MatCode).ToList();
  4625. if (cells.Count() == bomSetInfo.Count)
  4626. {
  4627. res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  4628. ringPalletizingInfo = null;
  4629. }
  4630. }
  4631. if (ringPalletizingInfo == null) //如果没有码垛信息
  4632. {
  4633. var bomsetGrp =
  4634. _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));
  4635. if (bomsetGrp == null)
  4636. {
  4637. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4638. res.ResMsg = "未找到对应垛型信息,请确认是否被禁用";
  4639. return res;
  4640. }
  4641. var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)
  4642. .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();
  4643. //跟据垛形信息生成
  4644. ringPalletizingInfo = new BillRingPalletizingInfo
  4645. {
  4646. Id = IdFactory.NewId(),
  4647. WareHouseId = wareHouse.Id,
  4648. BomSetGrpId = bomsetGrp.Id,
  4649. HWCountQty = bomsetGrp.HWCountQty,
  4650. BomCode = bomsetGrp.BomCode,
  4651. HaveQty = 0,
  4652. Out = false,
  4653. LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0
  4654. };
  4655. if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))
  4656. {
  4657. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  4658. res.ResMsg = "环形库满轮码垛信息存储失败";
  4659. return res;
  4660. }
  4661. res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";
  4662. }
  4663. //获取所有可用货位
  4664. var emptyLocList = _basewarecellrepository.Context
  4665. .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(
  4666. (loc1, inv1, loc2, inv2, loc3, inv3) => new object[]
  4667. {
  4668. JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,
  4669. JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
  4670. JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode,
  4671. JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
  4672. JoinType.Left, loc3.ContGrpBarCode == inv3.ContGrpBarCode
  4673. })
  4674. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  4675. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
  4676. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
  4677. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  4678. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
  4679. .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc3.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID
  4680. .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
  4681. (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) && loc3.StateNum == FjLocationState.Full) //1空、2有/入锁、3有
  4682. || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && (loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn)) //1空、2空、3有/入锁
  4683. || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty)
  4684. ) //1空、2空、3空
  4685. .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
  4686. loc3.StateNum == FjLocationState.Empty || ((loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn) && inv3.MatCode == wcsTask.MatCode))
  4687. .Select((loc1, inv1, loc2, inv2, loc3, inv3) => new
  4688. {
  4689. Loc1Code = loc1.Code,
  4690. Loc1Id = loc1.Id,
  4691. Loc1Row = loc1.Row,
  4692. Loc1Col = loc1.Col,
  4693. Loc1Layer = loc1.Layer,
  4694. Loc1Depth = loc1.Depth,
  4695. Loc1Size = loc1.Size,
  4696. Loc1StateNum = loc1.StateNum,
  4697. Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  4698. Inv1MatCode = inv1.MatCode,
  4699. Loc2Code = loc2.Code,
  4700. Loc2Id = loc2.Id,
  4701. Loc2Row = loc2.Row,
  4702. Loc2Col = loc2.Col,
  4703. Loc2Layer = loc2.Layer,
  4704. Loc2Depth = loc2.Depth,
  4705. Loc2Size = loc2.Size,
  4706. Loc2StateNum = loc2.StateNum,
  4707. Loc2ContGrpBarCode = loc2.ContGrpBarCode,
  4708. Inv2MatCode = inv2.MatCode,
  4709. Loc3Code = loc3.Code,
  4710. Loc3Id = loc3.Id,
  4711. Loc3Row = loc3.Row,
  4712. Loc3Col = loc3.Col,
  4713. Loc3Layer = loc3.Layer,
  4714. Loc3Depth = loc3.Depth,
  4715. Loc3Size = loc3.Size,
  4716. Loc3StateNum = loc3.StateNum,
  4717. Loc3ContGrpBarCode = loc3.ContGrpBarCode,
  4718. Inv3MatCode = inv3.MatCode,
  4719. }).ToList();
  4720. if (emptyLocList.Any()) //有货位
  4721. {
  4722. var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc3StateNum)
  4723. .ThenByDescending(x => x.Loc2StateNum)
  4724. .ThenByDescending(x => x.Loc1StateNum)
  4725. .First();
  4726. if (emptyLoc.Loc3StateNum == FjLocationState.Empty) //优先3
  4727. {
  4728. res.ResData.CellNo = emptyLoc.Loc3Code;
  4729. res.ResData.Row = emptyLoc.Loc3Row;
  4730. res.ResData.Colomn = emptyLoc.Loc3Col;
  4731. res.ResData.Layer = emptyLoc.Loc3Layer;
  4732. res.ResData.Depth = emptyLoc.Loc3Depth;
  4733. }
  4734. else if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2
  4735. {
  4736. res.ResData.CellNo = emptyLoc.Loc2Code;
  4737. res.ResData.Row = emptyLoc.Loc2Row;
  4738. res.ResData.Colomn = emptyLoc.Loc2Col;
  4739. res.ResData.Layer = emptyLoc.Loc2Layer;
  4740. res.ResData.Depth = emptyLoc.Loc2Depth;
  4741. }
  4742. else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1
  4743. {
  4744. res.ResData.CellNo = emptyLoc.Loc1Code;
  4745. res.ResData.Row = emptyLoc.Loc1Row;
  4746. res.ResData.Colomn = emptyLoc.Loc1Col;
  4747. res.ResData.Layer = emptyLoc.Loc1Layer;
  4748. res.ResData.Depth = emptyLoc.Loc1Depth;
  4749. }
  4750. }
  4751. else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息
  4752. {
  4753. var emptyLocList1 = _basewarecellrepository.Context
  4754. .Queryable<BaseWarecell, BaseWarecell, BaseWarecell>(
  4755. (loc1, loc2, loc3) => new object[]
  4756. {
  4757. JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
  4758. JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
  4759. })
  4760. .Where((loc1, loc2, loc3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  4761. .Where((loc1, loc2, loc3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
  4762. .Where((loc1, loc2, loc3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
  4763. .Where((loc1, loc2, loc3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  4764. .Where((loc1, loc2, loc3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
  4765. .Where((loc1, loc2, loc3) => loc1.GroupID == 0 && loc2.GroupID == 0 && loc3.GroupID == 0) //获取三个货位都是没有绑定缓存信息的
  4766. .Where((loc1, loc2, loc3) => loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty) //1空、2空、3空
  4767. .Select((loc1, loc2, loc3) => new
  4768. {
  4769. Loc1Code = loc1.Code,
  4770. Loc1Id = loc1.Id,
  4771. Loc1Row = loc1.Row,
  4772. Loc1Col = loc1.Col,
  4773. Loc1Layer = loc1.Layer,
  4774. Loc1Depth = loc1.Depth,
  4775. Loc1Size = loc1.Size,
  4776. Loc1StateNum = loc1.StateNum,
  4777. Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  4778. Loc2Code = loc2.Code,
  4779. Loc2Id = loc2.Id,
  4780. Loc2Row = loc2.Row,
  4781. Loc2Col = loc2.Col,
  4782. Loc2Layer = loc2.Layer,
  4783. Loc2Depth = loc2.Depth,
  4784. Loc2Size = loc2.Size,
  4785. Loc2StateNum = loc2.StateNum,
  4786. Loc2ContGrpBarCode = loc2.ContGrpBarCode,
  4787. Loc3Code = loc3.Code,
  4788. Loc3Id = loc3.Id,
  4789. Loc3Row = loc3.Row,
  4790. Loc3Col = loc3.Col,
  4791. Loc3Layer = loc3.Layer,
  4792. Loc3Depth = loc3.Depth,
  4793. Loc3Size = loc3.Size,
  4794. Loc3StateNum = loc3.StateNum,
  4795. Loc3ContGrpBarCode = loc3.ContGrpBarCode,
  4796. }).ToList();
  4797. if (emptyLocList1.Any())
  4798. {
  4799. var emptyLoc = emptyLocList1.OrderBy(x => x.Loc3Layer).ThenBy(x => x.Loc3Col).First();
  4800. res.ResData.CellNo = emptyLoc.Loc3Code;
  4801. res.ResData.Row = emptyLoc.Loc3Row;
  4802. res.ResData.Colomn = emptyLoc.Loc3Col;
  4803. res.ResData.Layer = emptyLoc.Loc3Layer;
  4804. res.ResData.Depth = emptyLoc.Loc3Depth;
  4805. }
  4806. }
  4807. if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位
  4808. {
  4809. res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  4810. res.ResMsg = "有空货位单无可用货位";
  4811. return res;
  4812. }
  4813. List<BillBomsetinfo> bomSetInfos = new List<BillBomsetinfo>();
  4814. //分配当前轮子在垛形中的位置
  4815. if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;
  4816. {
  4817. //取当前任务SKU在货位中已有的信息
  4818. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4819. new object[]
  4820. {
  4821. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4822. }).Where((loc, inv) =>
  4823. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4824. loc.StateNum == FjLocationState.StockIn))
  4825. .Select((loc, inv) => new
  4826. {
  4827. loc.GroupID,
  4828. inv.MatCode,
  4829. loc.XYNO
  4830. }).ToList();
  4831. if (cells.Count != ringPalletizingInfo.HaveQty)
  4832. {
  4833. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4834. res.ResMsg =
  4835. $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  4836. return res;
  4837. }
  4838. var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  4839. //取当前SKU在垛形明细中所有的信息
  4840. bomSetInfos = _billBomsetinfoRepository.GetList(x =>
  4841. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4842. x.MatCode == wcsTask.MatCode).ToList();
  4843. //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个
  4844. var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo))
  4845. .OrderByDescending(x => x).First());
  4846. if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的
  4847. {
  4848. lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;
  4849. var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)
  4850. .OrderByDescending(x => x).First();
  4851. ringPalletizingInfo.LastXYNO = xyNo;
  4852. }
  4853. else
  4854. {
  4855. ringPalletizingInfo.LastXYNO = lastXYNO;
  4856. }
  4857. }
  4858. else //南侧小到大,出的时候刚好可用反过来;
  4859. {
  4860. //取当前任务SKU在货位中已有的信息
  4861. var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  4862. new object[]
  4863. {
  4864. JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  4865. }).Where((loc, inv) =>
  4866. loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||
  4867. loc.StateNum == FjLocationState.StockIn))
  4868. .Select((loc, inv) => new
  4869. {
  4870. loc.GroupID,
  4871. inv.MatCode,
  4872. loc.XYNO
  4873. }).ToList();
  4874. if (cells.Count != ringPalletizingInfo.HaveQty)
  4875. {
  4876. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4877. res.ResMsg =
  4878. $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  4879. return res;
  4880. }
  4881. var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  4882. //取当前SKU在垛形明细中所有的信息
  4883. bomSetInfos = _billBomsetinfoRepository.GetList(x =>
  4884. x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&
  4885. x.MatCode == wcsTask.MatCode).ToList();
  4886. //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个
  4887. var lastXYNO =
  4888. Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());
  4889. if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的
  4890. {
  4891. lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;
  4892. var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)
  4893. .OrderBy(x => x).First();
  4894. ringPalletizingInfo.LastXYNO = xyNo;
  4895. }
  4896. else
  4897. {
  4898. ringPalletizingInfo.LastXYNO = lastXYNO;
  4899. }
  4900. }
  4901. if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>
  4902. x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))
  4903. {
  4904. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4905. res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";
  4906. return res;
  4907. }
  4908. try
  4909. {
  4910. _db.BeginTran();
  4911. var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  4912. .Where(p => p.Id == reqEntity.TaskNum)
  4913. .SplitTable(x => x.Take(2)).First();
  4914. if (task == null)
  4915. {
  4916. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  4917. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  4918. return res;
  4919. }
  4920. if (task.Type == TaskType.OutDepot)
  4921. {
  4922. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  4923. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;
  4924. return res;
  4925. }
  4926. var outTime = ringPalletizingInfo.AddTime;
  4927. if (stock.ProductTime < ringPalletizingInfo.AddTime) outTime = stock.ProductTime;
  4928. //更新目标缓存信息
  4929. if (!_billRingPalletizingInfo.UpdateModelColumns(
  4930. p => new BillRingPalletizingInfo
  4931. {
  4932. HaveQty = ringPalletizingInfo.HaveQty + 1,
  4933. LastXYNO = ringPalletizingInfo.LastXYNO,
  4934. AddTime = outTime
  4935. }, p => p.Id == ringPalletizingInfo.Id))
  4936. {
  4937. _db.RollbackTran();
  4938. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4939. res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  4940. return res;
  4941. }
  4942. //更新目标货位
  4943. if (!_basewarecellrepository.UpdateModelColumns(
  4944. p => new BaseWarecell
  4945. {
  4946. StateNum = FjLocationState.StockIn,
  4947. ContGrpBarCode = task.BarCode,
  4948. ContGrpId = stock.ContGrpId,
  4949. GroupID = ringPalletizingInfo.Id,
  4950. EditTime = DateTime.Now,
  4951. XYNO = ringPalletizingInfo.LastXYNO
  4952. },
  4953. p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo &&
  4954. p.StateNum == FjLocationState.Empty))
  4955. {
  4956. _db.RollbackTran();
  4957. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4958. res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  4959. return res;
  4960. }
  4961. //更新货位信息至历史表,防止WCS重复请求,导致信息异常
  4962. if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  4963. {
  4964. AddrTo = res.ResData.CellNo
  4965. }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))
  4966. {
  4967. _db.RollbackTran();
  4968. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4969. res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";
  4970. return res;
  4971. }
  4972. var bomSetInfo = bomSetInfos.First(x => x.XYNo == ringPalletizingInfo.LastXYNO.ToString());
  4973. //更新库存货物大小信息
  4974. _billInvnowrepository.UpdateModelColumns(
  4975. x => new BillInvnow { Size = reqEntity.Height, SideNum = bomSetInfo.SideNum },
  4976. x => x.Id == stock.Id);
  4977. _db.CommitTran();
  4978. }
  4979. catch (Exception ex)
  4980. {
  4981. _db.RollbackTran();
  4982. _logger.LogInformation(ex.ToString());
  4983. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4984. res.ResMsg = ex.Message;
  4985. }
  4986. }
  4987. catch (Exception ex)
  4988. {
  4989. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  4990. res.ResMsg = ex.Message + ex.StackTrace;
  4991. }
  4992. return res;
  4993. }
  4994. #endregion
  4995. //#region 环形库货位申请(三深)
  4996. //public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
  4997. //{
  4998. // var res = new SRes<FJApplyStockInLocResponse>()
  4999. // {
  5000. // ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  5001. // ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  5002. // ResData = new FJApplyStockInLocResponse()
  5003. // };
  5004. // try
  5005. // {
  5006. // #region 任务信息是否正常
  5007. // var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  5008. // ;
  5009. // if (wcsTask == null)
  5010. // {
  5011. // res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  5012. // res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  5013. // return res;
  5014. // }
  5015. // if (wcsTask.Type == TaskType.OutDepot)
  5016. // {
  5017. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5018. // res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;
  5019. // return res;
  5020. // }
  5021. // if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人
  5022. // {
  5023. // res.ResData.CellNo = wcsTask.AddrTo;
  5024. // res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null ? int.Parse(wcsTask.AddrTo.Split('-')[0]) : 0;
  5025. // res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null ? int.Parse(wcsTask.AddrTo.Split('-')[1]) : 0;
  5026. // res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null ? int.Parse(wcsTask.AddrTo.Split('-')[2]) : 0;
  5027. // return res;
  5028. // }
  5029. // #endregion 任务信息是否正常
  5030. // //验证仓库信息
  5031. // var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);
  5032. // if (wareHouse == null)
  5033. // {
  5034. // res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  5035. // res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  5036. // return res;
  5037. // }
  5038. // //验证库存
  5039. // var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);
  5040. // if (stock == null)
  5041. // {
  5042. // //获取条码表相关信息
  5043. // var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode).OrderByDescending(x => x.AddTime).FirstOrDefault();
  5044. // if (billInvinit == null)
  5045. // {
  5046. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5047. // res.ResMsg = "无条码信息";
  5048. // return res;
  5049. // }
  5050. // //将条码表映射到库存表
  5051. // stock = _mapper.Map<BillInvnow>(billInvinit);
  5052. // stock.AddTime = DateTime.Now;
  5053. // stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  5054. // stock.Id = IdFactory.NewId();
  5055. // if (!_billInvnowrepository.Insert(stock))
  5056. // {
  5057. // res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  5058. // res.ResMsg = "满轮库存信息存储失败";
  5059. // return res;
  5060. // }
  5061. // }
  5062. // if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  5063. // {
  5064. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5065. // res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";
  5066. // return res;
  5067. // }
  5068. // //获取包含当前物料、计划个数大于已有个数、未出库
  5069. // var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x => x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty && !x.Out).OrderBy(x => x.AddTime);
  5070. // BillRingPalletizingInfo ringPalletizingInfo = null;
  5071. // if (ringPalletizingInfoList.Any())
  5072. // {
  5073. // foreach (var ringPalletizing in ringPalletizingInfoList)
  5074. // {
  5075. // if (ringPalletizingInfo != null) continue;
  5076. // //取当前任务SKU在货位中已有的信息
  5077. // var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  5078. // new object[]
  5079. // {
  5080. // JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  5081. // }).Where((loc, inv) => loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))
  5082. // .Select((loc, inv) => new
  5083. // {
  5084. // loc.GroupID,
  5085. // inv.MatCode,
  5086. // loc.XYNO
  5087. // }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);
  5088. // var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();
  5089. // if (cells.Count() == bomSetInfos.Count)
  5090. // {
  5091. // res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  5092. // ringPalletizingInfo = null;
  5093. // }
  5094. // else ringPalletizingInfo = ringPalletizing;
  5095. // }
  5096. // }
  5097. // if (ringPalletizingInfo != null)
  5098. // {
  5099. // //取当前任务SKU在货位中已有的信息
  5100. // var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  5101. // new object[]
  5102. // {
  5103. // JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  5104. // }).Where((loc, inv) => loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))
  5105. // .Select((loc, inv) => new
  5106. // {
  5107. // loc.GroupID,
  5108. // inv.MatCode,
  5109. // loc.XYNO
  5110. // }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);
  5111. // var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();
  5112. // if (cells.Count() == bomSetInfos.Count)
  5113. // {
  5114. // res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";
  5115. // ringPalletizingInfo = null;
  5116. // }
  5117. // }
  5118. // if (ringPalletizingInfo == null) //如果没有码垛信息
  5119. // {
  5120. // var bomsetGrp = _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));
  5121. // var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0).ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();
  5122. // //跟据垛形信息生成
  5123. // ringPalletizingInfo = new BillRingPalletizingInfo
  5124. // {
  5125. // Id = IdFactory.NewId(),
  5126. // WareHouseId = wareHouse.Id,
  5127. // BomSetGrpId = bomsetGrp.Id,
  5128. // HWCountQty = bomsetGrp.HWCountQty,
  5129. // BomCode = bomsetGrp.BomCode,
  5130. // HaveQty = 0,
  5131. // Out = false,
  5132. // LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0
  5133. // };
  5134. // if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))
  5135. // {
  5136. // res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  5137. // res.ResMsg = "环形库满轮码垛信息存储失败";
  5138. // return res;
  5139. // }
  5140. // res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";
  5141. // }
  5142. // //获取所有可用货位
  5143. // var emptyLocList = _basewarecellrepository.Context
  5144. // .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(
  5145. // (loc1, inv1, loc2, inv2, loc3, inv3) => new object[]
  5146. // {
  5147. // JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,
  5148. // JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
  5149. // JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode,
  5150. // JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
  5151. // JoinType.Left, loc3.ContGrpBarCode == inv3.ContGrpBarCode
  5152. // })
  5153. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  5154. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
  5155. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
  5156. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  5157. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
  5158. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc3.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID
  5159. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
  5160. // (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) && loc3.StateNum == FjLocationState.Full) //1空、2有/入锁、3有
  5161. // || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && (loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn)) //1空、2空、3有/入锁
  5162. // || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty)
  5163. // ) //1空、2空、3空
  5164. // .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>
  5165. // loc3.StateNum == FjLocationState.Empty || ((loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn) && inv3.MatCode == wcsTask.MatCode))
  5166. // .Select((loc1, inv1, loc2, inv2, loc3, inv3) => new
  5167. // {
  5168. // Loc1Code = loc1.Code,
  5169. // Loc1Id = loc1.Id,
  5170. // Loc1Row = loc1.Row,
  5171. // Loc1Col = loc1.Col,
  5172. // Loc1Layer = loc1.Layer,
  5173. // Loc1Depth = loc1.Depth,
  5174. // Loc1Size = loc1.Size,
  5175. // Loc1StateNum = loc1.StateNum,
  5176. // Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  5177. // Inv1MatCode = inv1.MatCode,
  5178. // Loc2Code = loc2.Code,
  5179. // Loc2Id = loc2.Id,
  5180. // Loc2Row = loc2.Row,
  5181. // Loc2Col = loc2.Col,
  5182. // Loc2Layer = loc2.Layer,
  5183. // Loc2Depth = loc2.Depth,
  5184. // Loc2Size = loc2.Size,
  5185. // Loc2StateNum = loc2.StateNum,
  5186. // Loc2ContGrpBarCode = loc2.ContGrpBarCode,
  5187. // Inv2MatCode = inv2.MatCode,
  5188. // Loc3Code = loc3.Code,
  5189. // Loc3Id = loc3.Id,
  5190. // Loc3Row = loc3.Row,
  5191. // Loc3Col = loc3.Col,
  5192. // Loc3Layer = loc3.Layer,
  5193. // Loc3Depth = loc3.Depth,
  5194. // Loc3Size = loc3.Size,
  5195. // Loc3StateNum = loc3.StateNum,
  5196. // Loc3ContGrpBarCode = loc3.ContGrpBarCode,
  5197. // Inv3MatCode = inv3.MatCode,
  5198. // }).ToList();
  5199. // if (emptyLocList.Any()) //有货位
  5200. // {
  5201. // var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc3StateNum)
  5202. // .ThenByDescending(x => x.Loc2StateNum)
  5203. // .ThenByDescending(x => x.Loc1StateNum)
  5204. // .First();
  5205. // if (emptyLoc.Loc3StateNum == FjLocationState.Empty) //优先3
  5206. // {
  5207. // res.ResData.CellNo = emptyLoc.Loc3Code;
  5208. // res.ResData.Row = emptyLoc.Loc3Row;
  5209. // res.ResData.Colomn = emptyLoc.Loc3Col;
  5210. // res.ResData.Layer = emptyLoc.Loc3Layer;
  5211. // res.ResData.Depth = emptyLoc.Loc3Depth;
  5212. // }
  5213. // else if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2
  5214. // {
  5215. // res.ResData.CellNo = emptyLoc.Loc2Code;
  5216. // res.ResData.Row = emptyLoc.Loc2Row;
  5217. // res.ResData.Colomn = emptyLoc.Loc2Col;
  5218. // res.ResData.Layer = emptyLoc.Loc2Layer;
  5219. // res.ResData.Depth = emptyLoc.Loc2Depth;
  5220. // }
  5221. // else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1
  5222. // {
  5223. // res.ResData.CellNo = emptyLoc.Loc1Code;
  5224. // res.ResData.Row = emptyLoc.Loc1Row;
  5225. // res.ResData.Colomn = emptyLoc.Loc1Col;
  5226. // res.ResData.Layer = emptyLoc.Loc1Layer;
  5227. // res.ResData.Depth = emptyLoc.Loc1Depth;
  5228. // }
  5229. // }
  5230. // else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息
  5231. // {
  5232. // var emptyLocList1 = _basewarecellrepository.Context
  5233. // .Queryable<BaseWarecell, BaseWarecell, BaseWarecell>(
  5234. // (loc1, loc2, loc3) => new object[]
  5235. // {
  5236. // JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,
  5237. // JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,
  5238. // })
  5239. // .Where((loc1, loc2, loc3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的
  5240. // .Where((loc1, loc2, loc3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)
  5241. // .Where((loc1, loc2, loc3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)
  5242. // .Where((loc1, loc2, loc3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))
  5243. // .Where((loc1, loc2, loc3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应
  5244. // .Where((loc1, loc2, loc3) => loc1.GroupID == 0 && loc2.GroupID == 0 && loc3.GroupID == 0) //获取三个货位都是没有绑定缓存信息的
  5245. // .Where((loc1, loc2, loc3) => loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty) //1空、2空、3空
  5246. // .Select((loc1, loc2, loc3) => new
  5247. // {
  5248. // Loc1Code = loc1.Code,
  5249. // Loc1Id = loc1.Id,
  5250. // Loc1Row = loc1.Row,
  5251. // Loc1Col = loc1.Col,
  5252. // Loc1Layer = loc1.Layer,
  5253. // Loc1Depth = loc1.Depth,
  5254. // Loc1Size = loc1.Size,
  5255. // Loc1StateNum = loc1.StateNum,
  5256. // Loc1ContGrpBarCode = loc1.ContGrpBarCode,
  5257. // Loc2Code = loc2.Code,
  5258. // Loc2Id = loc2.Id,
  5259. // Loc2Row = loc2.Row,
  5260. // Loc2Col = loc2.Col,
  5261. // Loc2Layer = loc2.Layer,
  5262. // Loc2Depth = loc2.Depth,
  5263. // Loc2Size = loc2.Size,
  5264. // Loc2StateNum = loc2.StateNum,
  5265. // Loc2ContGrpBarCode = loc2.ContGrpBarCode,
  5266. // Loc3Code = loc3.Code,
  5267. // Loc3Id = loc3.Id,
  5268. // Loc3Row = loc3.Row,
  5269. // Loc3Col = loc3.Col,
  5270. // Loc3Layer = loc3.Layer,
  5271. // Loc3Depth = loc3.Depth,
  5272. // Loc3Size = loc3.Size,
  5273. // Loc3StateNum = loc3.StateNum,
  5274. // Loc3ContGrpBarCode = loc3.ContGrpBarCode,
  5275. // }).ToList();
  5276. // if (emptyLocList1.Any())
  5277. // {
  5278. // var emptyLoc = emptyLocList1.OrderBy(x => x.Loc3Layer).ThenBy(x => x.Loc3Col).First();
  5279. // res.ResData.CellNo = emptyLoc.Loc3Code;
  5280. // res.ResData.Row = emptyLoc.Loc3Row;
  5281. // res.ResData.Colomn = emptyLoc.Loc3Col;
  5282. // res.ResData.Layer = emptyLoc.Loc3Layer;
  5283. // res.ResData.Depth = emptyLoc.Loc3Depth;
  5284. // }
  5285. // }
  5286. // if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位
  5287. // {
  5288. // res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  5289. // res.ResMsg = "有空货位单无可用货位";
  5290. // return res;
  5291. // }
  5292. // //分配当前轮子在垛形中的位置
  5293. // if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;
  5294. // {
  5295. // //取当前任务SKU在货位中已有的信息
  5296. // var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  5297. // new object[]
  5298. // {
  5299. // JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  5300. // }).Where((loc, inv) => loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))
  5301. // .Select((loc, inv) => new
  5302. // {
  5303. // loc.GroupID,
  5304. // inv.MatCode,
  5305. // loc.XYNO
  5306. // }).ToList();
  5307. // if (cells.Count != ringPalletizingInfo.HaveQty)
  5308. // {
  5309. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5310. // res.ResMsg = $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  5311. // return res;
  5312. // }
  5313. // var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  5314. // //取当前SKU在垛形明细中所有的信息
  5315. // var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();
  5316. // //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个
  5317. // var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First());
  5318. // if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的
  5319. // {
  5320. // lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;
  5321. // var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO).OrderByDescending(x => x).First();
  5322. // ringPalletizingInfo.LastXYNO = xyNo;
  5323. // }
  5324. // else ringPalletizingInfo.LastXYNO = lastXYNO;
  5325. // }
  5326. // else //南侧小到大,出的时候刚好可用反过来;
  5327. // {
  5328. // //取当前任务SKU在货位中已有的信息
  5329. // var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  5330. // new object[]
  5331. // {
  5332. // JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode
  5333. // }).Where((loc, inv) =>
  5334. // loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))
  5335. // .Select((loc, inv) => new
  5336. // {
  5337. // loc.GroupID,
  5338. // inv.MatCode,
  5339. // loc.XYNO
  5340. // }).ToList();
  5341. // if (cells.Count != ringPalletizingInfo.HaveQty)
  5342. // {
  5343. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5344. // res.ResMsg = $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";
  5345. // return res;
  5346. // }
  5347. // var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);
  5348. // //取当前SKU在垛形明细中所有的信息
  5349. // var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();
  5350. // //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个
  5351. // var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());
  5352. // if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的
  5353. // {
  5354. // lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;
  5355. // var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO).OrderBy(x => x).First();
  5356. // ringPalletizingInfo.LastXYNO = xyNo;
  5357. // }
  5358. // else ringPalletizingInfo.LastXYNO = lastXYNO;
  5359. // }
  5360. // if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x => x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))
  5361. // {
  5362. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5363. // res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";
  5364. // return res;
  5365. // }
  5366. // try
  5367. // {
  5368. // _db.BeginTran();
  5369. // var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(p => p.Id == reqEntity.TaskNum)
  5370. // .SplitTable(x => x.Take(2)).First();
  5371. // if (task == null)
  5372. // {
  5373. // res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  5374. // res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  5375. // return res;
  5376. // }
  5377. // if (task.Type == TaskType.OutDepot)
  5378. // {
  5379. // res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5380. // res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;
  5381. // return res;
  5382. // }
  5383. // //更新目标缓存信息
  5384. // if (!_billRingPalletizingInfo.UpdateModelColumns(p => new BillRingPalletizingInfo() { HaveQty = ringPalletizingInfo.HaveQty + 1, LastXYNO = ringPalletizingInfo.LastXYNO }, p => p.Id == ringPalletizingInfo.Id))
  5385. // {
  5386. // _db.RollbackTran();
  5387. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5388. // res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  5389. // return res;
  5390. // }
  5391. // //更新目标货位
  5392. // if (!_basewarecellrepository.UpdateModelColumns(
  5393. // p => new BaseWarecell()
  5394. // {
  5395. // StateNum = FjLocationState.StockIn,
  5396. // ContGrpBarCode = task.BarCode,
  5397. // ContGrpId = stock.ContGrpId,
  5398. // GroupID = ringPalletizingInfo.Id,
  5399. // EditTime = DateTime.Now,
  5400. // XYNO = ringPalletizingInfo.LastXYNO
  5401. // },
  5402. // p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo && p.StateNum == FjLocationState.Empty))
  5403. // {
  5404. // _db.RollbackTran();
  5405. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5406. // res.ResMsg = $"货位{res.ResData.CellNo}被锁定";
  5407. // return res;
  5408. // }
  5409. // //更新货位信息至历史表,防止WCS重复请求,导致信息异常
  5410. // if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld()
  5411. // {
  5412. // AddrTo = res.ResData.CellNo
  5413. // }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))
  5414. // {
  5415. // _db.RollbackTran();
  5416. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5417. // res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";
  5418. // return res;
  5419. // }
  5420. // //更新库存货物大小信息
  5421. // _billInvnowrepository.UpdateModelColumns(x => new BillInvnow() { Size = reqEntity.Height }, x => x.Id == stock.Id);
  5422. // _db.CommitTran();
  5423. // }
  5424. // catch (Exception ex)
  5425. // {
  5426. // _db.RollbackTran();
  5427. // _logger.LogInformation(ex.ToString());
  5428. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5429. // res.ResMsg = ex.Message;
  5430. // }
  5431. // }
  5432. // catch (Exception ex)
  5433. // {
  5434. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5435. // res.ResMsg = ex.Message + ex.StackTrace;
  5436. // }
  5437. // return res;
  5438. //}
  5439. //#endregion
  5440. /// <summary>
  5441. /// WCS申请码垛出库
  5442. /// </summary>
  5443. public SRes ApplyPalletizingStockOut(RingApplyPalletizingStockOutRequest req)
  5444. {
  5445. var res = new SRes
  5446. {
  5447. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  5448. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  5449. };
  5450. //验证仓库信息
  5451. var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == req.WareHouseCode);
  5452. if (wareHouse == null)
  5453. {
  5454. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  5455. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  5456. return res;
  5457. }
  5458. #region 获取已经成组的码垛信息
  5459. var matInfoList = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.TimeOut != 0)
  5460. .ToList();
  5461. var defaultOutTime = _sysconfigrepository.GetFirst(x => x.Code == "DefaultOutTime");
  5462. if (defaultOutTime == null) defaultOutTime = new fjSysConfig { SContent = "12" };
  5463. var ringPalletizingInfo = _billRingPalletizingInfo
  5464. .GetList(x => x.WareHouseId == wareHouse.Id && x.HaveQty > 0 && !x.Out).ToList().OrderBy(x => x.AddTime)
  5465. .FirstOrDefault(x =>
  5466. {
  5467. var outTime = Convert.ToInt32(defaultOutTime.SContent);
  5468. if (matInfoList.Any(m => x.BomCode.Contains(m.Code)))
  5469. outTime = matInfoList.Where(m => x.BomCode.Contains(m.Code)).Min(m => m.TimeOut);
  5470. return x.HaveQty == x.HWCountQty || x.AddTime < DateTime.Now.AddHours(-outTime);
  5471. });
  5472. if (ringPalletizingInfo == null)
  5473. {
  5474. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  5475. res.ResMsg = "无满跺码垛信息";
  5476. return res;
  5477. }
  5478. #endregion
  5479. var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>
  5480. new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.HWBarCode })
  5481. .Where((loc, inv) => loc.WarehouseCode == req.WareHouseCode && loc.StateNum == FjLocationState.Full &&
  5482. ringPalletizingInfo.Id == loc.GroupID)
  5483. .Select((loc, inv) => new CellInfo
  5484. {
  5485. Id = loc.Id,
  5486. ContGrpBarCode = loc.ContGrpBarCode,
  5487. WarehouseId = loc.WarehouseId,
  5488. WarehouseCode = loc.WarehouseCode,
  5489. Code = loc.Code,
  5490. Row = loc.Row,
  5491. Col = loc.Col,
  5492. Layer = loc.Layer,
  5493. Depth = loc.Depth,
  5494. EditTime = loc.EditTime,
  5495. MatCode = inv.MatCode,
  5496. SideNum = inv.SideNum,
  5497. CLBarCode = inv.CLBarCode,
  5498. XYNo = loc.XYNO,
  5499. BomDocsNo = inv.BomDocsNo
  5500. }).ToList();
  5501. if (ringPalletizingInfo.HaveQty != wareCellList.Count)
  5502. {
  5503. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  5504. res.ResMsg = $"库存不足{ringPalletizingInfo.Id}";
  5505. return res;
  5506. }
  5507. if (ringPalletizingInfo.HaveQty != wareCellList.DistinctBy(x => x.XYNo).Count())
  5508. {
  5509. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5510. res.ResMsg = "码垛信息组XYNo存在重复情况,请查看环形库码垛信息找出是哪一个位置出现重复";
  5511. return res;
  5512. }
  5513. try
  5514. {
  5515. //找到当前库存信息中可以使用的垛形信息
  5516. var bomDocsNos = wareCellList.Select(x => x.BomDocsNo).Distinct().ToList();
  5517. var bomSetGrpList = _BillBomsetgrpRepository.GetList(x => bomDocsNos.Contains(x.BomCode));
  5518. if (!bomSetGrpList.Any())
  5519. {
  5520. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5521. res.ResMsg = $"{JsonConvert.SerializeObject(bomDocsNos.Distinct())}未找到对应的垛形信息";
  5522. return res;
  5523. }
  5524. #region 分区计算
  5525. //获取最佳码垛位
  5526. var findBestStackingPosition = FindBestStackingPosition(wareCellList);
  5527. if (findBestStackingPosition.IsNullOrEmpty())
  5528. {
  5529. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5530. res.ResMsg = "分区计算异常无对应结果";
  5531. return res;
  5532. }
  5533. if (findBestStackingPosition != req.EquCode) //当前码垛位不是最近码垛位置
  5534. {
  5535. //查看最近码垛位是否存在未结束的码垛任务
  5536. var used = _taskrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>
  5537. x.AddrTo == findBestStackingPosition && x.BusType == FJTaskBusType.环形库出库码垛任务.GetDescription() &&
  5538. x.Status < TaskStatus.Finish);
  5539. //有正在执行的任务,报错返回
  5540. if (!used)
  5541. {
  5542. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5543. res.ResMsg = $"优先最近码垛位执行-{findBestStackingPosition}";
  5544. return res;
  5545. }
  5546. }
  5547. #endregion
  5548. foreach (var doc in bomSetGrpList)
  5549. {
  5550. //找到对应的垛形信息
  5551. var bomSetGrp = _BillBomsetgrpRepository.GetSingle(x => doc.Id == x.Id);
  5552. //是否可以码垛,默认可以码垛
  5553. var isPalletize = true;
  5554. if (isPalletize) //开始计算出库任务
  5555. //开始为各种物料生成对应的出库任务
  5556. try
  5557. {
  5558. //开始更新相关数据
  5559. _db.BeginTran(); //创建事务
  5560. _billRingPalletizingInfo.UpdateModelColumns(p => new BillRingPalletizingInfo { Out = true },
  5561. p => p.Id == ringPalletizingInfo.Id);
  5562. foreach (var cell in wareCellList)
  5563. {
  5564. //更新货位信息
  5565. _basewarecellrepository.UpdateModelColumns(
  5566. p => new BaseWarecell { StateNum = FjLocationState.StockOut },
  5567. p => p.Id == cell.Id && p.StateNum == FjLocationState.Full);
  5568. //更新库存信息
  5569. var sotck = _billInvnowrepository.GetSingle(x =>
  5570. x.ContGrpBarCode == cell.ContGrpBarCode && x.HWBarCode == cell.ContGrpBarCode &&
  5571. x.PutCol == cell.Col && x.PutLayer == cell.Layer && x.PutRow == cell.Row);
  5572. if (sotck == null)
  5573. {
  5574. _db.RollbackTran(); //回滚事务
  5575. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5576. res.ResMsg = $"未找到库存信息{cell.ContGrpBarCode}";
  5577. return res;
  5578. }
  5579. _billInvnowrepository.UpdateModelColumns(
  5580. p => new BillInvnow
  5581. {
  5582. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  5583. EditTime = DateTime.Now
  5584. }, p => p.HWBarCode == cell.ContGrpBarCode);
  5585. //更新流水信息
  5586. var invFlow = _mapper.Map<BillInvflow>(sotck);
  5587. invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  5588. invFlow.AddTime = DateTime.Now;
  5589. invFlow.Id = IdFactory.NewId();
  5590. invFlow.Memo = "出库码垛";
  5591. _billInvflow.Insert(invFlow);
  5592. //添加出库任务
  5593. var task = RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  5594. {
  5595. ContGrpBarCode = cell.ContGrpBarCode,
  5596. CellNo = cell.Code,
  5597. MatCode = cell.MatCode,
  5598. EquCode = req.EquCode,
  5599. Floor = 2,
  5600. ProdLine = Convert.ToInt16(cell.XYNo),
  5601. PalletType = bomSetGrp.ShortCode,
  5602. FullQty = (short)ringPalletizingInfo.HaveQty,
  5603. Device = req.Device,
  5604. WarehouseCode = cell.WarehouseCode,
  5605. BusType = FJTaskBusType.环形库出库码垛任务,
  5606. GoodsType = sotck.Size
  5607. });
  5608. if (task.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5609. {
  5610. _db.RollbackTran(); //回滚事务
  5611. res = task;
  5612. return res;
  5613. }
  5614. wareCellList = wareCellList.Where(x => x.Id != cell.Id).ToList();
  5615. }
  5616. _db.CommitTran(); //提交事务
  5617. break;
  5618. }
  5619. catch (Exception e)
  5620. {
  5621. _db.RollbackTran(); //回滚事务
  5622. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5623. _logger.LogInformation(e.ToString());
  5624. res.ResMsg = e.StackTrace;
  5625. }
  5626. }
  5627. }
  5628. catch (Exception e)
  5629. {
  5630. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5631. _logger.LogInformation(e.ToString());
  5632. res.ResMsg = e.Message;
  5633. }
  5634. ;
  5635. return res;
  5636. }
  5637. /// <summary>
  5638. /// 环形库创建WCS出库任务
  5639. /// </summary>
  5640. /// <param name="reqDto"></param>
  5641. /// <returns></returns>
  5642. public SRes<WCS_TaskInfo> RingCreateStockOutWcsTask(FJCreateStockOutWcsTaskRequest reqDto)
  5643. {
  5644. var res = new SRes<WCS_TaskInfo>();
  5645. var bus = reqDto.BusType.GetDescription();
  5646. var wcstask = new WCS_TaskInfo
  5647. {
  5648. Type = TaskType.OutDepot,
  5649. Status = TaskStatus.NewBuild,
  5650. Priority = 0,
  5651. Device = reqDto.Device,
  5652. SrmStation = reqDto.EquCode,
  5653. AddrFrom = reqDto.CellNo,
  5654. AddrTo = reqDto.EquCode,
  5655. LastInteractionPoint = reqDto.LastInteractionPoint,
  5656. BarCode = reqDto.ContGrpBarCode,
  5657. Floor = reqDto.Floor,
  5658. Length = reqDto.Qty,
  5659. AddTime = DateTime.Now,
  5660. DocID = 0,
  5661. PalletType = reqDto.PalletType,
  5662. ProdLine = reqDto.ProdLine,
  5663. FullQty = reqDto.FullQty,
  5664. AddWho = "WMS",
  5665. WarehouseCode = reqDto.WarehouseCode,
  5666. Enabled = true,
  5667. WorkBench = reqDto.WorkBench,
  5668. GoodsType = reqDto.GoodsType,
  5669. BusType = bus,
  5670. MatCode = reqDto.MatCode,
  5671. WorkOrder = reqDto.MesNo,
  5672. MaterialCode = reqDto.EmptyInventory
  5673. };
  5674. var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);
  5675. try
  5676. {
  5677. var task = _taskrepository.InsertReturnEntity(wcstask);
  5678. wcstaskhis.Id = task.ID;
  5679. _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);
  5680. var taskdetail = new WCS_TaskDtl
  5681. {
  5682. ID = Guid.NewGuid(),
  5683. CurPoint = reqDto.CellNo,
  5684. AddTime = DateTime.Now,
  5685. AddWho = "wms",
  5686. Enabled = true,
  5687. ParentTaskCode = task.ID,
  5688. Desc = "创建出库任务"
  5689. };
  5690. _taskdetailrepository.InsertableSplitTable(taskdetail);
  5691. res.ResData = task;
  5692. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  5693. }
  5694. catch (Exception ex)
  5695. {
  5696. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  5697. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  5698. _logger.LogInformation("保存任务异常:" + ex);
  5699. return res;
  5700. }
  5701. return res;
  5702. }
  5703. #endregion 环形库
  5704. #region 码垛
  5705. /// <summary>
  5706. /// 生成组盘任务,空托盘
  5707. /// </summary>
  5708. /// <param name="reqDto"></param>
  5709. /// <returns></returns>
  5710. public SRes GroupTask(FJBuildEmptyPalletsStockDto reqDto)
  5711. {
  5712. var res = new SRes();
  5713. var BusType = reqDto.BusType;
  5714. //验证业务类型
  5715. if (reqDto.BusType != FJTaskBusType.组盘_托盘)
  5716. {
  5717. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  5718. res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription();
  5719. return res;
  5720. }
  5721. ////验证是否有空余货位
  5722. //res = _mapper.Map<CopperLineResponse>(IsThereAnySpaceVacancy());
  5723. //if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  5724. //检查仓库是否存在
  5725. res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WareCode));
  5726. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  5727. //验证容器是否存在
  5728. res = _mapper.Map<CopperLineResponse>(
  5729. CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet));
  5730. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  5731. //验证托盘是否有未结束的任务
  5732. res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(reqDto.PalletCode));
  5733. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  5734. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  5735. {
  5736. BusType = BusType.GetDescription(),
  5737. ContGrpBarCode = reqDto.PalletCode,
  5738. Qty = reqDto.PalletNum.ObjToDecimal(),
  5739. EquCode = reqDto.StartLoc,
  5740. WarehouseCode = reqDto.WareCode,
  5741. Floor = reqDto.Floor,
  5742. Type = TaskType.SetPlate
  5743. };
  5744. //下发wcs任务 - 分解方法
  5745. var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);
  5746. if (taskres.ResCode != 200)
  5747. {
  5748. res.ResCode = taskres.ResCode;
  5749. res.ResMsg = taskres.ResMsg;
  5750. return res;
  5751. }
  5752. return res;
  5753. }
  5754. /// <summary>
  5755. /// 绑定托盘与工字轮
  5756. /// </summary>
  5757. /// <param name="reqDto"></param>
  5758. /// <returns></returns>
  5759. public SRes BingPallet(FJBingPalletDto reqDto)
  5760. {
  5761. var res = new SRes();
  5762. reqDto.PalletCode = Regex.Replace(reqDto.PalletCode.Trim(), @"[\r\n]", "");
  5763. //检查仓库是否存在
  5764. res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WarehouseCode));
  5765. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  5766. #region 检查托盘任务是否有效
  5767. //容器信息
  5768. var palletContainer = _baseContinfo.GetSingle(x => x.ContBarCode == reqDto.PalletCode);
  5769. if (palletContainer == null)
  5770. {
  5771. //创建容器信息
  5772. var cont = new BaseContinfo
  5773. {
  5774. ContBarCode = reqDto.PalletCode,
  5775. Name = reqDto.PalletCode,
  5776. TypeCode = FJContainerType.ContainerType_Pallet.ToString(),
  5777. PrintQty = 1,
  5778. IsStop = 0,
  5779. WarehouseId = 0,
  5780. AddWho = "WMS",
  5781. AddTime = DateTime.Now
  5782. };
  5783. //加载新的容器信息
  5784. if (!_baseContinfo.Insert(cont))
  5785. {
  5786. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  5787. res.ResMsg = "载具初始化失败";
  5788. return res;
  5789. }
  5790. }
  5791. else if (palletContainer.IsStop != 0)
  5792. {
  5793. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5794. res.ResMsg = "容器已停用";
  5795. return res;
  5796. }
  5797. #endregion 检查托盘任务是否有效
  5798. if (reqDto.IsFinish)
  5799. {
  5800. if (reqDto.IsItHalf)
  5801. {
  5802. _db.BeginTran();
  5803. var invnow = _billInvnowrepository.GetList(x => reqDto.PalletCode == x.ContGrpBarCode);
  5804. var invnowIds = invnow.Select(x => x.Id);
  5805. _billInvnowrepository.UpdateModelColumns(x => new BillInvnow
  5806. {
  5807. IsFail = reqDto.IsFail,
  5808. FailReason = reqDto.FailReason,
  5809. Secondary = true
  5810. }, x => invnowIds.Contains(x.Id));
  5811. //开始生成WCS
  5812. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  5813. {
  5814. BusType = FJTaskBusType.码垛入库.GetDescription(),
  5815. ContGrpBarCode = reqDto.PalletCode,
  5816. Qty = 1,
  5817. WarehouseCode = reqDto.WarehouseCode,
  5818. Floor = 2,
  5819. EquCode = reqDto.loc,
  5820. Height = 1, //带料托盘默认为小货位
  5821. Type = TaskType.EnterDepot
  5822. };
  5823. //下发wcs任务 - 分解方法
  5824. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);
  5825. if (taskRes.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5826. {
  5827. _db.RollbackTran(); //回滚事务
  5828. res = taskRes;
  5829. return res;
  5830. }
  5831. _db.CommitTran();
  5832. }
  5833. else
  5834. {
  5835. _db.BeginTran();
  5836. var invnow = _billInvnowrepository.GetList(x => reqDto.PalletCode == x.ContGrpBarCode);
  5837. if (invnow.Count <= 0)
  5838. {
  5839. _db.RollbackTran(); //回滚事务
  5840. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5841. res.ResMsg = "无法结盘,当前托盘条码无对应绑盘库存信息请检查当前码垛工位是否完成绑定动作";
  5842. return res;
  5843. }
  5844. if (!reqDto.IsFail)
  5845. if (invnow.Count != reqDto.TaskCode.Count)
  5846. {
  5847. _db.RollbackTran(); //回滚事务
  5848. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5849. res.ResMsg = $"实有库存信息数量与应有库存信息数量不匹配;实有{invnow.Count}--应有{reqDto.TaskCode.Count}";
  5850. return res;
  5851. }
  5852. var invnowIds = invnow.Select(x => x.Id);
  5853. _billInvnowrepository.UpdateModelColumns(x => new BillInvnow
  5854. {
  5855. IsFail = reqDto.IsFail,
  5856. FailReason = reqDto.FailReason,
  5857. Secondary = false
  5858. }, x => invnowIds.Contains(x.Id));
  5859. //开始生成WCS
  5860. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  5861. {
  5862. BusType = FJTaskBusType.码垛入库.GetDescription(),
  5863. ContGrpBarCode = reqDto.PalletCode,
  5864. Qty = 1,
  5865. WarehouseCode = reqDto.WarehouseCode,
  5866. Floor = 2,
  5867. EquCode = reqDto.loc,
  5868. Height = 1, //带料托盘默认为小货位
  5869. Type = TaskType.EnterDepot
  5870. };
  5871. //下发wcs任务 - 分解方法
  5872. var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);
  5873. if (taskRes.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())
  5874. {
  5875. _db.RollbackTran(); //回滚事务
  5876. res = taskRes;
  5877. return res;
  5878. }
  5879. _db.CommitTran();
  5880. }
  5881. return res;
  5882. }
  5883. #region 检查工字轮任务是否有效
  5884. var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WarehouseCode);
  5885. //无论是桁架还是环形库绑盘都要验证条码信息
  5886. foreach (var code in from code in reqDto.TaskCode
  5887. let billInvinit = _billInvinitrepository.GetFirst(x => x.HWBarCode == code)
  5888. where billInvinit == null
  5889. select code)
  5890. {
  5891. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5892. res.ResMsg = $"条码{code}无条码信息";
  5893. return res;
  5894. }
  5895. if (wareHosue.TypeNum == FjLocationType.RingLibrary) //环形库需要验证一下库存信息
  5896. foreach (var code in reqDto.TaskCode)
  5897. {
  5898. var billInvnow = _billInvnowrepository.GetSingle(x => x.HWBarCode == code);
  5899. if (billInvnow == null)
  5900. {
  5901. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5902. res.ResMsg = $"工字轮{code}无库存信息";
  5903. return res;
  5904. }
  5905. if (billInvnow.InvStateCode != FJInvState.InvEcecState_BuildUp.ToString())
  5906. {
  5907. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5908. res.ResMsg = $"工字轮{code}库存状态错误";
  5909. return res;
  5910. }
  5911. }
  5912. #endregion 检查工字轮任务是否有效
  5913. try
  5914. {
  5915. _db.BeginTran();
  5916. var contGrpId = IdFactory.NewId();
  5917. //开始更新条码信息
  5918. foreach (var code in reqDto.TaskCode)
  5919. {
  5920. //无论桁架码垛还是环形库都能找到条码信息,因上方已经验证过条码信息是否存在,所以不再二次验证
  5921. var billInv = _billInvinitrepository.GetFirst(x => x.HWBarCode == code);
  5922. if (billInv == null)
  5923. {
  5924. _db.RollbackTran();
  5925. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5926. res.ResMsg = $"{code}未找到条码信息";
  5927. return res;
  5928. }
  5929. var stock = _billInvnowrepository.GetSingle(x => x.HWBarCode == billInv.HWBarCode);
  5930. switch (wareHosue.TypeNum)
  5931. {
  5932. case FjLocationType.RingLibrary:
  5933. if (stock == null)
  5934. {
  5935. _db.RollbackTran();
  5936. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5937. res.ResMsg = $"{code}未找到库存信息";
  5938. return res;
  5939. }
  5940. //更新库存信息
  5941. _billInvnowrepository.UpdateModelColumns(
  5942. x => new BillInvnow
  5943. {
  5944. WarehouseId = wareHosue.Id,
  5945. ContGrpId = contGrpId,
  5946. ContGrpType = FJContGrpType.Material,
  5947. ContGrpBarCode = reqDto.PalletCode,
  5948. IsFail = reqDto.IsFail,
  5949. FailReason = reqDto.FailReason
  5950. },
  5951. x => x.Id == stock.Id && x.InvStateCode == FJInvState.InvEcecState_BuildUp.ToString());
  5952. break;
  5953. case FjLocationType.Storage:
  5954. if (stock != null)
  5955. {
  5956. _db.RollbackTran();
  5957. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5958. res.ResMsg = $"{code}已有库存信息";
  5959. return res;
  5960. }
  5961. //将条码表映射到库存表
  5962. stock = _mapper.Map<BillInvnow>(billInv);
  5963. stock.AddTime = DateTime.Now;
  5964. stock.Id = IdFactory.NewId();
  5965. stock.ContGrpId = contGrpId;
  5966. stock.ContGrpType = FJContGrpType.Material;
  5967. stock.ContGrpBarCode = reqDto.PalletCode;
  5968. stock.WarehouseId = wareHosue.Id;
  5969. stock.IsFail = reqDto.IsFail;
  5970. stock.FailReason = reqDto.FailReason;
  5971. stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();
  5972. if (!_billInvnowrepository.Insert(stock))
  5973. {
  5974. _db.RollbackTran();
  5975. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  5976. res.ResMsg = "库存信息存储失败";
  5977. return res;
  5978. }
  5979. break;
  5980. case FjLocationType.Pingku:
  5981. _db.RollbackTran();
  5982. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5983. res.ResMsg = "无效仓库类型";
  5984. return res;
  5985. case FjLocationType.Virtual:
  5986. _db.RollbackTran();
  5987. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5988. res.ResMsg = "无效仓库类型";
  5989. return res;
  5990. default:
  5991. _db.RollbackTran();
  5992. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  5993. res.ResMsg = "无效仓库类型";
  5994. return res;
  5995. }
  5996. //增加流水信息
  5997. var depotstocklist = _billInvnowrepository.GetList(p =>
  5998. p.ContGrpBarCode == reqDto.PalletCode &&
  5999. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  6000. foreach (var item in depotstocklist)
  6001. {
  6002. item.Id = IdFactory.NewId();
  6003. item.AddTime = DateTime.Now;
  6004. item.Memo = "整托入库组盘";
  6005. }
  6006. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(depotstocklist));
  6007. }
  6008. _db.CommitTran();
  6009. }
  6010. catch (Exception e)
  6011. {
  6012. _db.RollbackTran();
  6013. ;
  6014. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6015. res.ResMsg = e.Message;
  6016. }
  6017. return res;
  6018. }
  6019. public SRes<int> GetTwoPallet(FJGetTwoPalletDto reqDto)
  6020. {
  6021. var res = new SRes<int>();
  6022. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6023. res.ResMsg = "暂停";
  6024. return res;
  6025. //检查仓库是否存在
  6026. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WarehouseCode);
  6027. if (warehosue == null)
  6028. {
  6029. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  6030. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  6031. return res;
  6032. }
  6033. //通过任务号在历史任务中找到对应货位号
  6034. var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == reqDto.TaskId)
  6035. .SplitTable(tabs => tabs.Take(2)).First();
  6036. if (task == null)
  6037. {
  6038. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6039. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6040. return res;
  6041. }
  6042. if (task.Type != TaskType.EnterDepot)
  6043. {
  6044. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6045. res.ResMsg = "不是入库任务,无法获取出库货位;任务号" + task.Id;
  6046. return res;
  6047. }
  6048. var cell = _basewarecellrepository.GetSingle(x =>
  6049. x.ContGrpBarCode == task.BarCode && x.WarehouseCode == reqDto.WarehouseCode);
  6050. if (cell == null || cell.StateNum != FjLocationState.Full)
  6051. {
  6052. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6053. res.ResMsg = "当前货物以超时出库" + task.Id;
  6054. return res;
  6055. }
  6056. try
  6057. {
  6058. _db.BeginTran();
  6059. _basewarecellrepository.UpdateModelColumns(x => new BaseWarecell
  6060. {
  6061. StateNum = FjLocationState.StockOut,
  6062. EditTime = DateTime.Now,
  6063. EditWho = "WMS"
  6064. }, x => x.Id == cell.Id);
  6065. //添加出库任务
  6066. var resTask = RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  6067. {
  6068. ContGrpBarCode = cell.ContGrpBarCode,
  6069. CellNo = cell.Code,
  6070. EquCode = cell.WarehouseCode switch
  6071. {
  6072. "1N" => "1605",
  6073. "1S" => "1615",
  6074. "2N" => "1625",
  6075. "2S" => "1635",
  6076. "3N" => "1645",
  6077. "3S" => "1655",
  6078. _ => "ERROR"
  6079. },
  6080. Floor = 2,
  6081. Device = cell.WarehouseCode switch
  6082. {
  6083. "1N" => "SRM1",
  6084. "1S" => "SRM2",
  6085. "2N" => "SRM3",
  6086. "2S" => "SRM4",
  6087. "3N" => "SRM5",
  6088. "3S" => "SRM6",
  6089. _ => "ERROR"
  6090. },
  6091. WorkBench = "",
  6092. WarehouseCode = cell.WarehouseCode,
  6093. BusType = FJTaskBusType.二楼二次码垛出库
  6094. });
  6095. _db.CommitTran();
  6096. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6097. res.ResMsg = "成功";
  6098. res.ResData = resTask.ResData.ID;
  6099. }
  6100. catch (Exception e)
  6101. {
  6102. _db.RollbackTran();
  6103. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6104. res.ResMsg = e.Message;
  6105. }
  6106. return res;
  6107. }
  6108. #endregion 码垛
  6109. #region 立库
  6110. /// <summary>
  6111. /// 一楼空托盘人工入库任务创建
  6112. /// </summary>
  6113. /// <param name="reqDto"></param>
  6114. /// <returns></returns>
  6115. public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto)
  6116. {
  6117. var res = new SRes();
  6118. reqDto.PalletCode = Regex.Replace(reqDto.PalletCode.Trim(), @"[\r\n]", "");
  6119. ;
  6120. //判断时候存在组盘信息
  6121. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.PalletCode);
  6122. if (stock != null && stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  6123. {
  6124. res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();
  6125. res.ResMsg = reqDto.PalletCode + ResponseStatusCodeEnum.StockStateFail.GetDescription();
  6126. return res;
  6127. }
  6128. if (stock == null)
  6129. {
  6130. var req = _mapper.Map<FJBuildEmptyPalletsStockDto>(reqDto);
  6131. req.Floor = 1;
  6132. req.BusType = FJTaskBusType.OneLayerManualPallets;
  6133. req.PalletType = req.PalletCode.StartsWith("TPA") ? FJPalletType.Pallet09 : FJPalletType.PalletNo09;
  6134. req.PalletNum = "5";
  6135. res = FJEmptyPalletsStockIn(req);
  6136. }
  6137. //后续补充
  6138. return res;
  6139. }
  6140. /// <summary>
  6141. /// 分拣库空托盘入库
  6142. /// </summary>
  6143. /// <param name="reqDto"></param>
  6144. /// <returns></returns>
  6145. public SRes FJEmptyPalletsStockIn(FJBuildEmptyPalletsStockDto reqDto)
  6146. {
  6147. var res = new CopperLineResponse();
  6148. var BusType = reqDto.BusType;
  6149. //验证业务类型
  6150. if (reqDto.BusType <= FJTaskBusType.def || reqDto.BusType > FJTaskBusType.OneLayerAutoPallets)
  6151. {
  6152. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6153. res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription();
  6154. return res;
  6155. }
  6156. //验证是否有空余货位
  6157. res = _mapper.Map<CopperLineResponse>(IsThereAnySpaceVacancy());
  6158. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  6159. //检查仓库是否存在
  6160. res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WareCode));
  6161. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  6162. //验证容器是否存在
  6163. res = _mapper.Map<CopperLineResponse>(
  6164. CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet));
  6165. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  6166. if (reqDto.PalletCode != "TPA" && reqDto.PalletCode != "TPB")
  6167. {
  6168. //验证托盘是否有未结束的任务
  6169. res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(reqDto.PalletCode));
  6170. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  6171. //验证是否存在库存信息
  6172. res = _mapper.Map<CopperLineResponse>(CheckInvnow(reqDto.PalletCode));
  6173. if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;
  6174. }
  6175. else
  6176. {
  6177. reqDto.PalletCode = reqDto.PalletCode + IdFactory.GetInstance().NextId();
  6178. }
  6179. //保存条码信息 空托盘条码即条码表条码
  6180. var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.PalletCode);
  6181. if (barinfo == null)
  6182. {
  6183. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode);
  6184. var mat = _basematerrepository.GetSingle(p => p.Code == reqDto.PalletCode.Substring(0, 3));
  6185. barinfo = new BillInvinit
  6186. {
  6187. InvBarCode = reqDto.PalletCode,
  6188. CLBarCode = reqDto.PalletCode,
  6189. WarehouseId = warehosue.Id,
  6190. ContGrpId = IdFactory.NewId(),
  6191. ContGrpBarCode = reqDto.PalletCode,
  6192. ExecStateCode = FJInvLockState.InvState_Normal.ToString(),
  6193. ExecDocsTypeCode = FJDocType.DocType_FJ_EmptyPalletsStockIn.GetHashCode().ToString(),
  6194. ContGrpType = FJContGrpType.EmptyCon,
  6195. InvInOut = FJInvInOutType.In,
  6196. ExecWho = "WCS",
  6197. EditTime = DateTime.Now,
  6198. InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),
  6199. SuppCode = "",
  6200. Size = 2,
  6201. MatCode = mat.Code,
  6202. MatId = mat.Id,
  6203. MatName = mat.Name,
  6204. AddTime = DateTime.Now,
  6205. PalletType = reqDto.PalletType
  6206. };
  6207. barinfo = _billInvinitrepository.InsertReturnEntity(barinfo);
  6208. }
  6209. try
  6210. {
  6211. _db.BeginTran();
  6212. //生成库存信息-分解方法
  6213. var createStockRes = CreateStock(new List<BillInvinit> { barinfo }, reqDto.PalletCode);
  6214. if (createStockRes.ResCode != 200)
  6215. {
  6216. _db.RollbackTran();
  6217. res.ResCode = createStockRes.ResCode;
  6218. res.ResMsg = createStockRes.ResMsg;
  6219. return res;
  6220. }
  6221. //生成流水数据-分解方法
  6222. var createInvFlowRes = CreateInvFlow(createStockRes.ResDataList);
  6223. if (createInvFlowRes.ResCode != 200)
  6224. {
  6225. _db.RollbackTran();
  6226. res.ResCode = createInvFlowRes.ResCode;
  6227. res.ResMsg = createInvFlowRes.ResMsg;
  6228. return res;
  6229. }
  6230. var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest
  6231. {
  6232. BusType = BusType.GetDescription(),
  6233. ContGrpBarCode = reqDto.PalletCode,
  6234. ContGrpId = createStockRes.ResDataList.First().ContGrpId,
  6235. Qty = reqDto.PalletNum.ObjToDecimal(),
  6236. EquCode = reqDto.StartLoc,
  6237. WarehouseCode = reqDto.WareCode,
  6238. Floor = reqDto.Floor,
  6239. Type = TaskType.EnterDepot
  6240. };
  6241. //下发wcs任务 - 分解方法
  6242. var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);
  6243. if (taskres.ResCode != 200)
  6244. {
  6245. _db.RollbackTran();
  6246. res.ResCode = taskres.ResCode;
  6247. res.ResMsg = taskres.ResMsg;
  6248. return res;
  6249. }
  6250. _db.CommitTran();
  6251. }
  6252. catch (Exception e)
  6253. {
  6254. _db.RollbackTran();
  6255. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6256. res.ResMsg = e.Message;
  6257. }
  6258. return res;
  6259. }
  6260. #endregion 立库
  6261. #region 巷道及货位分配
  6262. /// <summary>
  6263. /// 获取平库可用货位
  6264. /// </summary>
  6265. /// <param name="reqEntity"></param>
  6266. /// <returns></returns>
  6267. public SRes<FJApplyStockInLocResponse> FindAvailableFlatStorageSlot(FJApplyStockInLocRequest reqEntity)
  6268. {
  6269. var res = new SRes<FJApplyStockInLocResponse>
  6270. {
  6271. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  6272. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  6273. ResData = new FJApplyStockInLocResponse()
  6274. };
  6275. //检查任务是否异常
  6276. var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqEntity.TaskNum)
  6277. .SplitTable(tabs => tabs.Take(2)).First();
  6278. ;
  6279. if (wcstask == null)
  6280. {
  6281. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6282. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6283. return res;
  6284. }
  6285. if (wcstask.Type == TaskType.OutDepot)
  6286. {
  6287. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6288. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;
  6289. return res;
  6290. }
  6291. //验证仓库信息
  6292. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  6293. if (warehouse == null)
  6294. {
  6295. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  6296. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  6297. return res;
  6298. }
  6299. //验证库存
  6300. var stock = _billInvnowrepository.GetFirst(p =>
  6301. p.ContGrpBarCode == wcstask.BarCode.Trim() &&
  6302. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  6303. if (stock == null)
  6304. {
  6305. if (wcstask.BusType == FJTaskBusType.帘线退料重绕.GetDescription())
  6306. {
  6307. var nov = new BillInvnow
  6308. {
  6309. WarehouseId = warehouse.Id,
  6310. ContGrpBarCode = wcstask.BarCode,
  6311. ContGrpId = IdFactory.NewId(),
  6312. BoxBarCode = "",
  6313. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  6314. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  6315. MatId = default,
  6316. MatCode = "",
  6317. MatName = "",
  6318. RFIDBarCode = wcstask.BarCode,
  6319. HWBarCode = wcstask.BarCode,
  6320. HWTypeCode = "",
  6321. InvInOut = FJInvInOutType.In,
  6322. Size = 1,
  6323. ContGrpType = FJContGrpType.EmptyPal,
  6324. LengthQty = 0 //存放托盘数量
  6325. };
  6326. _db.BeginTran();
  6327. _billInvnowrepository.Insert(nov);
  6328. _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));
  6329. _db.CommitTran();
  6330. }
  6331. else
  6332. {
  6333. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6334. res.ResMsg = "没有库存信息";
  6335. return res;
  6336. }
  6337. }
  6338. //找到可用货位
  6339. var loc1ist = _basewarecellrepository.Context
  6340. .Queryable<BaseWarecell>()
  6341. .Where(loc1 => loc1.IsStop == 0
  6342. && loc1.StateNum == FjLocationState.Empty
  6343. && loc1.TypeNum == FjLocationType.Pingku
  6344. && loc1.Code == reqEntity.PickUpEquipmentNo
  6345. && loc1.WarehouseId == warehouse.Id
  6346. && loc1.Depth == 1)
  6347. //.Where(loc1 => loc1.Tunnel == reqEntity.TunnelNum)
  6348. .Select(loc1 => new
  6349. {
  6350. loc1.Code,
  6351. loc1.Id,
  6352. loc1.Row,
  6353. loc1.Col,
  6354. loc1.Layer,
  6355. loc1.Tunnel
  6356. }).ToList();
  6357. if (loc1ist.Any())
  6358. {
  6359. var resloc = loc1ist.ToList().OrderBy(x => x.Code).First();
  6360. res.ResData.TunnelNum = resloc.Tunnel.ToString();
  6361. res.ResData.WarehuoseId = warehouse.Id;
  6362. res.ResData.CellNo = resloc.Code;
  6363. res.ResData.Row = resloc.Row;
  6364. res.ResData.Colomn = resloc.Col;
  6365. res.ResData.Layer = resloc.Layer;
  6366. try
  6367. {
  6368. _db.BeginTran();
  6369. var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  6370. .Where(x => x.Id == wcstask.Id).SplitTable(x => x.Take(2)).First();
  6371. //更新货位
  6372. _basewarecellrepository.UpdateModelColumns(
  6373. p => new BaseWarecell
  6374. {
  6375. StateNum = FjLocationState.StockIn,
  6376. ContGrpBarCode = "",
  6377. ContGrpId = 0,
  6378. EditTime = DateTime.Now
  6379. },
  6380. p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);
  6381. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  6382. {
  6383. AddrTo = res.ResData.CellNo
  6384. }, x => x.Id == task.Id);
  6385. _db.CommitTran();
  6386. }
  6387. catch (Exception ex)
  6388. {
  6389. _db.RollbackTran();
  6390. _logger.LogInformation(ex.ToString());
  6391. }
  6392. return res;
  6393. }
  6394. res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  6395. res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  6396. return res;
  6397. }
  6398. /// <summary>
  6399. /// 分配货位
  6400. /// </summary>
  6401. /// <param name="request"></param>
  6402. /// <returns></returns>
  6403. public SRes<FJApplyStockInLocResponse> ApplyStockInLoc(FJApplyStockInLocRequest reqEntity)
  6404. {
  6405. var res = new SRes<FJApplyStockInLocResponse>
  6406. {
  6407. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  6408. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  6409. ResData = new FJApplyStockInLocResponse()
  6410. };
  6411. res = ApplyStockInLocTemp(reqEntity);
  6412. if (string.IsNullOrEmpty(res.ResData.CellNo)) return res;
  6413. try
  6414. {
  6415. _db.BeginTran();
  6416. var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  6417. .Where(x => x.Id == reqEntity.TaskNum).SplitTable(x => x.Take(2)).First();
  6418. if (task == null)
  6419. {
  6420. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6421. res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6422. return res;
  6423. }
  6424. if (task.Type == TaskType.OutDepot)
  6425. {
  6426. res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6427. res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;
  6428. return res;
  6429. }
  6430. var stock = _billInvnowrepository.GetFirst(p =>
  6431. p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  6432. //更新货位
  6433. _basewarecellrepository.UpdateModelColumns(
  6434. p => new BaseWarecell
  6435. {
  6436. StateNum = FjLocationState.StockIn,
  6437. ContGrpBarCode = "",
  6438. ContGrpId = 0,
  6439. EditTime = DateTime.Now
  6440. },
  6441. p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);
  6442. _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld
  6443. {
  6444. AddrTo = res.ResData.CellNo
  6445. }, x => x.Id == task.Id);
  6446. _db.CommitTran();
  6447. }
  6448. catch (Exception ex)
  6449. {
  6450. _db.RollbackTran();
  6451. _logger.LogInformation(ex.ToString());
  6452. }
  6453. return res;
  6454. }
  6455. /// <summary>
  6456. /// 分配货位
  6457. /// </summary>
  6458. /// <param name="request"></param>
  6459. /// <returns></returns>
  6460. public SRes<FJApplyStockInLocResponse> ApplyStockInLocTemp(FJApplyStockInLocRequest reqEntity)
  6461. {
  6462. var result = new SRes<FJApplyStockInLocResponse>
  6463. {
  6464. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  6465. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  6466. ResData = new FJApplyStockInLocResponse()
  6467. };
  6468. //检查任务是否异常
  6469. var wcstask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  6470. .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  6471. ;
  6472. if (wcstask == null)
  6473. {
  6474. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  6475. result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  6476. return result;
  6477. }
  6478. if (wcstask.Type == TaskType.OutDepot)
  6479. {
  6480. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6481. result.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;
  6482. return result;
  6483. }
  6484. if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "SRM") //如果目标地址不是堆垛机
  6485. {
  6486. result.ResData.TunnelNum = wcstask.Tunnel;
  6487. result.ResData.CellNo = wcstask.AddrTo;
  6488. result.ResData.Row = wcstask.AddrTo.Split('-')[0] != null ? int.Parse(wcstask.AddrTo.Split('-')[0]) : 0;
  6489. result.ResData.Colomn =
  6490. wcstask.AddrTo.Split('-')[1] != null ? int.Parse(wcstask.AddrTo.Split('-')[1]) : 0;
  6491. result.ResData.Layer =
  6492. wcstask.AddrTo.Split('-')[2] != null ? int.Parse(wcstask.AddrTo.Split('-')[2]) : 0;
  6493. return result;
  6494. }
  6495. if (reqEntity.TunnelNum <= 0)
  6496. {
  6497. result.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();
  6498. result.ResMsg = ResponseStatusCodeEnum.NotTunnelNum.GetDescription();
  6499. return result;
  6500. }
  6501. //验证仓库信息
  6502. var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);
  6503. if (warehouse == null)
  6504. {
  6505. result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  6506. result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  6507. return result;
  6508. }
  6509. //验证库存
  6510. var stock = _billInvnowrepository.GetFirst(p =>
  6511. p.ContGrpBarCode == wcstask.BarCode.Trim() &&
  6512. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  6513. if (stock == null)
  6514. {
  6515. if (wcstask.BusType == FJTaskBusType.芯股用空托盘入库.GetDescription())
  6516. {
  6517. var nov = new BillInvnow
  6518. {
  6519. WarehouseId = warehouse.Id,
  6520. ContGrpBarCode = wcstask.BarCode,
  6521. ContGrpId = IdFactory.NewId(),
  6522. BoxBarCode = "",
  6523. InvStateCode = InvState.InvEcecState_BuildUp.ToString(),
  6524. ExecStateCode = InvLockState.InvState_Normal.ToString(),
  6525. MatId = default,
  6526. MatCode = "",
  6527. MatName = "",
  6528. RFIDBarCode = wcstask.BarCode,
  6529. HWBarCode = wcstask.BarCode,
  6530. HWTypeCode = "",
  6531. InvInOut = FJInvInOutType.In,
  6532. Size = 1,
  6533. ContGrpType = FJContGrpType.EmptyPal,
  6534. LengthQty = 1 //存放托盘数量
  6535. };
  6536. _db.BeginTran();
  6537. _billInvnowrepository.Insert(nov);
  6538. _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));
  6539. _db.CommitTran();
  6540. }
  6541. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  6542. result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  6543. return result;
  6544. }
  6545. if (reqEntity.TunnelNum <= 0)
  6546. {
  6547. result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
  6548. result.ResMsg = "没有传巷道值";
  6549. return result;
  6550. }
  6551. return ApplyLoc(new FJApplyLocRequest
  6552. {
  6553. MaterialId = stock.MatId,
  6554. MaterialCode = stock.MatCode,
  6555. Size = reqEntity.Height,
  6556. TunnelNum = reqEntity.TunnelNum,
  6557. WarehuoseId = warehouse.Id,
  6558. IsMove = wcstask.Type == TaskType.TransferDepot
  6559. });
  6560. }
  6561. /// <summary>
  6562. /// 分配货位
  6563. /// </summary>
  6564. /// <param name="reqEntity"></param>
  6565. /// <returns></returns>
  6566. public SRes<FJApplyStockInLocResponse> ApplyLoc(FJApplyLocRequest reqEntity)
  6567. {
  6568. var result = new SRes<FJApplyStockInLocResponse>
  6569. {
  6570. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  6571. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  6572. ResData = new FJApplyStockInLocResponse()
  6573. };
  6574. //预留货位数量
  6575. var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0
  6576. && p.StateNum == FjLocationState.Empty
  6577. && p.TypeNum == FjLocationType.Storage
  6578. && p.Tunnel == reqEntity.TunnelNum
  6579. && p.WarehouseId == reqEntity.WarehuoseId
  6580. && p.Size == reqEntity.Size);
  6581. //判断是否移库
  6582. if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 2))
  6583. {
  6584. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  6585. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  6586. return result;
  6587. }
  6588. //找到可用货位
  6589. var loc1ist = _basewarecellrepository.Context
  6590. .Queryable<BaseWarecell>()
  6591. .Where(loc1 => loc1.IsStop == 0
  6592. && loc1.StateNum == FjLocationState.Empty
  6593. && loc1.TypeNum == FjLocationType.Storage
  6594. && loc1.Tunnel == reqEntity.TunnelNum
  6595. && loc1.WarehouseId == reqEntity.WarehuoseId
  6596. && loc1.Size == reqEntity.Size
  6597. && loc1.Depth == 1)
  6598. .Where(loc1 => loc1.Tunnel == reqEntity.TunnelNum)
  6599. .Select(loc1 => new
  6600. {
  6601. loc1.Code,
  6602. loc1.Id,
  6603. loc1.Row,
  6604. loc1.Col,
  6605. loc1.Layer,
  6606. loc1.Tunnel
  6607. }).ToList();
  6608. if (loc1ist.Any())
  6609. {
  6610. var resloc = loc1ist.ToList().OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();
  6611. result.ResData.TunnelNum = resloc.Tunnel.ToString();
  6612. result.ResData.WarehuoseId = reqEntity.WarehuoseId;
  6613. result.ResData.CellNo = resloc.Code;
  6614. result.ResData.Row = resloc.Row;
  6615. result.ResData.Colomn = resloc.Col;
  6616. result.ResData.Layer = resloc.Layer;
  6617. return result;
  6618. }
  6619. result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  6620. result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  6621. return result;
  6622. }
  6623. #endregion 巷道及货位分配
  6624. #region 二楼申请空托盘组出库
  6625. /// <summary>
  6626. /// 申请空托盘组出库任务
  6627. /// </summary>
  6628. /// <param name="reqDto"></param>
  6629. /// <returns></returns>
  6630. public SRes ApplyEmptyPalletGroupOutStorage(FjApplyEmptyPalletGroupOutStorageRequest reqDto)
  6631. {
  6632. var res = new SRes();
  6633. ////获取所有未被禁用的巷道
  6634. //var tunnel = _sysconfigrepository.AsQueryable().Where(p => p.SType == "OutStop" && string.IsNullOrEmpty(p.SContent)).ToList();
  6635. //if (!tunnel.Any())
  6636. //{
  6637. // res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6638. // res.ResMsg = +"没有可用巷道";
  6639. // return res;
  6640. //}
  6641. //检查对应目标地址是否有出库任务
  6642. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  6643. .Where(x => x.Status < TaskStatus.Finish && x.AddrTo == reqDto.AddTo).SplitTable(v => v.Take(2));
  6644. if (task.Any())
  6645. {
  6646. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6647. res.ResMsg = $"拆盘机{reqDto.AddTo}已存在未结束任务";
  6648. return res;
  6649. }
  6650. //计算巷道剩余空托盘数量
  6651. //TODO:跟据客户要救,暂时屏蔽调关于托盘类型的判断
  6652. var locationlist =
  6653. from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == FjLocationState.Full)
  6654. join stock in _billInvnowrepository.GetList(p =>
  6655. p.ContGrpType == FJContGrpType.EmptyCon &&
  6656. p.InvStateCode == InvState.InvEcecState_In.ToString() &&
  6657. p.ExecStateCode ==
  6658. InvLockState.InvState_Normal.ToString() && /*p.PalletType == reqDto.FJPalletType &&*/
  6659. p.ContGrpType == FJContGrpType.EmptyCon)
  6660. on loc.ContGrpBarCode equals stock.ContGrpBarCode
  6661. orderby stock.AddTime
  6662. select new
  6663. {
  6664. stock.MatCode,
  6665. stock.InvBarCode,
  6666. stock.RFIDBarCode,
  6667. stock.IsFast,
  6668. stock.Grade,
  6669. stock.IsSurplus,
  6670. stock.IsRework,
  6671. stock.InvStateCode,
  6672. stock.ProductTime,
  6673. loc.Col,
  6674. loc.Layer,
  6675. loc.Shelf,
  6676. loc.Depth,
  6677. loc.Code,
  6678. loc.Tunnel,
  6679. loc.WarehouseCode,
  6680. loc.ContGrpBarCode,
  6681. loc.Id,
  6682. loc.StateNum
  6683. };
  6684. locationlist = locationlist.Where(p => p.Tunnel == reqDto.Tunnel);
  6685. if (locationlist == null || !locationlist.Any())
  6686. {
  6687. res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();
  6688. res.ResMsg = reqDto.FJPalletType.GetDescription() +
  6689. ResponseStatusCodeEnum.NotEnoughStock.GetDescription();
  6690. return res;
  6691. }
  6692. locationlist = locationlist.OrderBy(p => p.ProductTime);
  6693. //出库任务
  6694. var temploc = locationlist.First();
  6695. var sotck = _billInvnowrepository.GetFirst(p =>
  6696. p.ContGrpBarCode == temploc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  6697. try
  6698. {
  6699. _db.BeginTran();
  6700. //货位表
  6701. _basewarecellrepository.UpdateModelColumns(
  6702. p => new BaseWarecell { StateNum = FjLocationState.StockOut }, p => p.Id == temploc.Id);
  6703. //库存表
  6704. _billInvnowrepository.UpdateModelColumns(
  6705. p => new BillInvnow
  6706. { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now },
  6707. p => p.Id == sotck.Id);
  6708. var invflow = _mapper.Map<BillInvflow>(sotck);
  6709. invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  6710. invflow.AddTime = DateTime.Now;
  6711. invflow.Id = IdFactory.NewId();
  6712. invflow.Memo = "空托出库";
  6713. _billInvflow.Insert(invflow);
  6714. //添加出库任务
  6715. CreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest
  6716. {
  6717. ContGrpBarCode = temploc.ContGrpBarCode,
  6718. CellNo = temploc.Code,
  6719. EquCode = reqDto.AddTo,
  6720. Floor = 2,
  6721. Qty = sotck.LengthQty,
  6722. Tunnel = temploc.Tunnel.ToString(),
  6723. WarehouseCode = temploc.WarehouseCode,
  6724. BusType = FJTaskBusType.二楼空托盘组出库
  6725. });
  6726. _db.CommitTran();
  6727. }
  6728. catch (Exception ex)
  6729. {
  6730. _db.RollbackTran();
  6731. _logger.LogInformation(ex.ToString());
  6732. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  6733. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  6734. return res;
  6735. }
  6736. return res;
  6737. }
  6738. /// <summary>
  6739. /// 创建WCS出库任务
  6740. /// </summary>
  6741. /// <param name="reqDto"></param>
  6742. /// <returns></returns>
  6743. public SRes<WCS_TaskInfo> CreateStockOutWcsTask(FJCreateStockOutWcsTaskRequest reqDto)
  6744. {
  6745. var res = new SRes<WCS_TaskInfo>();
  6746. var bus = reqDto.BusType.GetDescription();
  6747. var wcstask = new WCS_TaskInfo
  6748. {
  6749. Type = TaskType.OutDepot,
  6750. Status = TaskStatus.NewBuild,
  6751. Priority = 0,
  6752. Device = "SRM" + reqDto.Tunnel,
  6753. AddrFrom = reqDto.CellNo,
  6754. AddrTo = reqDto.EquCode,
  6755. LastInteractionPoint = "",
  6756. BarCode = reqDto.ContGrpBarCode,
  6757. Floor = reqDto.Floor,
  6758. Length = reqDto.Qty,
  6759. AddTime = DateTime.Now,
  6760. StartTime = DateTime.Now,
  6761. DocID = 0,
  6762. PalletType = 1,
  6763. ProdLine = 0,
  6764. AddWho = "wms",
  6765. WarehouseCode = reqDto.WarehouseCode,
  6766. Enabled = true,
  6767. WorkBench = reqDto.WorkBench,
  6768. Tunnel = reqDto.Tunnel,
  6769. BusType = bus
  6770. };
  6771. var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);
  6772. try
  6773. {
  6774. _db.BeginTran();
  6775. var task = _taskrepository.InsertReturnEntity(wcstask);
  6776. wcstaskhis.Id = task.ID;
  6777. _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);
  6778. var taskdetail = new WCS_TaskDtl
  6779. {
  6780. ID = Guid.NewGuid(),
  6781. CurPoint = reqDto.CellNo,
  6782. AddTime = DateTime.Now,
  6783. AddWho = "wms",
  6784. Enabled = true,
  6785. ParentTaskCode = task.ID,
  6786. Desc = reqDto.EquCode + "分拣空托盘组备料"
  6787. };
  6788. _taskdetailrepository.InsertableSplitTable(taskdetail);
  6789. _db.CommitTran();
  6790. res.ResData = task;
  6791. }
  6792. catch (Exception ex)
  6793. {
  6794. _db.RollbackTran();
  6795. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  6796. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  6797. _logger.LogInformation("保存任务异常:" + ex);
  6798. return res;
  6799. }
  6800. return res;
  6801. }
  6802. #endregion 二楼申请空托盘组出库
  6803. #region 容器、物料、条码、库存检测及创建,创建流水信息
  6804. /// <summary>
  6805. /// 检查容器是否存在,不存在则创建
  6806. /// </summary>
  6807. /// <param name="contBarCode">容器条码</param>
  6808. /// <param name="fjContainerType">容器类型</param>
  6809. /// <returns></returns>
  6810. public SRes CheckContinfo(string contBarCode, FJContainerType fjContainerType)
  6811. {
  6812. var res = new SRes();
  6813. var container = _baseContinfo.GetSingle(x => x.ContBarCode == contBarCode);
  6814. if (container == null)
  6815. {
  6816. //创建容器信息
  6817. var cont = new BaseContinfo
  6818. {
  6819. ContBarCode = contBarCode,
  6820. Name = contBarCode,
  6821. TypeCode = fjContainerType.ToString(),
  6822. PrintQty = 1,
  6823. IsStop = 0,
  6824. WarehouseId = 0,
  6825. AddWho = "WMS",
  6826. AddTime = DateTime.Now
  6827. };
  6828. //加载新的容器信息
  6829. if (!_baseContinfo.Insert(cont))
  6830. {
  6831. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  6832. res.ResMsg = "托盘初始化失败";
  6833. return res;
  6834. }
  6835. }
  6836. else if (container.IsStop != 0)
  6837. {
  6838. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6839. res.ResMsg = "容器已停用";
  6840. return res;
  6841. }
  6842. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6843. return res;
  6844. }
  6845. /// <summary>
  6846. /// 跟据库存信息创建流水信息
  6847. /// </summary>
  6848. /// <param name="barlist">库存信息</param>
  6849. /// <returns></returns>
  6850. public SRes CreateInvFlow(List<BillInvnow> barlist)
  6851. {
  6852. var res = new SRes();
  6853. var listflow = _mapper.Map<List<BillInvflow>>(barlist);
  6854. foreach (var item in listflow)
  6855. {
  6856. item.AddTime = DateTime.Now;
  6857. item.Id = IdFactory.NewId();
  6858. }
  6859. _billInvflow.InsertRange(listflow);
  6860. return res;
  6861. }
  6862. /// <summary>
  6863. /// 跟据库存信息创建流水信息
  6864. /// </summary>
  6865. /// <param name="bar">库存信息</param>
  6866. /// <returns></returns>
  6867. public SRes CreateInvFlow(BillInvnow bar)
  6868. {
  6869. var res = new SRes();
  6870. var flow = _mapper.Map<BillInvflow>(bar);
  6871. flow.AddTime = DateTime.Now;
  6872. flow.Id = IdFactory.NewId();
  6873. _billInvflow.Insert(flow);
  6874. return res;
  6875. }
  6876. /// <summary>
  6877. /// 是否有空余货位
  6878. /// </summary>
  6879. /// <returns></returns>
  6880. public SRes IsThereAnySpaceVacancy()
  6881. {
  6882. var res = new SRes();
  6883. //验证有剩余货位
  6884. if (_basewarecellrepository
  6885. .GetList(p => p.IsStop == 0 && p.StateNum == FjLocationState.Empty && p.Size == 2).Count() < 2)
  6886. {
  6887. res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();
  6888. res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();
  6889. return res;
  6890. }
  6891. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6892. return res;
  6893. }
  6894. /// <summary>
  6895. /// 检查传入的仓库是否存在
  6896. /// </summary>
  6897. /// <param name="wareCode">仓库编号</param>
  6898. /// <returns></returns>
  6899. public SRes CheckWareCode(string wareCode)
  6900. {
  6901. var res = new SRes();
  6902. //验证是否有对应仓库
  6903. var warehosue = _basewarehouserepository.GetSingle(p => p.Code == wareCode);
  6904. if (warehosue == null)
  6905. {
  6906. res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();
  6907. res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();
  6908. return res;
  6909. }
  6910. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6911. return res;
  6912. }
  6913. /// <summary>
  6914. /// 验证空托盘是否有未结束的任务
  6915. /// </summary>
  6916. /// <param name="PalletCode"></param>
  6917. /// <returns></returns>
  6918. public SRes CheckNoFinishTask(string PalletCode)
  6919. {
  6920. var res = new SRes();
  6921. //验证当前托盘是否有未结束的任务
  6922. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  6923. .Where(p => p.BarCode == PalletCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();
  6924. if (task != null && task.Id > 0)
  6925. switch (task.Type)
  6926. {
  6927. case TaskType.SetPlate:
  6928. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6929. res.ResMsg = PalletCode + "该号组盘任务还未完成,请先完成组盘任务";
  6930. return res;
  6931. case TaskType.EnterDepot:
  6932. if (task.Status > TaskStatus.WaitingToExecute && task.Status < TaskStatus.Finish)
  6933. {
  6934. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6935. res.ResMsg = PalletCode + "已有进行中任务,请检查托盘条码是否重复";
  6936. return res;
  6937. }
  6938. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6939. res.ResMsg = PalletCode + "任务已创建,请勿重复申请";
  6940. return res;
  6941. case TaskType.OutDepot:
  6942. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6943. res.ResMsg = PalletCode + "该号出库任务还未完成,请先完成出库任务";
  6944. return res;
  6945. case TaskType.TransferDepot:
  6946. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6947. res.ResMsg = PalletCode + "该号移库任务还未完成,请先完成移库任务";
  6948. return res;
  6949. case TaskType.Delivery:
  6950. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6951. res.ResMsg = PalletCode + "该号输送任务还未完成,请先完成输送任务";
  6952. return res;
  6953. case TaskType.EmptyInit:
  6954. res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();
  6955. res.ResMsg = PalletCode + "该号空轮初始化任务还未完成,请先完成空轮初始化任务";
  6956. return res;
  6957. }
  6958. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6959. return res;
  6960. }
  6961. /// <summary>
  6962. /// 检查是否存在库存信息
  6963. /// </summary>
  6964. /// <param name="code">编码</param>
  6965. /// <returns></returns>
  6966. public SRes CheckInvnow(string code)
  6967. {
  6968. var res = new SRes();
  6969. //验证是否没有库存信息
  6970. var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code);
  6971. if (stock != null && stock.InvStateCode == FJInvState.InvEcecState_In.ToString())
  6972. {
  6973. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6974. res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复";
  6975. return res;
  6976. }
  6977. if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())
  6978. {
  6979. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  6980. res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成";
  6981. return res;
  6982. }
  6983. //else if (stock != null)
  6984. //{
  6985. // res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();
  6986. // res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();
  6987. // return res;
  6988. //}
  6989. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  6990. return res;
  6991. }
  6992. /// <summary>
  6993. /// 创建库存信息
  6994. /// 不验证容器是否存在
  6995. /// 不验证容器是否有未结束的任务
  6996. /// 不验条码信息是否存在
  6997. /// </summary>
  6998. /// <param name="barList">条码集合</param>
  6999. /// <param name="containerBarcode">容器编号</param>
  7000. /// <param name="containerType">容器类型</param>
  7001. /// <returns></returns>
  7002. public SRes<BillInvnow> CreateStock(List<BillInvinit> barList, string containerBarcode)
  7003. {
  7004. var res = new SRes<BillInvnow>();
  7005. if (string.IsNullOrEmpty(containerBarcode))
  7006. {
  7007. res.ResCode = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetHashCode();
  7008. res.ResMsg = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetDescription();
  7009. return res;
  7010. }
  7011. //将条码表映射到库存表
  7012. var stocklist = _mapper.Map<List<BillInvnow>>(barList);
  7013. foreach (var item in stocklist)
  7014. {
  7015. item.AddTime = DateTime.Now;
  7016. item.Id = IdFactory.NewId();
  7017. }
  7018. if (!_billInvnowrepository.InsertRange(stocklist))
  7019. {
  7020. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  7021. res.ResMsg = "托盘库存信息存储失败";
  7022. return res;
  7023. }
  7024. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  7025. res.ResDataList = stocklist;
  7026. return res;
  7027. }
  7028. /// <summary>
  7029. /// 创建WCS任务
  7030. /// </summary>
  7031. /// <param name="reqDto"></param>
  7032. /// <returns></returns>
  7033. public SRes<WCS_TaskInfo> CreateStockInWcsTask(FJCreateStockInWcsTaskRequest reqDto, string gra = "",
  7034. bool isBench = false)
  7035. {
  7036. var res = new SRes<WCS_TaskInfo>();
  7037. var wcsTask = new WCS_TaskInfo
  7038. {
  7039. Type = reqDto.Type,
  7040. Status = TaskStatus.NewBuild,
  7041. Priority = 0,
  7042. Device = "",
  7043. SrmStation = "",
  7044. AddrFrom = reqDto.EquCode,
  7045. AddrTo = "SRM",
  7046. LastInteractionPoint = "",
  7047. BarCode = reqDto.ContGrpBarCode,
  7048. Floor = reqDto.Floor,
  7049. Length = reqDto.Qty,
  7050. AddTime = DateTime.Now,
  7051. StartTime = DateTime.Now,
  7052. DocID = 0,
  7053. WorkOrder = reqDto.DocCode,
  7054. PalletType = 1,
  7055. ProdLine = 0,
  7056. AddWho = "WMS",
  7057. WarehouseCode = reqDto.WarehouseCode,
  7058. Enabled = true,
  7059. Height = reqDto.Height,
  7060. Grade = gra,
  7061. //WorkBench = reqDto.EquCode,
  7062. //MaterialCode = reqDto.MaterialCode,
  7063. MatCode = reqDto.MatCode,
  7064. BusType = reqDto.BusType,
  7065. GoodsType = reqDto.GoodsType
  7066. };
  7067. if (isBench) wcsTask.WorkBench = reqDto.EquCode;
  7068. var wcsTaskHis = _mapper.Map<WCS_TaskOld>(wcsTask);
  7069. try
  7070. {
  7071. var task = _taskrepository.InsertReturnEntity(wcsTask);
  7072. wcsTaskHis.Id = task.ID;
  7073. _wcstaskoldrepository.InsertableSplitTable(wcsTaskHis);
  7074. var taskDetail = new WCS_TaskDtl
  7075. {
  7076. ID = Guid.NewGuid(),
  7077. CurPoint = reqDto.EquCode,
  7078. AddTime = DateTime.Now,
  7079. AddWho = "WMS",
  7080. Enabled = true,
  7081. ParentTaskCode = task.ID,
  7082. Desc = reqDto.EquCode + "任务生成"
  7083. };
  7084. _taskdetailrepository.InsertableSplitTable(taskDetail);
  7085. res.ResData = task;
  7086. }
  7087. catch (Exception ex)
  7088. {
  7089. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  7090. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  7091. _logger.LogInformation("保存任务异常:" + ex);
  7092. return res;
  7093. }
  7094. return res;
  7095. }
  7096. #endregion 容器、物料、条码、库存检测及创建,创建流水信息
  7097. /// <summary>
  7098. /// 手动出库
  7099. /// </summary>
  7100. /// <param name="request"></param>
  7101. /// <returns></returns>
  7102. public string ManualTask(FJManualTaskRequest request)
  7103. {
  7104. var res = new SRes();
  7105. //必须要有货位信息
  7106. if (!request.Location.Any())
  7107. {
  7108. res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();
  7109. res.ResMsg = "货位" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();
  7110. return res.ToCamelCaseString();
  7111. }
  7112. try
  7113. {
  7114. foreach (var item in request.Location)
  7115. {
  7116. //货位信息验证
  7117. var location = _basewarecellrepository.GetSingle(p =>
  7118. p.Code == item && p.WarehouseCode == request.WarehouseCode);
  7119. if (location == null)
  7120. {
  7121. res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();
  7122. res.ResMsg = item + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();
  7123. return res.ToCamelCaseString();
  7124. }
  7125. if (location.StateNum != FjLocationState.Full)
  7126. {
  7127. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7128. res.ResMsg = item + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件";
  7129. return res.ToCamelCaseString();
  7130. }
  7131. if (location.IsStop == 1)
  7132. {
  7133. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7134. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "被禁用";
  7135. return res.ToCamelCaseString();
  7136. }
  7137. //库存信息验证
  7138. var stock = _billInvnowrepository.GetFirst(p =>
  7139. p.ContGrpBarCode == location.ContGrpBarCode &&
  7140. p.InvStateCode == InvState.InvEcecState_In.ToString());
  7141. if (stock == null)
  7142. {
  7143. res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  7144. res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7145. return res.ToCamelCaseString();
  7146. }
  7147. if (stock.InvStateCode != InvState.InvEcecState_In.ToString())
  7148. {
  7149. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7150. res.ResMsg = item + "组盘状态不是已入库";
  7151. return res.ToCamelCaseString();
  7152. }
  7153. var billTask = new WCS_TaskInfo();
  7154. billTask.Status = TaskStatus.NewBuild;
  7155. billTask.Type = TaskType.OutDepot;
  7156. billTask.Priority = 0;
  7157. billTask.Device = "SRM" + location.Tunnel;
  7158. billTask.AddrFrom = item;
  7159. billTask.AddrTo = request.AddTo;
  7160. billTask.BarCode = stock.ContGrpBarCode;
  7161. billTask.StartTime = DateTime.Now;
  7162. billTask.AddTime = DateTime.Now;
  7163. billTask.EditTime = DateTime.Now;
  7164. billTask.AddWho = "WMS";
  7165. billTask.WarehouseCode = location.WarehouseCode;
  7166. billTask.Enabled = true;
  7167. billTask.Floor = 2;
  7168. billTask.Tunnel = location.Tunnel.ToString();
  7169. billTask.PalletType = 1;
  7170. billTask.Length = stock.LengthQty;
  7171. billTask.MaterialCode = stock.MatCode;
  7172. billTask.OutType = OutTypeEnum.全自动手动出库任务;
  7173. billTask.BusType = FJTaskBusType.TaskBusType_FJ_ManualOut.GetDescription();
  7174. _db.BeginTran();
  7175. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell
  7176. {
  7177. StateNum = FjLocationState.StockOut,
  7178. EditTime = DateTime.Now
  7179. }, p => p.Code == item && p.WarehouseCode == request.WarehouseCode);
  7180. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  7181. {
  7182. InvStateCode = InvState.InvEcecState_OutGoing.ToString(),
  7183. EditTime = DateTime.Now
  7184. }, p => p.ContGrpBarCode == stock.ContGrpBarCode);
  7185. var flow = _mapper.Map<BillInvflow>(stock);
  7186. flow.Id = IdFactory.NewId();
  7187. flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();
  7188. flow.EditTime = DateTime.Now;
  7189. _billInvflow.Insert(flow);
  7190. var wcs = _taskrepository.InsertReturnEntity(billTask);
  7191. var wcshistory = _mapper.Map<WCS_TaskOld>(wcs);
  7192. _wcstaskoldrepository.InsertableSplitTable(wcshistory);
  7193. var taskdetail = new WCS_TaskDtl
  7194. {
  7195. ID = Guid.NewGuid(),
  7196. CurPoint = item,
  7197. AddTime = DateTime.Now,
  7198. AddWho = "wms",
  7199. Enabled = true,
  7200. ParentTaskCode = wcs.ID,
  7201. Desc = wcs.OutType.ToString()
  7202. };
  7203. _taskdetailrepository.InsertableSplitTable(taskdetail);
  7204. _db.CommitTran();
  7205. }
  7206. }
  7207. catch (Exception ex)
  7208. {
  7209. _db.RollbackTran();
  7210. _logger.LogInformation("手动出库异常:" + ex.Message);
  7211. res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();
  7212. res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();
  7213. return res.ToCamelCaseString();
  7214. }
  7215. return res.ToCamelCaseString();
  7216. }
  7217. /// <summary>
  7218. /// 堆垛机出库完成
  7219. /// </summary>
  7220. /// <param name="reqDto"></param>
  7221. /// <returns></returns>
  7222. public SRes<int> SrmPickOutCompleted(SrmPickOutCompletedRequest reqDto)
  7223. {
  7224. var result = new SRes<int>
  7225. {
  7226. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  7227. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  7228. ResData = reqDto.TaskNum
  7229. };
  7230. var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqDto.TaskNum)
  7231. .SplitTable(tabs => tabs.Take(2)).First();
  7232. ;
  7233. if (wcstask == null || wcstask.Id <= 0)
  7234. {
  7235. result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7236. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7237. return result;
  7238. }
  7239. if (wcstask.Type != TaskType.OutDepot)
  7240. {
  7241. result.ResCode = ResponseStatusCodeEnum.OnlyStockOutAvil.GetHashCode();
  7242. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.OnlyStockOutAvil.GetDescription();
  7243. return result;
  7244. }
  7245. if (wcstask.Status >= TaskStatus.Finish)
  7246. {
  7247. result.ResCode = ResponseStatusCodeEnum.StateNotUpdate.GetHashCode();
  7248. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StateNotUpdate.GetDescription();
  7249. return result;
  7250. }
  7251. try
  7252. {
  7253. var well = _basewarecellrepository.GetSingle(x =>
  7254. x.ContGrpBarCode == wcstask.BarCode && x.Code.Contains(wcstask.AddrFrom) &&
  7255. (x.WarehouseCode == wcstask.WarehouseCode || wcstask.Device == "CR"));
  7256. if (well == null)
  7257. {
  7258. result.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  7259. result.ResMsg = reqDto.TaskNum + "任务已结束";
  7260. return result;
  7261. }
  7262. var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == well.WarehouseId);
  7263. _db.BeginTran();
  7264. switch (wareHouse.TypeNum)
  7265. {
  7266. case FjLocationType.Storage:
  7267. //更新库存
  7268. _billInvnowrepository.UpdateModelColumns(
  7269. p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },
  7270. p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&
  7271. p.ContGrpBarCode == wcstask.BarCode);
  7272. break;
  7273. case FjLocationType.Virtual:
  7274. //更新库存
  7275. _billInvnowrepository.UpdateModelColumns(
  7276. p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },
  7277. p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&
  7278. p.ContGrpBarCode == wcstask.BarCode);
  7279. break;
  7280. case FjLocationType.Pingku:
  7281. _billInvnowrepository.UpdateModelColumns(
  7282. p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },
  7283. p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&
  7284. p.ContGrpBarCode == wcstask.BarCode);
  7285. break;
  7286. case FjLocationType.RingLibrary:
  7287. //更新库存
  7288. _billInvnowrepository.UpdateModelColumns(
  7289. p => new BillInvnow
  7290. {
  7291. PutRow = 0, PutCol = 0, PutLayer = 0,
  7292. InvStateCode = FJInvState.InvEcecState_BuildUp.ToString()
  7293. },
  7294. p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&
  7295. (p.ContGrpBarCode == wcstask.BarCode || p.HWBarCode == wcstask.BarCode));
  7296. break;
  7297. }
  7298. var stocklist = _billInvnowrepository.GetList(p =>
  7299. (p.ContGrpBarCode == wcstask.BarCode || p.HWBarCode == wcstask.BarCode) &&
  7300. (p.InvStateCode == InvState.InvEcecState_BuildUp.ToString() ||
  7301. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString()));
  7302. if (stocklist == null || !stocklist.Any())
  7303. {
  7304. result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  7305. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7306. return result;
  7307. }
  7308. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  7309. foreach (var item in flowlist)
  7310. {
  7311. item.Id = IdFactory.NewId();
  7312. item.AddTime = DateTime.Now;
  7313. item.Memo = "设备出库放货完成";
  7314. }
  7315. //货位
  7316. _basewarecellrepository.UpdateModelColumns(
  7317. p => new BaseWarecell
  7318. {
  7319. StateNum = FjLocationState.Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now,
  7320. GroupID = 0, XYNO = 0
  7321. },
  7322. p => p.ContGrpBarCode == wcstask.BarCode && p.Code.Contains(wcstask.AddrFrom) &&
  7323. (p.WarehouseCode == wcstask.WarehouseCode || wcstask.Device == "CR"));
  7324. _billInvflow.InsertRange(flowlist);
  7325. _db.CommitTran();
  7326. }
  7327. catch (Exception ex)
  7328. {
  7329. _db.RollbackTran();
  7330. _logger.LogInformation(ex.ToString());
  7331. result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();
  7332. result.ResMsg = wcstask.Id + "设备出库放货完成异常";
  7333. }
  7334. return result;
  7335. }
  7336. /// <summary>
  7337. /// 完成任务
  7338. /// </summary>
  7339. /// <param name="reqDto"></param>
  7340. /// <returns></returns>
  7341. public SRes<int> CompleteTask(CompleteTaskRequest reqDto)
  7342. {
  7343. var result = new SRes<int>
  7344. {
  7345. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  7346. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),
  7347. ResData = reqDto.TaskNum
  7348. };
  7349. //检查历史任务表是否有任务
  7350. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  7351. .Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  7352. var isBackRewind = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  7353. .Where(p => p.Id == reqDto.TaskNum && p.BusType == FJTaskBusType.帘线退料重绕.GetDescription()).SplitTable(tabs => tabs.Take(2)).Any();
  7354. var isRewindIn = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)
  7355. .Where(p => p.Id == reqDto.TaskNum && p.BusType == FJTaskBusType.重绕满托入库.GetDescription()).SplitTable(tabs => tabs.Take(2)).Any();
  7356. if (task == null)
  7357. {
  7358. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7359. return result;
  7360. }
  7361. switch (task.Type)
  7362. {
  7363. case TaskType.SetPlate:
  7364. try
  7365. {
  7366. //检查库存信息是否正确
  7367. var stock = _billInvnowrepository.GetFirst(p =>
  7368. p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode);
  7369. if (stock == null)
  7370. {
  7371. result.ResMsg = task.BarCode + "没有库存信息";
  7372. return result;
  7373. }
  7374. var wareCell = _basewarecellrepository.GetFirst(x =>
  7375. x.ContGrpBarCode == stock.ContGrpBarCode && x.WarehouseId == stock.WarehouseId);
  7376. if (stock.InvStateCode == InvState.InvEcecState_In.ToString() &&
  7377. wareCell.StateNum == FjLocationState.Full) //如果库存状态是入库,货位状态是有货直接返回成功,避免WCS重复调用造成出库异常
  7378. return result;
  7379. if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())
  7380. {
  7381. result.ResMsg = task.BarCode + $"库存状态错误{stock.InvStateCode}";
  7382. return result;
  7383. }
  7384. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);
  7385. _db.BeginTran();
  7386. var row = int.Parse(task.AddrTo.Split('-')[0]);
  7387. var col = int.Parse(task.AddrTo.Split('-')[1]);
  7388. var layer = int.Parse(task.AddrTo.Split('-')[2]);
  7389. //更新库存
  7390. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow
  7391. {
  7392. WarehouseId = warehouse.Id,
  7393. InvStateCode = InvState.InvEcecState_In.ToString(),
  7394. PutRow = row,
  7395. PutCol = col,
  7396. PutLayer = layer,
  7397. OneInTime = DateTime.Now,
  7398. EditTime = DateTime.Now
  7399. },
  7400. p => p.HWBarCode == task.BarCode &&
  7401. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7402. //更新货位
  7403. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7404. {
  7405. StateNum = FjLocationState.Full,
  7406. ContGrpBarCode = stock.HWBarCode,
  7407. ContGrpId = stock.ContGrpId,
  7408. EditTime = DateTime.Now
  7409. }, p => p.Code == task.AddrTo && p.WarehouseId == warehouse.Id);
  7410. //增加流水信息
  7411. var enterDepotstocklist = _billInvnowrepository.GetList(p =>
  7412. p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7413. foreach (var item in enterDepotstocklist)
  7414. {
  7415. item.Id = IdFactory.NewId();
  7416. item.AddTime = DateTime.Now;
  7417. }
  7418. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));
  7419. _db.CommitTran();
  7420. }
  7421. catch (Exception ex)
  7422. {
  7423. _db.RollbackTran();
  7424. result.ResMsg = task.Id + "完成任务异常";
  7425. _logger.LogInformation("完成任务异常" + ex);
  7426. }
  7427. break;
  7428. case TaskType.EnterDepot:
  7429. try
  7430. {
  7431. //退料
  7432. if (isBackRewind)
  7433. {
  7434. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);
  7435. _db.BeginTran();
  7436. if (task.AddrTo == "9001" || task.AddrTo == "9101")
  7437. {
  7438. }
  7439. else if(task.AddrTo.StartsWith("92"))//退料缓存区
  7440. {
  7441. //检查库存信息是否正确
  7442. var stock = _billInvnowrepository.GetFirst(p =>
  7443. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)
  7444. && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7445. if (stock == null)
  7446. {
  7447. result.ResMsg = task.BarCode + "没有已组盘的信息";
  7448. return result;
  7449. }
  7450. //更新库存
  7451. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow
  7452. {
  7453. InvStateCode = InvState.InvEcecState_In.ToString(),
  7454. WarehouseId = warehouse.Id,
  7455. OneInTime = DateTime.Now,
  7456. EditTime = DateTime.Now
  7457. },
  7458. p => p.ContGrpBarCode == task.BarCode &&
  7459. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7460. //更新货位
  7461. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7462. {
  7463. StateNum = FjLocationState.Full,
  7464. ContGrpBarCode = stock.ContGrpBarCode,
  7465. ContGrpId = stock.ContGrpId,
  7466. EditTime = DateTime.Now
  7467. }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);
  7468. }
  7469. _db.CommitTran();
  7470. }
  7471. //组盘入库
  7472. else if (isRewindIn)
  7473. {
  7474. //检查库存信息是否正确
  7475. var stock = _billInvnowrepository.GetFirst(p =>
  7476. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)
  7477. && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7478. if (stock == null)
  7479. {
  7480. result.ResMsg = task.BarCode + "没有已组盘的信息";
  7481. return result;
  7482. }
  7483. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);
  7484. _db.BeginTran();
  7485. //更新库存
  7486. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow
  7487. {
  7488. InvStateCode = InvState.InvEcecState_In.ToString(),
  7489. WarehouseId = warehouse.Id,
  7490. OneInTime = DateTime.Now,
  7491. EditTime = DateTime.Now
  7492. },
  7493. p => p.ContGrpBarCode == task.BarCode &&
  7494. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7495. //更新货位
  7496. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7497. {
  7498. StateNum = FjLocationState.Full,
  7499. ContGrpBarCode = stock.ContGrpBarCode,
  7500. ContGrpId = stock.ContGrpId,
  7501. EditTime = DateTime.Now
  7502. }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);
  7503. //增加流水信息
  7504. var enterDepotstocklist = _billInvnowrepository.GetList(p =>
  7505. p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7506. foreach (var item in enterDepotstocklist)
  7507. {
  7508. item.Id = IdFactory.NewId();
  7509. item.AddTime = DateTime.Now;
  7510. }
  7511. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));
  7512. //添加反馈信息
  7513. var pushtype = fjFackbeekType.InterfaceType_FJ_StockIn.ToString();
  7514. var list = new List<BillPushinfo>();
  7515. foreach (var item in enterDepotstocklist)
  7516. list.Add(new BillPushinfo
  7517. {
  7518. DocsNo = stock.ExecDocsNo,
  7519. TypeCode = pushtype,
  7520. RFIDBarCode = stock.ContGrpBarCode,
  7521. HWBarCode = item.HWBarCode,
  7522. CLBarCode = item.CLBarCode,
  7523. WarehouseId = warehouse.Id,
  7524. WarehouseCode = warehouse.Code,
  7525. WareCellId = 0,
  7526. WareCellCode = task.AddrTo,
  7527. MatId = item.MatId,
  7528. MatCode = item.MatCode,
  7529. MatName = item.MatName,
  7530. TolWQty = item.TolWQty,
  7531. NetWQty = item.NetWQty,
  7532. TareWQty = item.TareWQty,
  7533. ReqNo = Guid.NewGuid().ToString()
  7534. });
  7535. if (stock.ContGrpType == FJContGrpType.Material) _billPushinforepository.InsertRange(list);
  7536. _db.CommitTran();
  7537. }
  7538. else
  7539. {
  7540. //检查库存信息是否正确
  7541. var stock = _billInvnowrepository.GetFirst(p =>
  7542. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)
  7543. && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7544. if (stock == null)
  7545. {
  7546. result.ResMsg = task.BarCode + "没有已组盘的信息";
  7547. return result;
  7548. }
  7549. var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);
  7550. _db.BeginTran();
  7551. var row = int.Parse(task.AddrTo.Split('-')[0]);
  7552. var col = int.Parse(task.AddrTo.Split('-')[1]);
  7553. var layer = int.Parse(task.AddrTo.Split('-')[2]);
  7554. //更新库存
  7555. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow
  7556. {
  7557. InvStateCode = InvState.InvEcecState_In.ToString(),
  7558. WarehouseId = warehouse.Id,
  7559. PutRow = row,
  7560. PutCol = col,
  7561. PutLayer = layer,
  7562. OneInTime = DateTime.Now,
  7563. EditTime = DateTime.Now
  7564. },
  7565. p => p.ContGrpBarCode == task.BarCode &&
  7566. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7567. //更新货位
  7568. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7569. {
  7570. StateNum = FjLocationState.Full,
  7571. ContGrpBarCode = stock.ContGrpBarCode,
  7572. ContGrpId = stock.ContGrpId,
  7573. EditTime = DateTime.Now
  7574. }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);
  7575. //增加流水信息
  7576. var enterDepotstocklist = _billInvnowrepository.GetList(p =>
  7577. p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7578. foreach (var item in enterDepotstocklist)
  7579. {
  7580. item.Id = IdFactory.NewId();
  7581. item.AddTime = DateTime.Now;
  7582. }
  7583. _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));
  7584. //添加反馈信息
  7585. var pushtype = fjFackbeekType.InterfaceType_FJ_StockIn.ToString();
  7586. var list = new List<BillPushinfo>();
  7587. foreach (var item in enterDepotstocklist)
  7588. list.Add(new BillPushinfo
  7589. {
  7590. DocsNo = stock.ExecDocsNo,
  7591. TypeCode = pushtype,
  7592. RFIDBarCode = stock.ContGrpBarCode,
  7593. HWBarCode = item.HWBarCode,
  7594. CLBarCode = item.CLBarCode,
  7595. WarehouseId = warehouse.Id,
  7596. WarehouseCode = warehouse.Code,
  7597. WareCellId = 0,
  7598. WareCellCode = task.AddrTo,
  7599. MatId = item.MatId,
  7600. MatCode = item.MatCode,
  7601. MatName = item.MatName,
  7602. TolWQty = item.TolWQty,
  7603. NetWQty = item.NetWQty,
  7604. TareWQty = item.TareWQty,
  7605. ReqNo = Guid.NewGuid().ToString()
  7606. });
  7607. if (stock.ContGrpType == FJContGrpType.Material) _billPushinforepository.InsertRange(list);
  7608. _db.CommitTran();
  7609. }
  7610. }
  7611. catch (Exception ex)
  7612. {
  7613. _db.RollbackTran();
  7614. result.ResMsg = task.Id + "完成任务异常";
  7615. _logger.LogInformation("完成任务异常" + ex);
  7616. }
  7617. break;
  7618. case TaskType.OutDepot:
  7619. //验证库存信息
  7620. var stocklist = _billInvnowrepository.GetList(p =>
  7621. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&
  7622. (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||
  7623. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));
  7624. if (stocklist == null || !stocklist.Any())
  7625. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7626. var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);
  7627. foreach (var item in flowlist)
  7628. {
  7629. item.Id = IdFactory.NewId();
  7630. item.InvStateCode = InvState.InvEcecState_Out.ToString();
  7631. item.AddTime = DateTime.Now;
  7632. item.Memo = "任务完成";
  7633. }
  7634. try
  7635. {
  7636. _db.BeginTran();
  7637. //删除库存及条码信息
  7638. var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);
  7639. switch (wareHouse.TypeNum)
  7640. {
  7641. case FjLocationType.Storage: //立库出库需要删除库存信息
  7642. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));
  7643. var hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();
  7644. _billInvinitrepository.Delete(p =>
  7645. hWBarCode.Contains(p.HWBarCode) &&
  7646. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7647. var contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();
  7648. _billInvinitrepository.Delete(p =>
  7649. contGrpBarCode.Contains(p.ContGrpBarCode) &&
  7650. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7651. _billSpoolTransrepository.Delete(p =>
  7652. stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));
  7653. _logger.LogInformation(
  7654. $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");
  7655. //更新货位信息
  7656. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7657. {
  7658. StateNum = FjLocationState.Empty,
  7659. ContGrpBarCode = "",
  7660. ContGrpId = 0,
  7661. EditTime = DateTime.Now
  7662. },
  7663. p => p.StateNum == FjLocationState.StockOut && p.ContGrpBarCode == task.BarCode &&
  7664. p.Code.Contains(task.AddrFrom) && p.WarehouseCode == task.WarehouseCode);
  7665. //更新流水信息
  7666. _billInvflow.InsertRange(flowlist);
  7667. //添加反馈信息
  7668. var pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();
  7669. var list = new List<BillPushinfo>();
  7670. foreach (var item in stocklist)
  7671. list.Add(new BillPushinfo
  7672. {
  7673. DocsNo = item.ExecDocsNo,
  7674. TypeCode = pushtype,
  7675. RFIDBarCode = item.ContGrpBarCode,
  7676. HWBarCode = item.HWBarCode,
  7677. CLBarCode = item.CLBarCode,
  7678. WarehouseId = wareHouse.Id,
  7679. WarehouseCode = wareHouse.Code,
  7680. WareCellId = 0,
  7681. WareCellCode = task.AddrTo,
  7682. MatId = item.MatId,
  7683. MatCode = item.MatCode,
  7684. MatName = item.MatName,
  7685. TolWQty = item.TolWQty,
  7686. NetWQty = item.NetWQty,
  7687. TareWQty = item.TareWQty,
  7688. ReqNo = Guid.NewGuid().ToString()
  7689. });
  7690. if (stocklist.First().ContGrpType == FJContGrpType.Material)
  7691. _billPushinforepository.InsertRange(list);
  7692. _db.CommitTran();
  7693. break;
  7694. case FjLocationType.RingLibrary: //环形库的库存信息变更是在SrmPickOutCompleted
  7695. break;
  7696. case FjLocationType.Pingku:
  7697. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));
  7698. hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();
  7699. _billInvinitrepository.Delete(p =>
  7700. hWBarCode.Contains(p.HWBarCode) &&
  7701. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7702. contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();
  7703. _billInvinitrepository.Delete(p =>
  7704. contGrpBarCode.Contains(p.ContGrpBarCode) &&
  7705. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7706. _billSpoolTransrepository.Delete(p =>
  7707. stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));
  7708. _logger.LogInformation(
  7709. $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");
  7710. //更新货位信息
  7711. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7712. {
  7713. StateNum = FjLocationState.Empty,
  7714. ContGrpBarCode = "",
  7715. ContGrpId = 0,
  7716. EditTime = DateTime.Now
  7717. },
  7718. p => p.StateNum == FjLocationState.StockOut && p.ContGrpBarCode == task.BarCode &&
  7719. p.Code.Contains(task.AddrFrom) && (p.WarehouseCode == task.WarehouseCode || task.Device == "CR"));
  7720. //更新流水信息
  7721. _billInvflow.InsertRange(flowlist);
  7722. //添加反馈信息
  7723. pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();
  7724. list = new List<BillPushinfo>();
  7725. foreach (var item in stocklist)
  7726. list.Add(new BillPushinfo
  7727. {
  7728. DocsNo = item.ExecDocsNo,
  7729. TypeCode = pushtype,
  7730. RFIDBarCode = item.ContGrpBarCode,
  7731. HWBarCode = item.HWBarCode,
  7732. CLBarCode = item.CLBarCode,
  7733. WarehouseId = wareHouse.Id,
  7734. WarehouseCode = wareHouse.Code,
  7735. WareCellId = 0,
  7736. WareCellCode = task.AddrTo,
  7737. MatId = item.MatId,
  7738. MatCode = item.MatCode,
  7739. MatName = item.MatName,
  7740. TolWQty = item.TolWQty,
  7741. NetWQty = item.NetWQty,
  7742. TareWQty = item.TareWQty,
  7743. ReqNo = Guid.NewGuid().ToString()
  7744. });
  7745. if (stocklist.First().ContGrpType == FJContGrpType.Material)
  7746. _billPushinforepository.InsertRange(list);
  7747. _db.CommitTran();
  7748. break;
  7749. case FjLocationType.Virtual:
  7750. _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));
  7751. hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();
  7752. _billInvinitrepository.Delete(p =>
  7753. hWBarCode.Contains(p.HWBarCode) &&
  7754. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7755. contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();
  7756. _billInvinitrepository.Delete(p =>
  7757. contGrpBarCode.Contains(p.ContGrpBarCode) &&
  7758. p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());
  7759. _billSpoolTransrepository.Delete(p =>
  7760. stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));
  7761. _logger.LogInformation(
  7762. $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");
  7763. if (task.BusType == FJTaskBusType.车间叫料.ToString() && task.AddrFrom.Contains("NSTJ"))
  7764. //更新货位信息
  7765. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7766. {
  7767. StateNum = FjLocationState.Empty,
  7768. ContGrpBarCode = "",
  7769. ContGrpId = 0,
  7770. EditTime = DateTime.Now
  7771. },
  7772. p => p.StateNum == FjLocationState.StockOut &&
  7773. p.ContGrpBarCode == task.BarCode &&
  7774. p.Code.Contains(task.AddrFrom) && p.WarehouseCode == "FJXG");
  7775. else
  7776. //更新货位信息
  7777. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7778. {
  7779. StateNum = FjLocationState.Empty,
  7780. ContGrpBarCode = "",
  7781. ContGrpId = 0,
  7782. EditTime = DateTime.Now
  7783. },
  7784. p => p.StateNum == FjLocationState.StockOut &&
  7785. p.ContGrpBarCode == task.BarCode &&
  7786. p.Code.Contains(task.AddrFrom) && p.WarehouseCode == task.WarehouseCode);
  7787. //更新流水信息
  7788. _billInvflow.InsertRange(flowlist);
  7789. //添加反馈信息
  7790. pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();
  7791. list = new List<BillPushinfo>();
  7792. foreach (var item in stocklist)
  7793. list.Add(new BillPushinfo
  7794. {
  7795. DocsNo = item.ExecDocsNo,
  7796. TypeCode = pushtype,
  7797. RFIDBarCode = item.ContGrpBarCode,
  7798. HWBarCode = item.HWBarCode,
  7799. CLBarCode = item.CLBarCode,
  7800. WarehouseId = wareHouse.Id,
  7801. WarehouseCode = wareHouse.Code,
  7802. WareCellId = 0,
  7803. WareCellCode = task.AddrTo,
  7804. MatId = item.MatId,
  7805. MatCode = item.MatCode,
  7806. MatName = item.MatName,
  7807. TolWQty = item.TolWQty,
  7808. NetWQty = item.NetWQty,
  7809. TareWQty = item.TareWQty,
  7810. ReqNo = Guid.NewGuid().ToString()
  7811. });
  7812. if (stocklist.First().ContGrpType == FJContGrpType.Material)
  7813. _billPushinforepository.InsertRange(list);
  7814. _db.CommitTran();
  7815. break;
  7816. default:
  7817. throw new ArgumentOutOfRangeException();
  7818. }
  7819. }
  7820. catch (Exception ex)
  7821. {
  7822. _db.RollbackTran();
  7823. _logger.LogInformation(ex.ToString());
  7824. result.ResMsg = task.Id + "完成任务异常";
  7825. }
  7826. break;
  7827. case TaskType.TransferDepot:
  7828. var fromcell = _basewarecellrepository.GetFirst(p =>
  7829. p.Code == task.AddrFrom && task.WarehouseCode == p.WarehouseCode);
  7830. var grcontid = fromcell.ContGrpId;
  7831. var grcontcode = fromcell.ContGrpBarCode;
  7832. var fromcellno = fromcell.Code;
  7833. var tocellno = task.AddrTo;
  7834. try
  7835. {
  7836. _db.BeginTran();
  7837. //更新货位信息
  7838. //起始货位
  7839. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7840. {
  7841. StateNum = FjLocationState.Empty,
  7842. ContGrpBarCode = "",
  7843. ContGrpId = 0,
  7844. EditTime = DateTime.Now
  7845. }, p => p.Code.Contains(fromcellno) && p.WarehouseCode == task.WarehouseCode);
  7846. //目标货位
  7847. _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell
  7848. {
  7849. StateNum = FjLocationState.Full,
  7850. ContGrpBarCode = grcontcode,
  7851. ContGrpId = grcontid,
  7852. EditTime = DateTime.Now
  7853. }, p => p.Code.Contains(tocellno));
  7854. //更新库存信息
  7855. var row = int.Parse(tocellno.Split('-')[0]);
  7856. var col = int.Parse(tocellno.Split('-')[1]);
  7857. var layer = int.Parse(tocellno.Split('-')[2]);
  7858. _billInvnowrepository.UpdateModelColumns(p => new BillInvnow
  7859. {
  7860. PutRow = row,
  7861. PutCol = col,
  7862. PutLayer = layer
  7863. }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());
  7864. //更新流水信息
  7865. var stock = _billInvnowrepository.GetFirst(p =>
  7866. p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode &&
  7867. p.InvStateCode == InvState.InvEcecState_In.ToString());
  7868. var flow = _mapper.Map<BillInvflow>(stock);
  7869. flow.Id = IdFactory.NewId();
  7870. flow.AddTime = DateTime.Now;
  7871. flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";
  7872. _billInvflow.Insert(flow);
  7873. _db.CommitTran();
  7874. }
  7875. catch (Exception ex)
  7876. {
  7877. _db.RollbackTran();
  7878. result.ResMsg = task.Id + "完成任务异常";
  7879. _logger.LogInformation("完成任务异常" + ex);
  7880. }
  7881. break;
  7882. case TaskType.Delivery:
  7883. break;
  7884. case TaskType.EmptyInit:
  7885. break;
  7886. default:
  7887. result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.Fail.GetDescription();
  7888. return result;
  7889. }
  7890. return result;
  7891. }
  7892. public SRes<int> CancelTask(CompleteTaskRequest reqDto)
  7893. {
  7894. var res = new SRes<int>
  7895. {
  7896. ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),
  7897. ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()
  7898. };
  7899. var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")
  7900. .Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First();
  7901. if (task == null)
  7902. {
  7903. res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();
  7904. res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();
  7905. return res;
  7906. }
  7907. try
  7908. {
  7909. if (task.Type == TaskType.EnterDepot)
  7910. {
  7911. //验证组盘状态
  7912. if (task.BusType == FJTaskBusType.重绕满托入库.GetDescription())
  7913. {
  7914. //验证库存状态
  7915. var stocklist = _billInvnowrepository.GetList(p =>
  7916. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&
  7917. (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||
  7918. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));
  7919. if (stocklist == null || !stocklist.Any())
  7920. {
  7921. res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7922. return res;
  7923. }
  7924. var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);
  7925. if (wareHouse.TypeNum == FjLocationType.Pingku)
  7926. {
  7927. _db.BeginTran();
  7928. _billInvinitrepository.Delete(x => x.ContGrpBarCode == task.BarCode && x.InvStateCode == InvState.InvEcecState_BuildUp.ToString());
  7929. _db.CommitTran();
  7930. }
  7931. }
  7932. }
  7933. else if (task.Type == TaskType.OutDepot && (task.BusType == FJTaskBusType.车间叫料.GetDescription() || task.BusType == FJTaskBusType.芯股站台送空托.GetDescription()))
  7934. {
  7935. //验证库存信息
  7936. var stocklist = _billInvnowrepository.GetList(p =>
  7937. (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&
  7938. (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||
  7939. p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));
  7940. if (stocklist == null || !stocklist.Any())
  7941. {
  7942. res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7943. return res;
  7944. }
  7945. var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);
  7946. switch (wareHouse.TypeNum)
  7947. {
  7948. case FjLocationType.Storage:
  7949. //验证
  7950. //var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);
  7951. //if (stock == null)
  7952. //{
  7953. // res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();
  7954. // res.ResMsg = "库存信息不存在";//ResponseStatusCodeEnum.StockNotExist.GetDescription();
  7955. // return res;
  7956. //}
  7957. var cell = _basewarecellrepository.GetSingle(p =>
  7958. p.ContGrpBarCode == task.BarCode && p.WarehouseCode == task.WarehouseCode);
  7959. if (cell == null)
  7960. {
  7961. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7962. res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() +
  7963. "堆垛机已放货完成,不允许取消";
  7964. return res;
  7965. }
  7966. _db.BeginTran();
  7967. _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell
  7968. {
  7969. StateNum = FjLocationState.Full,
  7970. EditTime = DateTime.Now
  7971. },
  7972. p => p.ContGrpBarCode == task.BarCode && p.WarehouseCode == task.WarehouseCode &&
  7973. p.Code.Contains(task.AddrFrom) && p.StateNum == FjLocationState.StockOut);
  7974. _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow
  7975. {
  7976. InvStateCode = InvState.InvEcecState_In.ToString(),
  7977. EditTime = DateTime.Now
  7978. }, p => p.ContGrpBarCode == task.BarCode && p.WarehouseId == cell.WarehouseId);
  7979. _db.CommitTran();
  7980. break;
  7981. case FjLocationType.RingLibrary: //环形库的库存信息变更是在SrmPickOutCompleted
  7982. break;
  7983. case FjLocationType.Pingku:
  7984. break;
  7985. default:
  7986. throw new ArgumentOutOfRangeException();
  7987. }
  7988. }
  7989. else
  7990. {
  7991. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  7992. res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消";
  7993. return res;
  7994. }
  7995. }
  7996. catch (Exception ex)
  7997. {
  7998. _db.RollbackTran();
  7999. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8000. res.ResMsg = task.Id + ResponseStatusCodeEnum.Fail.GetDescription();
  8001. _logger.LogInformation("任务取消失败,任务号:" + task.Id + ex.Message);
  8002. return res;
  8003. }
  8004. return res;
  8005. }
  8006. /// <summary>
  8007. /// 查询任务 通过条码查询任务
  8008. /// </summary>
  8009. /// <param name="barCode">条码</param>
  8010. /// <returns></returns>
  8011. public SRes<WCS_TaskOld> GetTaskInfo(FJGetTaskInfoRequest dto)
  8012. {
  8013. var res = new SRes<WCS_TaskOld>();
  8014. res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
  8015. var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.BarCode == dto.BarCode)
  8016. .SplitTable(x => x.Take(2)).OrderByDescending(x => x.AddTime).First();
  8017. if (task == null)
  8018. {
  8019. res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
  8020. res.ResMsg = "当前条码不存在任务";
  8021. return res;
  8022. }
  8023. res.ResData = task;
  8024. return res;
  8025. }
  8026. /// <summary>
  8027. /// 计算最佳码垛位置
  8028. /// </summary>
  8029. /// <param name="cellInfos"></param>
  8030. /// <returns></returns>
  8031. public string FindBestStackingPosition(List<CellInfo> cellInfos)
  8032. {
  8033. //0表示1-9列任务居多,1表示10-17列任务居多
  8034. var colType = cellInfos.GroupBy(p => p.Col).OrderByDescending(p => p.Count()).First().Key > 9 ? 1 : 0;
  8035. //在cellInfos中获取一个仓库号
  8036. var warehouseCode = cellInfos.First().WarehouseCode;
  8037. return warehouseCode switch
  8038. {
  8039. "1NR" => colType == 0 ? "1666" : "1661",
  8040. "1SR" => colType == 0 ? "1681" : "1676",
  8041. "2NR" => colType == 0 ? "1696" : "1691",
  8042. "2SR" => colType == 0 ? "1711" : "1706",
  8043. "3NR" => colType == 0 ? "1726" : "1721",
  8044. "3SR" => colType == 0 ? "1741" : "1736",
  8045. _ => ""
  8046. };
  8047. //var res = new Tuple<string, string>("","");
  8048. //switch (warehouseCode)
  8049. //{
  8050. // case "1NR":
  8051. // res = colType==0 ? new Tuple<string, string>("1666", "1661") : new Tuple<string, string>("1661", "1666");
  8052. // break;
  8053. // case "1SR":
  8054. // res = colType == 0 ? new Tuple<string, string>("1681", "1679") : new Tuple<string, string>("1679", "1681");
  8055. // break;
  8056. // case "2NR":
  8057. // res = colType == 0 ? new Tuple<string, string>("1696", "1691") : new Tuple<string, string>("1691", "1696");
  8058. // break;
  8059. // case "2SR":
  8060. // res = colType == 0 ? new Tuple<string, string>("1711", "1706") : new Tuple<string, string>("1706", "1711");
  8061. // break;
  8062. // case "3NR":
  8063. // res = colType == 0 ? new Tuple<string, string>("1726", "1721") : new Tuple<string, string>("1721", "1726");
  8064. // break;
  8065. // case "3SR":
  8066. // res = colType == 0 ? new Tuple<string, string>("1741", "1736") : new Tuple<string, string>("1736", "1741");
  8067. // break;
  8068. //}
  8069. //return res;
  8070. }
  8071. }
  8072. public static class TaslEx
  8073. {
  8074. public static void UpdataErrorinfo(this BaseErrorInfo error, RepositoryTask<BaseErrorInfo> db)
  8075. {
  8076. var errorinfoWcs = db.AsQueryable().With(SqlWith.NoLock)
  8077. .Where(v => v.BusName == error.BusName && v.Message == error.Message).First();
  8078. if (errorinfoWcs != null)
  8079. {
  8080. errorinfoWcs.Count += 1;
  8081. db.Context.Updateable(errorinfoWcs).ExecuteCommand();
  8082. }
  8083. else
  8084. {
  8085. db.Context.Insertable(error).ExecuteCommand();
  8086. }
  8087. }
  8088. }
  8089. /// <summary>
  8090. /// 主线分流
  8091. /// </summary>
  8092. public class MainlineDiversion
  8093. {
  8094. /// <summary>
  8095. /// 任务号
  8096. /// </summary>
  8097. public int TaskId { get; set; }
  8098. /// <summary>
  8099. /// 仓库号
  8100. /// </summary>
  8101. public string WarehouseCode { get; set; }
  8102. }
  8103. /// <summary>
  8104. /// 申请空托盘组出库请求体
  8105. /// </summary>
  8106. public class FjApplyEmptyPalletGroupOutStorageRequest : BaseRequest
  8107. {
  8108. /// <summary>
  8109. /// 托盘类型
  8110. /// </summary>
  8111. public FJPalletType FJPalletType { get; set; }
  8112. /// <summary>
  8113. /// 巷道
  8114. /// </summary>
  8115. public int Tunnel { get; set; }
  8116. /// <summary>
  8117. /// 目标位置
  8118. /// </summary>
  8119. public string AddTo { get; set; }
  8120. }
  8121. /// <summary>
  8122. /// 创建WCS出库任务
  8123. /// </summary>
  8124. public class FJCreateStockOutWcsTaskRequest
  8125. {
  8126. /// <summary>
  8127. /// 容器条码
  8128. /// </summary>
  8129. public string ContGrpBarCode { get; set; }
  8130. /// <summary>
  8131. /// 主盘主表ID
  8132. /// </summary>
  8133. public long ContGrpId { get; set; }
  8134. /// <summary>
  8135. /// 仓库编码
  8136. /// </summary>
  8137. public string WarehouseCode { get; set; }
  8138. public decimal Qty { get; set; }
  8139. /// <summary>
  8140. /// 设备编号
  8141. /// </summary>
  8142. public string EquCode { get; set; }
  8143. /// <summary>
  8144. /// 业务类型
  8145. /// </summary>
  8146. public FJTaskBusType BusType { get; set; }
  8147. public int Floor { get; set; }
  8148. public string Tunnel { get; set; }
  8149. public string CellNo { get; set; }
  8150. public short ProdLine { get; set; }
  8151. public string WorkBench { get; set; }
  8152. public int GoodsType { get; set; }
  8153. public string Device { get; set; }
  8154. /// <summary>
  8155. /// 物料号
  8156. /// </summary>
  8157. public string MatCode { get; set; }
  8158. /// <summary>
  8159. /// 码垛托盘类型
  8160. /// </summary>
  8161. public short PalletType { get; set; }
  8162. /// <summary>
  8163. /// 满盘数量
  8164. /// </summary>
  8165. public short FullQty { get; set; }
  8166. public string LastInteractionPoint { get; set; }
  8167. /// <summary>
  8168. /// MES任务号
  8169. /// </summary>
  8170. [SugarColumn(ColumnDescription = "MES任务号")]
  8171. public string MesNo { get; set; }
  8172. /// <summary>
  8173. /// 空盘库
  8174. /// </summary>
  8175. [SugarColumn(ColumnDescription = "空盘库")]
  8176. public string EmptyInventory { get; set; }
  8177. }
  8178. public class FJBingPalletDto : BaseRequest
  8179. {
  8180. /// <summary>
  8181. /// 仓库号
  8182. /// </summary>
  8183. public string WarehouseCode { get; set; }
  8184. /// <summary>
  8185. /// 托盘条码
  8186. /// </summary>
  8187. public string PalletCode { get; set; }
  8188. /// <summary>
  8189. /// 工字轮任务号集合
  8190. /// </summary>
  8191. public List<string> TaskCode { get; set; }
  8192. /// <summary>
  8193. /// 业务类型
  8194. /// </summary>
  8195. public FJTaskBusType BusType { get; set; }
  8196. /// <summary>
  8197. /// 任务申请设备
  8198. /// </summary>
  8199. public string loc { get; set; }
  8200. /// <summary>
  8201. /// 是否异常
  8202. /// </summary>
  8203. public bool IsFail { get; set; }
  8204. /// <summary>
  8205. /// 异常原因
  8206. /// </summary>
  8207. public string FailReason { get; set; }
  8208. /// <summary>
  8209. /// 是否结束
  8210. /// </summary>
  8211. public bool IsFinish { get; set; }
  8212. /// <summary>
  8213. /// 是否为半跺入库
  8214. /// </summary>
  8215. public bool IsItHalf { get; set; }
  8216. }
  8217. public class FJGetTwoPalletDto : BaseRequest
  8218. {
  8219. /// <summary>
  8220. /// 仓库号
  8221. /// </summary>
  8222. public string WarehouseCode { get; set; }
  8223. /// <summary>
  8224. /// 仓库号
  8225. /// </summary>
  8226. public int TaskId { get; set; }
  8227. }
  8228. public class CellInfo
  8229. {
  8230. /// <summary>
  8231. /// 货位ID
  8232. /// </summary>
  8233. public long Id { get; set; }
  8234. /// <summary>
  8235. /// 组盘条码
  8236. /// </summary>
  8237. public string ContGrpBarCode { get; set; }
  8238. /// <summary>
  8239. /// 仓库ID
  8240. /// </summary>
  8241. public long WarehouseId { get; set; }
  8242. /// <summary>
  8243. /// 仓库号
  8244. /// </summary>
  8245. public string WarehouseCode { get; set; }
  8246. /// <summary>
  8247. /// 货位号
  8248. /// </summary>
  8249. public string Code { get; set; }
  8250. /// <summary>
  8251. /// 行
  8252. /// </summary>
  8253. public int Row { get; set; }
  8254. /// <summary>
  8255. /// 列
  8256. /// </summary>
  8257. public int Col { get; set; }
  8258. /// <summary>
  8259. /// 层
  8260. /// </summary>
  8261. public int Layer { get; set; }
  8262. /// <summary>
  8263. /// 深
  8264. /// </summary>
  8265. public int Depth { get; set; }
  8266. /// <summary>
  8267. /// 物料号
  8268. /// </summary>
  8269. public string MatCode { get; set; }
  8270. /// <summary>
  8271. /// 正反面
  8272. /// </summary>
  8273. public int SideNum { get; set; }
  8274. public string CLBarCode { get; set; }
  8275. /// <summary>
  8276. /// 码垛位置
  8277. /// </summary>
  8278. public int XYNo { get; set; }
  8279. /// <summary>
  8280. /// 编辑时间
  8281. /// </summary>
  8282. public DateTime EditTime { get; set; }
  8283. /// <summary>
  8284. /// Bom单号 关联投料单 帘线工序工单号 BillCode
  8285. /// </summary>
  8286. public string BomDocsNo { get; set; }
  8287. }
  8288. public class FjGetSetGrpListRequest
  8289. {
  8290. /// <summary>
  8291. /// 帘线产出物料编码
  8292. /// </summary>
  8293. public string OutMaterialCode { get; set; }
  8294. /// <summary>
  8295. /// 投入物料
  8296. /// </summary>
  8297. public List<string> ListmatInfo { get; set; }
  8298. }
  8299. }
  8300. #endregion 同WCS交互部分