FJService.cs 432 KB

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