FJService.cs 420 KB

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