FJService.cs 417 KB

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