FJService.cs 429 KB

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