| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457 | using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Linq.Expressions;using System.Text.RegularExpressions;using AutoMapper;using Castle.Core.Internal;using Microsoft.Extensions.Logging;using Newtonsoft.Json;using NPOI.SS.Formula.Functions;using SqlSugar;using SqlSugar.Extensions;using WCS.Entity.fj;using wms.dataservice.IDataSetvice;using wms.dto;using wms.dto.request;using wms.dto.request.fj;using wms.dto.request.hj;using wms.dto.request.share;using wms.dto.response;using wms.dto.response.fj;using wms.service.Extensions;using wms.service.IService;using wms.sqlsugar;using wms.sqlsugar.model;using wms.sqlsugar.model.fj;using wms.util.Check;using wms.util.Ext;using TaskStatus = wms.dto.TaskStatus;namespace wms.service.Service{    /// <summary>    ///     分拣服务    /// </summary>    public class FJService : IFJService    {        private static object lockInOrOut = new object();        private readonly IFJDataService _IFJDataService;        private readonly ILogger<FJService> _logger;        private readonly IMapper _mapper;        public FJService(IMapper mapper, ILogger<FJService> logger, IFJDataService IFJDataService)        {            _mapper = mapper;            _logger = logger;            _IFJDataService = IFJDataService;        }        private ITenant _db => SqlSugarHelper.Db; //处理事务        /// <summary>        ///     获取配置内容信息        /// </summary>        /// <param name="code">配置表code值</param>        /// <returns></returns>        public string GetSysConfigContentByCode(string code)        {            //先读缓存            var cacheContent = RedisHelper.Get("sys_config" + code);            if (!string.IsNullOrEmpty(cacheContent)) return cacheContent;            var sysconf = _sysconfigrepository.GetSingle(p => p.Code == code);            if (sysconf == null) throw new Exception("数据表没有配置" + code);            var content = sysconf.SContent;            var sysname = sysconf.Default1; //所属系统mes/erp            RedisHelper.Set("sys_config" + code, content + "|" + sysname);            return content;        }        /// <summary>        ///     获取配置信息        /// </summary>        /// <param name="code"></param>        /// <returns></returns>        public fjSysConfig GetSysConfigByCode(string code)        {            return _sysconfigrepository.GetSingle(p => p.Code == code);        }        public fjSysJob GetSysJobEntity(DetailRequest2Str req)        {            return _jobRepository.GetFirst(p => p.Id == long.Parse(req.Id));        }        public fjSysJob GetSysJobEntityByCode(string Code)        {            return _jobRepository.GetSingle(p => p.Code == Code);        }        public List<fjSysJobApiRelation> GetSysApiDetail(long Id)        {            return _jobApiRepository.GetList(p => p.JobId == Id);        }        /// <summary>        ///     创建货位,用于少数虚拟货位及平库        /// </summary>        /// <param name="WarehouseCode">仓库号</param>        /// <param name="Code">货位号</param>        /// <returns></returns>        public SRes CreatWarecell(string WarehouseCode, string Code)        {            var res = new SRes();            //找到对应的仓库            var warehouse = _basewarehouserepository.GetFirst(x => x.Code == WarehouseCode);            var wareCell = new BaseWarecell            {                WarehouseId = warehouse.Id,                WarehouseCode = WarehouseCode,                WareAreaId = 1669154208777113600,                IsStop = 0,                Code = Code,                Name = Code,                StateNum = FjLocationState.Empty,                TypeNum = FjLocationType.Virtual,                Size = 1,                Row = 1,                Col = 1,                Layer = 1,                Depth = 1,                Tunnel = 1,                SCRel = "芯股虚拟货位",                ContGrpBarCode = "0",                ContGrpId = 0,                Shelf = "L",                AddWho = "Admin",                AddTime = DateTime.Now,                EditWho = "Admin",                EditTime = DateTime.Now,                Memo = "芯股货架",                GroupID = 0,                XYNO = 0            };            _db.BeginTran();            try            {                _basewarecellrepository.InsertReturnEntity(wareCell);            }            catch (Exception e)            {                _db.RollbackTran();                _logger.LogInformation(e.Message);                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription();                return res;            }            _db.CommitTran();            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();            return res;        }        public List<fjSysJob> GetJobList()        {            return _jobRepository.GetList();        }        /// <summary>        ///     获取配置信息        /// </summary>        /// <param name="code"></param>        /// <returns></returns>        public fjSysConfig GetSysConfigByExpression(Expression<Func<fjSysConfig, bool>> WhereExpression)        {            return _sysconfigrepository.GetSingle(WhereExpression);        }        /// <summary>        ///     获取反馈信息        /// </summary>        /// <param name="code"></param>        /// <returns></returns>        public List<BillPushinfo> GetBillPushinfoList(Expression<Func<BillPushinfo, bool>> WhereExpression,            bool type = false)        {            if (type)                return _billPushinforepository.AsQueryable().Where(WhereExpression).OrderBy(x => x.AddTime).Take(1)                    .ToList();            return _billPushinforepository.GetList(WhereExpression);        }        public bool UpdatePushModelColumns(UpdateModelColumns<BillPushinfo> updateModel)        {            return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);        }                /// <summary>        ///     更新SysConfig表字段        /// </summary>        /// <param name="updateModel"></param>        /// <returns></returns>        public bool UpdateSysConfigModelColumns(UpdateModelColumns<fjSysConfig> updateModel)        {            return _sysconfigrepository.Update(updateModel.Columns, updateModel.WhereExpression);        }        public List<BaseMatinfo> GetBaseMatinfoList(Expression<Func<BaseMatinfo, bool>> WhereExpression)        {            return _basematerrepository.GetList(WhereExpression);        }        /// <summary>        ///     更新物料基础信息表        /// </summary>        /// <param name="updateModel"></param>        /// <returns></returns>        public bool UpdateMaterModelColumns(UpdateModelColumns<BaseMatinfo> updateModel)        {            return _basematerrepository.Update(updateModel.Columns, updateModel.WhereExpression);        }        public bool UpdateMaterModel(BaseMatinfo updateModel)        {            return _basematerrepository.Update(updateModel);        }        /// <summary>        ///     更新BillPushinfo表字段        /// </summary>        /// <param name="updateModel"></param>        /// <returns></returns>        public bool UpdateBillPushinfoModelColumns(UpdateModelColumns<BillPushinfo> updateModel)        {            return _billPushinforepository.Update(updateModel.Columns, updateModel.WhereExpression);        }        public bool SyncMaterInfo(List<FJSyncMaterInfoResponseItem> ResData)        {            foreach (var item in ResData)            {                item.UpdatedTime = DateTime.Now;                if (_basematerrepository.IsAny(p => p.Code == item.MatCode))                {                    _basematerrepository.UpdateModelColumns(                        p => new BaseMatinfo                        {                            IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName,                            EditTime = DateTime.Now, Description = item.Describe                        },                        p => p.Code == item.MatCode);                }                else                {                    var model = _mapper.Map<BaseMatinfo>(item);                    model.AddTime = DateTime.Now;                    _basematerrepository.Insert(model);                }            }            return true;        }        /// <summary>        ///     帘线同步物料        /// </summary>        /// <param name="ResData"></param>        /// <returns></returns>        public bool SyncMaterInfoLX(List<SxSyncMaterInfoListRequestItem> ResData)        {            foreach (var item in ResData)                if (_basematerrepository.IsAny(p => p.Code == item.MatCode))                {                    _basematerrepository.UpdateModelColumns(                        p => new BaseMatinfo                        {                            IsHold = item.IsHold, HoldDuration = item.HoldDuration, Name = item.MatName,                            EditTime = DateTime.Now, Description = item.Describe                        },                        p => p.Code == item.MatCode);                }                else                {                    var model = _mapper.Map<BaseMatinfo>(item);                    model.AddTime = DateTime.Now;                    _basematerrepository.Insert(model);                }            return true;        }        public SRes SyncMachineInfo(SyncMachineInfoRequest req)        {            if (_basemachinforepository.IsAny(p => p.MachNo == req.MachineCode))            {                _basemachinforepository.UpdateModelColumns(                    p => new BillMachinfo { Direction = req.VehicleDirection, EditTime = DateTime.Now },                    p => p.MachNo == req.MachineCode);            }            else            {                var model = _mapper.Map<BillMachinfo>(req);                model.AddTime = DateTime.Now;                model.EditTime = DateTime.Now;                model.AddWho = "wms";                model.EditWho = "wms";                model.AddWho = "wms";                model.EditWho = "wms";                model.WarehouseCode = "";                model.WarehouseId = 0;                model.WarehouseSort = 0;                model.Direction = "";                model.WareAreaId = 0;                model.IsStop = 0;                model.GrpCode = "";                model.Station = "";                model.BillCode = "";                model.WorkOrder = "";                model.SetGrpCode = "";                model.ProBillCode = "";                model.ProWorkOrder = "";                model.ProSetGrpCode = "";                model.WareDirect = "";                _basemachinforepository.Insert(model);            }            return new SRes();        }        /// <summary>        ///     投料信息接收        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes WetFormulaInfo(WetFormulaInfoRequest reqDto)        {            var res = new SRes();            //保存表Bill_BomInfo            foreach (var item in reqDto.FeedList)            {                var procodelist = _billBominfoRepository.GetList(p => p.MatCode == item.InMaterialCode)                    .Select(p => p.ProCode).Distinct();                if (procodelist.Any() && procodelist.Count() > 1)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = item.InMaterialCode + "不允许率属于两个投料大类编码,接收失败";                    return res;                }                if (_billBominfoRepository.IsAny(p =>                        p.Code == reqDto.FeedCode && p.ProMatCode == item.OutMaterialCode &&                        p.MatCode == item.InMaterialCode))                {                    //var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);                    //_billBominfoRepository.UpdateModelColumns(p => new BillBominfo() { MatCode = item.InMaterialCode, MatId = mat.Id, Name = item.InMaterialCode, HWCountQty = item.Count, EditTime = DateTime.Now },                    //   p => p.Code == reqDto.FeedCode && p.MatCode == item.InMaterialCode);                }                else                {                    var procode = string.Join('|',                        reqDto.FeedList.Where(p => p.OutMaterialCode == item.OutMaterialCode)                            .Select(p => p.InMaterialCode).OrderBy(p => p).ToList());                    var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);                    if (mat == null)                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = "投入料" + ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                        return res;                    }                    var model = new BillBominfo                    {                        ProCode = procode,                        Code = reqDto.FeedCode,                        Name = reqDto.FeedName,                        MatCode = item.InMaterialCode,                        MatId = mat.Id,                        AddTime = DateTime.Now,                        AddWho = "wms",                        EditTime = DateTime.Now,                        EditWho = "wms",                        IsStop = 0,                        HWCountQty = item.Count,                        ProMatCode = item.OutMaterialCode,                        Memo = reqDto.Remark                    };                    model.AddTime = DateTime.Now;                    _billBominfoRepository.Insert(model);                }            }            return res;        }        /// <summary>        ///     帘线工单信息传输        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CurtainProductionOrder(CurtainProductionOrderRequest reqDto)        {            var res = new SRes();            //先判断是否有配方信息和物料基础信息            var outmat = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);            if (outmat == null)            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = reqDto.MatCode + "不存在该物料基础信息,请先同步基础信息";                return res;            }            var procode = string.Join('|', reqDto.FeedList.Select(p => p.InMaterialCode).OrderBy(p => p).ToList());            if (reqDto.ProdFlag == 1)            {                var bominfo =_billBominfoRepository.GetFirst(p => p.Code == reqDto.FeedCode && p.ProMatCode == reqDto.MatCode);                if (bominfo == null)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = string.Format("当前产出为芯股,此芯股投料信息不存在请先同步投料信息,投料编码{0},产出物{1}", reqDto.FeedCode,                        reqDto.MatCode);                    return res;                }                procode = bominfo.ProCode;            }            BillBomsetgrp stack = null; //垛型固定获取最早更新的垛型            //后续一个配方会有多个垛型            if (reqDto.MatCode.StartsWith("57")) //是芯股            {                stack = _billBomsetgrpRepository.AsQueryable().Where(p =>                        (p.BomCode == procode || procode.Contains(p.BomCode)) && p.ProMaterCode.StartsWith("57") &&                        p.IsStop == 0).OrderBy(x => x.EditTime).First();                if (stack == null)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,                        reqDto.FeedCode, procode, reqDto.MatCode);                    return res;                }            }            else //不是芯股            {                stack = _billBomsetgrpRepository.GetList(p =>                    (p.BomCode == procode || procode.Contains(p.BomCode)) && !p.ProMaterCode.StartsWith("57") &&                    p.IsStop == 0).OrderBy(x => x.EditTime).First(); ;                if (stack == null)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,                        reqDto.FeedCode, procode, reqDto.MatCode);                    return res;                }            }            var reqjson = JsonConvert.SerializeObject(reqDto);            if (reqjson.Length > 5000) reqjson = "内容量过大,已截取";            if (reqDto.BillState == CurtainBillState.初始化.GetHashCode().ToString() ||                reqDto.BillState == CurtainBillState.已合并.GetHashCode().ToString() ||                reqDto.BillState == CurtainBillState.已排产.GetHashCode().ToString())            {                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);                if (doc == null)                {                    doc = new BillDocsinfo();                    doc.WarehouseId = 0;                    doc.ReqNo = reqDto.BillCode;                    doc.DocsNo = reqDto.BillCode;                    doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();                    doc.StateNum = DocState.DocState_Create.GetHashCode();                    doc.JsonContent = reqjson;                    doc.DownQty = 1;                    doc.IsStop = 0;                    doc.BomCode = reqDto.FeedCode;                    doc.ProMaterCode = reqDto.MatCode;                    doc.SetGrpCode = stack.Code;                    doc.WorkOrder = reqDto.WorkOrder;                    doc.SkuCode = reqDto.SkuCode;                    doc.PackRule = reqDto.PackRule;                    var docinsert = _billdocrepository.Insert(doc);                    if (!docinsert)                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();                        return res;                    }                }                _basemachinforepository.UpdateModelColumns(                    p => new BillMachinfo                    {                        ProBillCode = reqDto.BillCode, ProWorkOrder = reqDto.WorkOrder, ProSetGrpCode = stack.Code,                        EditTime = DateTime.Now                    }, p => reqDto.WbList.Contains(p.MachNo));                //箱号处理                //根据箱号更新装箱信息表            }            else if (reqDto.BillState == CurtainBillState.生产中.GetHashCode().ToString())            {                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);                if (doc == null)                {                    doc = new BillDocsinfo();                    doc.WarehouseId = 0;                    doc.ReqNo = reqDto.BillCode;                    doc.DocsNo = reqDto.BillCode;                    doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();                    doc.StateNum = DocState.DocState_Execute.GetHashCode();                    doc.JsonContent = reqjson;                    doc.DownQty = 1;                    doc.IsStop = 0;                    doc.BomCode = reqDto.FeedCode;                    doc.ProMaterCode = reqDto.MatCode;                    doc.SetGrpCode = stack.Code;                    doc.WorkOrder = reqDto.WorkOrder;                    doc.SkuCode = reqDto.SkuCode;                    doc.PackRule = reqDto.PackRule;                    var docinsert = _billdocrepository.Insert(doc);                    if (!docinsert)                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();                        return res;                    }                }                var state = DocState.DocState_Execute.GetHashCode();                _billdocrepository.UpdateModelColumns(                    p => new BillDocsinfo { StateNum = state, SetGrpCode = stack.Code },                    p => p.DocsNo == reqDto.BillCode);                _basemachinforepository.UpdateModelColumns(                    p => new BillMachinfo                    {                        BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, SetGrpCode = stack.Code,                        EditTime = DateTime.Now                    }, p => reqDto.WbList.Contains(p.MachNo));                //箱号处理                //根据箱号更新装箱信息表            }            else if (reqDto.BillState == CurtainBillState.生产结束.GetHashCode().ToString() ||                     reqDto.BillState == CurtainBillState.计划关闭.GetHashCode().ToString())            {                var state = DocState.DocState_Complete.GetHashCode();                _billdocrepository.UpdateModelColumns(p => new BillDocsinfo { StateNum = state },                    p => p.DocsNo == reqDto.BillCode);            }            return res;        }        /// <summary>        ///     湿拉工单启动验证        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CurtainOrderStartCheck(CurtainOrderStartCheckRequest reqDto)        {            var res = new SRes();            var doc = _billdocrepository.GetList(p => p.WorkOrder == reqDto.BillCode);            if (doc == null || !doc.Any())            {                res.ResCode = 0;                res.ResMsg = reqDto.BillCode + "工单不存在";                return res;            }            if (doc.Any(p => string.IsNullOrEmpty(p.BomCode)))            {                res.ResCode = 0;                res.ResMsg = reqDto.BillCode + "帘线工序工单没有配置垛型信息,请先配置垛型";                return res;            }                        return res;        }        public SRes ManualBuildEmptyStock(ManualBuildEmptyStockRequest request)        {            var result = new SRes();            if (string.IsNullOrEmpty(request.ContGrpBarCode))            {                result.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();                return result;            }            var mater = _basematerrepository.GetSingle(p => request.ContGrpBarCode.Substring(0, 3) == p.Code);            if (mater == null)            {                result.ResCode = ResponseStatusCodeEnum.BaseMaterCodeNotExist.GetHashCode();                result.ResMsg = request.ContGrpBarCode.Substring(0, 3) + "托盘类型不存在";                return result;            }            var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.BarCode == request.ContGrpBarCode && p.Status < TaskStatus.Finish)                .SplitTable(p => p.Take(2)).ToList();            if (taskold.Any())            {                result.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.WcsTaskExist.GetDescription() + "不允许绑定";                return result;            }            var BarCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == request.ContGrpBarCode);            if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_In.ToString())            {                result.ResCode = ResponseStatusCodeEnum.BarcodeContainerRepeat.GetHashCode();                result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.BarcodeContainerRepeat.GetDescription();                return result;            }            if (BarCode != null && BarCode?.InvStateCode == InvState.InvEcecState_BuildUp.ToString())            {                result.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();                result.ResMsg = request.ContGrpBarCode +                                ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();                return result;            }            if (BarCode != null)            {                result.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                result.ResMsg = request.ContGrpBarCode + "存在库存信息,请先处理遗留的库存信息";                return result;            }            //空托盘            var code = _baseContinfo.GetSingle(p => p.ContBarCode == request.ContGrpBarCode);            if (code == null)            {                var init = new BaseContinfo                {                    ContBarCode = request.ContGrpBarCode,                    Name = mater.Name,                    IsStop = 0,                    WarehouseId = 0,                    TypeCode = "1",                    PrintQty = 1,                    AddWho = "wms",                    EditWho = "wms"                };                _baseContinfo.Insert(init);            }            try            {                var nov = new BillInvnow                {                    WarehouseId = 0,                    ContGrpBarCode = request.ContGrpBarCode,                    ContGrpId = IdFactory.NewId(),                    BoxBarCode = "",                    InvStateCode = InvState.InvEcecState_BuildUp.ToString(),                    ExecStateCode = InvLockState.InvState_Normal.ToString(),                    MatId = mater.Id,                    MatCode = mater.Code,                    MatName = mater.Name,                    RFIDBarCode = request.ContGrpBarCode,                    HWBarCode = request.ContGrpBarCode,                    HWTypeCode = "",                    InvInOut = FJInvInOutType.In,                    Size = 2,                    ContGrpType = FJContGrpType.EmptyCon,                    LengthQty = request.Count //存放托盘数量                };                _db.BeginTran();                _billInvnowrepository.Insert(nov);                _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                result.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                result.ResMsg = request.ContGrpBarCode + ResponseStatusCodeEnum.DataSaveErr.GetDescription();                return result;            }            return result;        }        /// <summary>        ///     获取工字轮流向(江锦调用)        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<string> AllocatedSpoolFlow(AllocatedSpoolFlowRequest reqDto)        {            var spoolbar = _billSpoolTransrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.ConBarCode == reqDto.SpoolBarCode).OrderByDescending(x => x.AddTime).First();            if (spoolbar == null)            {                var error = new BaseErrorInfo                {                    BusName = "江景获取流向",                    Message = $"{reqDto.SpoolBarCode}没有工字轮信息,{DateTime.Now:yyyyMMddHH}",                    Count = 1,                    Memo = "WCS"                };                error.UpdataErrorinfo(_baseErrorInfoRepository);                return new SRes<string>                {                    ResMsg = reqDto.SpoolBarCode + "没有工字轮信息",                    ResData = "",                    ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()                };            }            //验证产品等级与下线时间            var invInt = _billInvinitrepository.AsQueryable().With(SqlWith.NoLock)                .Single(x => x.HWBarCode == spoolbar.ConBarCode);            if (invInt == null)            {                var error = new BaseErrorInfo                {                    BusName = "江景获取流向",                    Message = $"{reqDto.SpoolBarCode}没有工字轮信息,{DateTime.Now:yyyyMMddHH}",                    Count = 1,                    Memo = "WCS"                };                error.UpdataErrorinfo(_baseErrorInfoRepository);                return new SRes<string>                {                    ResMsg = reqDto.SpoolBarCode + "没有工字轮条码信息",                    ResData = "",                    ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()                };            }            if (invInt.Grade != "A")            {                var error = new BaseErrorInfo                {                    BusName = "江景获取流向",                    Message = $"{reqDto.SpoolBarCode}-{invInt.Grade}质量,进入BC区,{DateTime.Now:yyyyMMddHH}",                    Count = 1,                    Memo = "WCS"                };                error.UpdataErrorinfo(_baseErrorInfoRepository);                return new SRes<string>                {                    ResMsg = $"{invInt.Grade}质量,进入BC区",                    ResData = "",                    ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()                };            }            if (invInt.ProductTime < DateTime.Now.AddHours(-12))            {                var error = new BaseErrorInfo                {                    BusName = "江景获取流向",                    Message = $"{reqDto.SpoolBarCode}生产时间超时十二小时,{DateTime.Now:yyyyMMddHH}",                    Count = 1,                    Memo = "WCS"                };                error.UpdataErrorinfo(_baseErrorInfoRepository);                return new SRes<string>                {                    ResMsg = "生产时间超时十二小时",                    ResData = "",                    ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode()                };            }            return new SRes<string>            {                ResMsg = "成功",                ResData = spoolbar.Direct,                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode()            };        }        /// <summary>        ///     取分流异常的结果        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes QueryFlowDirectionExceptions(GetFlowExceptionResultsRequest reqDto)        {            var res = new SRes();            //时间处理            var prodate = reqDto.ProductDate.GetDateTime(_logger).AddMinutes(-1);            //是否有异常            if (_baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock)                .Any(x => x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate))            {                var regInfo = _baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock).First(x =>                    x.BusName.Contains("湿拉下盘注册") && x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate);                if (regInfo != null) //表示此工字轮注册时失败                {                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.ResMsg = regInfo.Message + $"[{reqDto.ProductDate}]";                    return res;                }                var flow = _baseErrorInfoRepository.AsQueryable().With(SqlWith.NoLock).First(x =>                    x.BusName.Contains("江景获取流向") && x.Message.Contains(reqDto.qrCode) && x.AddTime > prodate);                if (flow != null) //表示此工字轮获取流向时出现的错误结果                {                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.ResMsg = flow.Message + $"[{reqDto.ProductDate}]";                    return res;                }            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription();            return res;        }        /// <summary>        ///     人工创建满托入库任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CreateMaterialPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto)        {            var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };            //var taskMax = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)            //    .First(x => x.Code == "FullPalletInMax").SContent);            var sameSideTaskNum = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "SameSideTaskInNum").SContent);            //var station_Use = _sysconfigrepository.AsQueryable().With(SqlWith.NoLock)            //    .First(x => x.Code == "InStation" && x.SContent == "1").Name;            var taskCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                x.BusType == FJTaskBusType.人工满托入库.GetDescription() && x.Status < TaskStatus.Finish);            if (string.IsNullOrEmpty(reqDto.LocCode))            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "站台编号不可为空,请扫描站台编号!!!!!!";                return res;            }            if (string.IsNullOrEmpty(reqDto.TrayCode))            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "托盘条码不可为空,请扫描托盘条码!!!!!!";                return res;            }            //获取工字轮任务信息            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);            if (taskInfo != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";                return res;            }            //托盘            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);            if (container == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "托盘载具初始化失败";                    return res;                }            }            //工字轮            var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);            if (spoolNr == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "工字轮载具初始化失败";                    return res;                }            }            //物料            var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);            if (mater == null)            {                res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                return res;            }            //工字轮库存            var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);            if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //托盘库存            var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //通过投入物料找到垛型编码            var stackdetail =                _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);            if (stackdetail == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;                return res;            }            //获取垛型主表            var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);            //获取工字轮任务信息            var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";                return res;            }            //工字轮条码信息            var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);            if (barInfo == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有条码信息";                return res;            }            try            {                _db.BeginTran();                //更新条码信息                _billInvinitrepository.UpdateModelColumns(p => new BillInvinit                {                    ContGrpBarCode = reqDto.TrayCode,                    EditTime = DateTime.Now                }, p => p.HWBarCode == reqDto.SpoolNr);                //删除因异常导致残留的对应库存信息                _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);                barInfo.ContGrpBarCode = reqDto.TrayCode;                //创建库存信息                //将条码表映射到库存表                var invnow = _mapper.Map<BillInvnow>(barInfo);                invnow.IsTorsChk = true;                invnow.AddTime = DateTime.Now;                invnow.Id = IdFactory.NewId();                if (!_billInvnowrepository.Insert(invnow))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "人工满轮入库存储库存失败";                    return res;                }                //删除这个任务的阻盘记录                var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)                    .Where(x => x.BarCode == reqDto.SpoolNr).Select(x => x.ID).ToList();                if (taskIdList != null)                {                    //删除当前任务与更新历史任务                    _taskrepository.Delete(x => taskIdList.Contains(x.ID));                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                    {                        Status = TaskStatus.Cancel,                        ManualRemarks = "人工满托入库,清除信息"                    }, x => taskIdList.Contains(x.Id));                    //TODO:入库算法                    //TODO:出库算法                    //TODO:最优验证算法                }                //判断对应仓库中空货位数量                var invnowCount_1N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "1N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                var invnowCount_2N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "2N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                var invnowCount_1S = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "1S" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                var invnowCount_2S = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "2S" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                //在途任务数量                var taskInfoCount_1N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "1N");                var taskInfoCount_2N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "2N");                var taskInfoCount_1S = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "1S");                var taskInfoCount_2S = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "2S");                //创建对应任务                var count_1N = invnowCount_1N - taskInfoCount_1N;                var count_2N = invnowCount_2N - taskInfoCount_2N;                var count_1S = invnowCount_1S - taskInfoCount_1S;                var count_2S = invnowCount_2S - taskInfoCount_2S;                //获取空货位最多的仓库                var wCode = Max(count_1N,count_1S,count_2N,count_2S);                               if (taskCount > 0)                {                    if ((wCode == "1N" && sameSideTaskNum <= taskInfoCount_1N) || (wCode == "1S" && sameSideTaskNum <= taskInfoCount_1S) ||                        (wCode == "2N" && sameSideTaskNum <= taskInfoCount_2N) || (wCode == "2S" && sameSideTaskNum <= taskInfoCount_2S))                    {                                                if (wCode == "1N")                        {                            if (count_1S >= count_2N && count_1S >= count_2S)                            {                                wCode = (taskInfoCount_1S < sameSideTaskNum) ? "1S" : (taskInfoCount_2N < sameSideTaskNum ? "2N" : "2S");                                                                                       }                            else if (count_2N >= count_1S && count_2N >= count_2S)                            {                                wCode = (taskInfoCount_2N < sameSideTaskNum) ? "2N" : (taskInfoCount_1S < sameSideTaskNum ? "1S" : "2S");                            }                            else if (count_2S >= count_1S && count_2S >= count_2N)                            {                                wCode = (taskInfoCount_2S < sameSideTaskNum) ? "2S" : (taskInfoCount_1S < sameSideTaskNum ? "1S" : "2N");                            }                        }                        else if (wCode == "1S")                        {                            if (count_1N >= count_2N && count_1N >= count_2S)                            {                                wCode = (taskInfoCount_1N < sameSideTaskNum) ? "1N" : (taskInfoCount_2N < sameSideTaskNum ? "2N" : "2S");                            }                            else if (count_2N >= count_1N && count_2N >= count_2S)                            {                                wCode = (taskInfoCount_2N < sameSideTaskNum) ? "2N" : (taskInfoCount_1N < sameSideTaskNum ? "1N" : "2S");                            }                            else if (count_2S >= count_1N && count_2S >= count_2N)                            {                                wCode = (taskInfoCount_2S < sameSideTaskNum) ? "2S" : (taskInfoCount_1N < sameSideTaskNum ? "1N" : "2N");                            }                        }                        else if (wCode == "2N")                        {                            if (count_2S >= count_1N && count_2S >= count_1S)                            {                                wCode = (taskInfoCount_2S < sameSideTaskNum) ? "2S" : (taskInfoCount_1N < sameSideTaskNum ? "1N" : "1S");                            }                            else if (count_1N >= count_1S && count_1N >= count_2S)                            {                                wCode = (taskInfoCount_1N < sameSideTaskNum) ? "1N" : (taskInfoCount_1S < sameSideTaskNum ? "1S" : "2S");                            }                            else if (count_1S >= count_1N && count_1S >= count_2S)                            {                                wCode = (taskInfoCount_1S < sameSideTaskNum) ? "1S" : (taskInfoCount_1N < sameSideTaskNum ? "1N" : "2S");                            }                        }                        else if (wCode == "2S")                        {                            if (count_2N >= count_1S && count_2N >= count_1N)                            {                                wCode = (taskInfoCount_2N < sameSideTaskNum) ? "2N" : (taskInfoCount_1N < sameSideTaskNum ? "1N" : "1S");                            }                            else if (count_1N >= count_1S && count_1N >= count_2N)                            {                                wCode = (taskInfoCount_1N < sameSideTaskNum) ? "1N" : (taskInfoCount_1S < sameSideTaskNum ? "1S" : "2N");                            }                            else if (count_1S >= count_1N && count_1S >= count_2N)                            {                                wCode = (taskInfoCount_1S < sameSideTaskNum) ? "1S" : (taskInfoCount_2N < sameSideTaskNum ? "2N" : "1N");                            }                        }                    }                }                                                                              //创建入库记录                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = FJTaskBusType.人工满托入库.GetDescription(),                    ContGrpBarCode = reqDto.TrayCode,                    Qty = 1,                    Floor = 2,                    MatCode = reqDto.InMaterialCode,                    EquCode = reqDto.LocCode,                    Type = TaskType.EnterDepot,                    DocCode = "",                    WorkBench = task.WorkBench,                    WarehouseCode = wCode                };                //下发wcs任务 - 分解方法                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, task.Grade, true);                if (taskRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskRes.ResCode;                    res.ResMsg = taskRes.ResMsg;                    return res;                }                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.StackTrace;                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();            return res;        }        public string Max(int count_1N,int count_1S, int count_2N, int count_2S)        {            string wareHouse = "1N";            int max = count_1N;            if (count_1S > max)            {                max = count_1S;                wareHouse = "1S";            }            if (count_2N > max)            {                max = count_2N;                wareHouse = "2N";            }            if (count_2S > max)            {                max = count_2S;                wareHouse = "2S";            }            return wareHouse;        }        /// <summary>        ///     人工创建UT满托入库任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CreateMaterialUTPalletWarehouTask(CreateMaterialPalletWarehouTaskRequest reqDto)        {            var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };            var taskMax = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "UTFullPalletInMax").SContent);            var taskCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                x.BusType == FJTaskBusType.UT人工满托入库.GetDescription() && x.Status < TaskStatus.Finish);            if (string.IsNullOrEmpty(reqDto.LocCode))            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "站台编号不可为空,请扫描站台编号!!!!!!";                return res;            }            if (string.IsNullOrEmpty(reqDto.TrayCode))            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "托盘条码不可为空,请扫描托盘条码!!!!!!";                return res;            }            //获取工字轮任务信息            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);            if (taskInfo != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";                return res;            }            //托盘            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);            if (container == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "托盘载具初始化失败";                    return res;                }            }            //工字轮            var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);            if (spoolNr == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "工字轮载具初始化失败";                    return res;                }            }            //物料            var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);            if (mater == null)            {                res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                return res;            }            //工字轮库存            var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);            if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //托盘库存            var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //通过投入物料找到垛型编码            var stackdetail =                _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);            if (stackdetail == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;                return res;            }            //获取垛型主表            var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);            //获取工字轮任务信息            var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";                return res;            }            //工字轮条码信息            var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);            if (barInfo == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有条码信息";                return res;            }            try            {                _db.BeginTran();                //更新条码信息                _billInvinitrepository.UpdateModelColumns(p => new BillInvinit                {                    ContGrpBarCode = reqDto.TrayCode,                    EditTime = DateTime.Now                }, p => p.HWBarCode == reqDto.SpoolNr);                //删除因异常导致残留的对应库存信息                _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);                barInfo.ContGrpBarCode = reqDto.TrayCode;                //创建库存信息                //将条码表映射到库存表                var invnow = _mapper.Map<BillInvnow>(barInfo);                invnow.IsTorsChk = true;                invnow.AddTime = DateTime.Now;                invnow.Id = IdFactory.NewId();                if (!_billInvnowrepository.Insert(invnow))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "人工满轮入库存储库存失败";                    return res;                }                //删除这个任务的阻盘记录                var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)                    .Where(x => x.BarCode == reqDto.SpoolNr).Select(x => x.ID).ToList();                if (taskIdList != null)                {                    //删除当前任务与更新历史任务                    _taskrepository.Delete(x => taskIdList.Contains(x.ID));                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                    {                        Status = TaskStatus.Cancel,                        ManualRemarks = "人工满托入库,清除信息"                    }, x => taskIdList.Contains(x.Id));                    //TODO:入库算法                    //TODO:出库算法                    //TODO:最优验证算法                }                //判断对应仓库中空货位数量                var invnowCount_1N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "1N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                var invnowCount_2N = _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.WarehouseCode == "2N" && x.IsStop == 0 && x.StateNum == FjLocationState.Empty && x.Layer < 9);                var taskInfoCount_1N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "1N");                var taskInfoCount_2N = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.人工满托入库.GetDescription() &&                    x.WarehouseCode == "2N");                //创建对应任务                var count_1N = invnowCount_1N - taskInfoCount_1N;                var count_2N = invnowCount_2N - taskInfoCount_2N;                var wCode = count_1N >= count_2N ? "1N" : "2N";                if (taskMax > 0 && taskCount > 0)                    if ((wCode == "1N" && taskMax <= taskInfoCount_1N) ||                        (wCode == "2N" && taskMax <= taskInfoCount_2N))                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止入库,最大入库任务数量已达{taskMax}";                        return res;                    }                //创建入库记录                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = FJTaskBusType.UT人工满托入库.GetDescription(),                    ContGrpBarCode = reqDto.TrayCode,                    Qty = 1,                    Floor = 2,                    MatCode = reqDto.InMaterialCode,                    EquCode = reqDto.LocCode,                    Type = TaskType.EnterDepot,                    DocCode = "",                    WorkBench = task.WorkBench,                    WarehouseCode = wCode /*(count_1N <= count_2N) ? "1N" : "2N"*/                };                //下发wcs任务 - 分解方法                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, task.Grade, true);                if (taskRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskRes.ResCode;                    res.ResMsg = taskRes.ResMsg;                    return res;                }                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.StackTrace;                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();            return res;        }        /// <summary>        ///     芯股满托创建库存信息        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CreateMaterialPalletWarehouTask1(CreateMaterialPalletWarehouTask1Request reqDto)        {            var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };            //获取工字轮任务信息            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);            if (taskInfo != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";                return res;            }            //托盘            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);            if (container == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "托盘载具初始化失败";                    return res;                }            }            //工字轮            var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolNr);            if (spoolNr == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "工字轮载具初始化失败";                    return res;                }            }            //物料            var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.InMaterialCode);            if (mater == null)            {                res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                return res;            }            //工字轮库存            var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolNr);            if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //托盘库存            var trayCode = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.TrayCode);            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //通过投入物料找到垛型编码            var stackdetail =                _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.InMaterialCode && p.IsStop == 0);            if (stackdetail == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有对应的垛型信息,物料编码" + reqDto.InMaterialCode;                return res;            }            //获取垛型主表            var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);            //获取工字轮任务信息            var task = _taskrepository.AsQueryable().With(SqlWith.NoLock).First(x => x.BarCode == reqDto.SpoolNr);            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有组盘任务,请从新注册";                return res;            }            //工字轮条码信息            var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolNr);            if (barInfo == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.SpoolNr + "没有条码信息";                return res;            }            //对应货位是否存在            var wareCell = _basewarecellrepository.GetFirst(p => p.Code == reqDto.LocCode);            if (wareCell == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.LocCode + "没有货位信息";                return res;            }            //判断货位是否已经存储            if (wareCell.StateNum != FjLocationState.Empty)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"货位{reqDto.LocCode}状态不是空,当前状态位{wareCell.StateNum.GetDescription()},请联系相关人员进行处理!!!";                return res;            }            try            {                _db.BeginTran();                //更新条码信息                _billInvinitrepository.UpdateModelColumns(p => new BillInvinit                {                    ContGrpBarCode = reqDto.TrayCode,                    EditTime = DateTime.Now                }, p => p.HWBarCode == reqDto.SpoolNr);                //删除因异常导致残留的对应库存信息                _billInvnowrepository.Delete(x => x.ContGrpBarCode == reqDto.TrayCode || x.HWBarCode == reqDto.SpoolNr);                wareCell.ContGrpBarCode = reqDto.TrayCode;                //创建库存信息                //将条码表映射到库存表                var invnow = _mapper.Map<BillInvnow>(barInfo);                invnow.IsTorsChk = true;                invnow.AddTime = DateTime.Now;                invnow.InvStateCode = FJInvState.InvEcecState_In.ToString();                invnow.ContGrpBarCode = reqDto.TrayCode;                invnow.Id = IdFactory.NewId();                invnow.WarehouseId = wareCell.WarehouseId;                if (!_billInvnowrepository.Insert(invnow))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "芯股满托存储库存失败";                    return res;                }                //存储进入对应的货位                //更新条码信息                _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                {                    ContGrpBarCode = reqDto.TrayCode,                    ContGrpId = invnow.ContGrpId,                    StateNum = FjLocationState.Full,                    EditTime = DateTime.Now                }, p => p.Code == reqDto.LocCode);                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.StackTrace;                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();            return res;        }        /// <summary>        ///     重绕区组盘信息        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CreateMaterialPalletWarehouTask2(RewindFullPalletTaskRequest reqDto)        {            var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };            //获取工字轮任务信息            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);            if (taskInfo != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.TrayCode + "已有任务,请联系智能制造人员进行处理!!!!!!";                return res;            }            //托盘            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);            if (container == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "托盘载具初始化失败";                    return res;                }            }            //托盘库存            var trayCode = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == reqDto.TrayCode);            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_BuildUp.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"{reqDto.TrayCode}已有组盘信息,请确认库存信息";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            var SpoolNoGroup = reqDto.SpoolGroup.Select(x => x.SpoolCode).ToList();            var stackHeaderSet = new List<BillBomsetgrp>();            var matCodes = "";            #region 校验工字轮信息并获取对应垛型            foreach (var spool in reqDto.SpoolGroup)            {                var spoolNr = _baseContinfo.GetSingle(p => p.ContBarCode == spool.SpoolCode);                if (spoolNr == null)                {                    var insertcon = new BaseContinfo                    {                        ContBarCode = spool.SpoolCode,                        Name = spool.SpoolCode,                        TypeCode = ContainerType.ContainerType_Spool.ToString(),                        PrintQty = 1,                        IsStop = 0,                        WarehouseId = 0,                        WeightQty = 0,                        AddWho = "wms",                        AddTime = DateTime.Now                    };                    //新加载具信息                    if (!_baseContinfo.Insert(insertcon))                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = "工字轮载具初始化失败";                        return res;                    }                }                //物料                var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);                if (mater == null)                {                    res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                    return res;                }                //工字轮库存                var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spool.SpoolCode);                if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"工字轮条码{spool.SpoolCode}已在库中,请检查工字轮条码号是否重复";                    return res;                }                if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"工字轮条码{spool.SpoolCode}存在出库中任务,请检查上一个任务是否已经完成";                    return res;                }                //通过投入物料找到垛型编码                var stackDetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == spool.MatCode && p.IsStop == 0);                if (stackDetail == null)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = reqDto.SpoolGroup + "没有对应的垛型信息,物料编码" + spool.MatCode;                    return res;                }                //获取垛型主表                var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackDetail.BomSetHdrId && p.IsStop == 0);                var mat = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);                if (mat != null && string.IsNullOrEmpty(matCodes))                {                    matCodes += mat.Code;                }                else if(mat != null && !string.IsNullOrEmpty(matCodes) && !matCodes.Contains(mat.Code))                {                    matCodes += "," + mat.Code;                }                stackHeaderSet.Add(stack);            }            //if (stackHeaderSet.GroupBy(x => x.Id).Count() != 1)            //{            //    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();            //    res.ResMsg = "扫描托盘不属于同一个垛型,请手动处理后重新组盘";            //    return res;            //}            #endregion            var stackHeader = stackHeaderSet.First();            try            {                _db.BeginTran();                #region 删除所有工字轮信息,并创建新信息                _billInvinitrepository.Delete(x => SpoolNoGroup.Contains(x.ContGrpBarCode));                _billSpoolTransrepository.Delete(x => SpoolNoGroup.Contains(x.ConBarCode));                var materiel = _basematerrepository.GetSingle(p => p.Code == stackHeader.ProMaterCode);                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "CRZP"); //TODO:1换成满托平库满盘Code                var barInfoList = new List<BillInvinit>();                var invNowList = new List<BillInvnow>();                var invFlowList = new List<BillInvflow>();                foreach (var spool in reqDto.SpoolGroup)                {                    var mater = _basematerrepository.GetSingle(p => p.Code == spool.MatCode);                    //工字轮需要用到的托盘类型                    var fJPalletType = FJPalletType.Pallet09;                    if (spool.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;                    var barinfo = InitInvinitInfo(spool, wareHouse, stackHeader, mater, materiel, fJPalletType);                    barInfoList.Add(barinfo);                    //删除因异常导致残留的对应库存信息                    _billInvnowrepository.Delete(x =>                        x.ContGrpBarCode == barinfo.ContGrpBarCode || x.HWBarCode == barinfo.ContGrpBarCode);                    //将条码表映射到库存表                    var invnow = _mapper.Map<BillInvnow>(barinfo);                    invnow.IsTorsChk = true;                    invnow.AddTime = DateTime.Now;                    invnow.InvStateCode = FJInvState.InvEcecState_BuildUp.ToString();                    invnow.ContGrpBarCode = reqDto.TrayCode;                    invnow.Id = IdFactory.NewId();                    invnow.WarehouseId = wareHouse.Id;                    invnow.MatCode = matCodes;                    invnow.Memo = mater.Code;                    invNowList.Add(invnow);                }                if (!_billInvinitrepository.InsertRange(barInfoList))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "重绕满托存储条码信息失败";                    return res;                }                if (!_billInvnowrepository.InsertRange(invNowList))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "重绕满托存储库存信息失败";                    return res;                }                //if (!_billInvflow.InsertRange(invFlowList))                //{                //    _db.RollbackTran();                //    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                //    res.ResMsg = "重绕满托存储库存流水信息失败";                //    return res;                //}                //创建入库记录                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = FJTaskBusType.重绕满托入库.GetDescription(),                    ContGrpBarCode = reqDto.TrayCode,                    Qty = 1,                    Floor = 1,                    MatCode = "",                    EquCode = "",                    Type = TaskType.EnterDepot,                    DocCode = "",                    WorkBench = "",                    WarehouseCode = wareHouse.Code                };                //下发wcs任务 - 分解方法                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);                if (taskRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskRes.ResCode;                    res.ResMsg = taskRes.ResMsg;                    return res;                }                _db.CommitTran();                #endregion            }            catch (Exception e)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.Message;                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();            return res;        }        /// <summary>        ///     创建退料任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes MaterialReturnTaskCreator(MaterialReturnTaskCreatorRequest reqDto)        {            var res = new SRes { ResCode = ResponseStatusCodeEnum.Fail.GetHashCode(), ResMsg = "失败" };            var taskMaxNum = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "CRBackNum").SContent);            var taskNum = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .Count(x => x.BusType == FJTaskBusType.帘线退料重绕.GetDescription() && x.Status < TaskStatus.Finish);            if ( taskMaxNum <= taskNum)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"任务数量已达{taskNum},请稍后再操作!!!!!!";                return res;            }            var taskInfo = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.BarCode == reqDto.TrayCode && x.Status < TaskStatus.Finish);            if (taskInfo != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.TrayCode + "已有任务,不要重复申请,请联系智能制造人员确认处理!!!!!!";                return res;            }            //托盘            var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.TrayCode);            if (container == null)            {                var insertcon = new BaseContinfo                {                    ContBarCode = reqDto.TrayCode,                    Name = reqDto.TrayCode,                    TypeCode = ContainerType.ContainerType_Spool.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    WeightQty = 0,                    AddWho = "wms",                    AddTime = DateTime.Now                };                //新加载具信息                if (!_baseContinfo.Insert(insertcon))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "托盘载具初始化失败";                    return res;                }            }            //托盘库存            var trayCode = _billInvnowrepository.GetFirst(p => p.ContGrpBarCode == reqDto.TrayCode);            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该托盘条码号已在库中,请检查条码号是否重复";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该托盘条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            if (trayCode != null && trayCode.InvStateCode == InvState.InvEcecState_BuildUp.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该托盘条码号存在已组盘中任务,请检查库存信息";                return res;            }            var mac = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.LocCode);            if (mac == null)            {                res.ResMsg = $"找不到对应机台号{reqDto.LocCode}";                return res;            }            try            {                _db.BeginTran();                var wareHouse = _basewarehouserepository.GetFirst(x => x.Code == "CRTL"); //TODO:1换成退料平库满盘Code                //创建入库记录                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = FJTaskBusType.帘线退料重绕.GetDescription(),                    ContGrpBarCode = reqDto.TrayCode,                    Qty = 1,                    Floor = 1,                    MatCode = "",                    EquCode = mac.Station,                    Type = TaskType.EnterDepot,                    DocCode = "",                    WorkBench = mac.Station, //TODO:是否是AGV站台                    WarehouseCode = wareHouse.Code                };                //下发wcs任务 - 分解方法                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, "A", true);                if (taskRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskRes.ResCode;                    res.ResMsg = taskRes.ResMsg;                    return res;                }                _db.CommitTran();            }            catch (Exception e)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.StackTrace;                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.Sucess.ToString();            return res;        }        public SRes ManualBuildStockTrans(ManualBuildStockTransRequest reqDto)        {            var res = new SRes();            return res;        }        /// <summary>        ///     分配分拣库        /// </summary>        /// <returns></returns>        public bool AllocationWarehouseSort(AllocationWarehouseSortRequest reqDto)        {            return true;        }        /// <summary>        ///     agv状态同步接口        /// </summary>        /// <param name="reqDto">请求信息</param>        /// <returns></returns>        public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto)        {            var res = new AgvCallbackResponse { code = AgvResponseCode.Error, message = "失败" };            try            {                _db.BeginTran();                //跟据AGVid找到对应的AGV任务                var agvTask = _agvTaskInfoRepository.AsQueryable().With(SqlWith.RowLock)                    .SplitTable(tabs => tabs.Take(2))                    .First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);                if (agvTask == null)                {                    _db.RollbackTran();                    res.code = AgvResponseCode.Fail;                    res.message = "未找到对应的AGV任务";                    return res;                }                switch (reqDto.method)                {                    case "applyContinue": //表示请求巷道                        agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;                        break;                    case "outbin": //小车退出取货位                        agvTask.AgvStatus = AGVTaskStatus.LeaveGet;                        break;                    case "applySecurity": //表示请求放货或取货                        agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;                        break;                    case "applySecurityPut": //表示请求放货或取货                        agvTask.AgvStatus = AGVTaskStatus.PutRequestOrPermission;                        break;                    case "FJend": //任务完成                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;                        break;                    case "cancel": //取消任务                        if (agvTask.TaskType == AGVTaskType.EnterDepot) agvTask.AgvStatus = AGVTaskStatus.Cancel;                        break;                }                //更新agv任务状态                if (!_agvTaskInfoRepository.UpdateSplitTableModelColumns(x => new WCS_AgvTaskInfo                    {                        AgvStatus = agvTask.AgvStatus                    }, x => x.ID == agvTask.ID && x.AgvID == agvTask.AgvID))                {                    _db.RollbackTran();                    res.code = AgvResponseCode.Fail;                    res.message = $"agv任务{agvTask.AgvID}更新状态至{agvTask.AgvStatus}失败";                    return res;                }                _db.CommitTran();                res.code = AgvResponseCode.Success;                res.message = "成功";            }            catch (Exception ex)            {                _db.RollbackTran();                res.code = AgvResponseCode.Error;                res.message = ex.Message;            }            return res;        }        /// <summary>        ///     帘线领料出库        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CurtainProductionStockOut(CurtainProductionStockOutRequest reqDto)        {            var res = new SRes();            var agvMaxSm = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "AGVSendsMaxQuantity").SContent);            var agvMaxFk = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "AGVMaxNumberEmptyRetur").SContent);            var agvSmNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.CallMaterial)                .SplitTable(x => x.Take(2)).Count();            var agvFkNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.EnterDepot)                .SplitTable(x => x.Take(2)).Count();            var waitingTask = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.BusType == FJTaskBusType.车间叫料.GetDescription() && x.Status == TaskStatus.WaitingToExecute)                .Count();            switch (reqDto.Type)            {                case "1":                    if (agvMaxSm <= agvSmNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";                        return res;                    }                    if (agvMaxFk <= agvFkNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";                        return res;                    }                    if (agvMaxSm <= waitingTask)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大待执行叫料任务已达{waitingTask}";                        return res;                    }                    break;                case "2":                    if (agvMaxFk <= agvFkNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";                        return res;                    }                    break;                case "3":                    if (agvMaxSm <= agvSmNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";                        return res;                    }                    if (agvMaxSm <= waitingTask)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大待执行叫料任务已达{waitingTask}";                        return res;                    }                    break;            }            if (reqDto.Type == "1" || reqDto.Type == "3")            {                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);                if (doc == null)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.BillCode + "工单信息不存在";                    return res;                }                //获取机台信息                var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);                if (mach == null || string.IsNullOrEmpty(mach.Station))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";                    return res;                }                //找到所有的立库货位                var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage)                    .Select(x => x.Id).ToList();                var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                    .Where(p => p.WorkBench == mach.Station && p.Status < TaskStatus.Finish)                    .SplitTable(tabs => tabs.Take(2));                if (task != null && task.Any())                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";                    return res;                }                var setGrpCode = reqDto.TypeCode;                if (setGrpCode.IsNullOrEmpty()) setGrpCode = doc.SetGrpCode;                //获取所有的立库有货库位信息                var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                        new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })                    .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) &&                                         loc.StateNum == FjLocationState.Full &&                                         inv.InvStateCode == InvState.InvEcecState_In.ToString() &&                                         inv.SetGrpCode == setGrpCode &&                                         (!inv.Secondary || inv.ProductTime < DateTime.Now.AddHours(-6)))                    .Where((loc, inv) => inv.IsTorsChk == false)                    .Select((loc, inv) => new                    {                        locId = loc.Id,                        loc.ContGrpBarCode,                        loc.WarehouseId,                        loc.WarehouseCode,                        loc.Code,                        loc.Row,                        loc.Col,                        loc.Layer,                        loc.Depth,                        loc.EditTime,                        inv.MatCode,                        inv.SideNum,                        inv.CLBarCode,                        inv.ProductTime,                        invId = inv.Id                    }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();                if (!wareCellList.Any())                {                    res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription();                    return res;                }                var warehouseCodes = new List<string>();                switch (mach.WarehouseCode)                {                    case "1N":                        warehouseCodes.AddRange(new List<string> { "1N", "1S", "2N", "2S", "3N", "3S" });                        break;                    case "1S":                        warehouseCodes.AddRange(new List<string> { "1S", "1N", "2S", "2N", "3S", "3N" });                        break;                    case "2N":                        warehouseCodes.AddRange(new List<string> { "2N", "2S", "1N", "1S", "3N", "3S" });                        break;                    case "2S":                        warehouseCodes.AddRange(new List<string> { "2S", "2N", "1S", "1N", "3S", "3N" });                        break;                    case "3N":                        warehouseCodes.AddRange(new List<string> { "3N", "3S", "2N", "2S", "1N", "1S" });                        break;                    case "3S":                        warehouseCodes.AddRange(new List<string> { "3S", "3N", "2S", "2N", "1S", "1N" });                        break;                }                var wareCell = wareCellList.OrderBy(x => x.ProductTime) //按照优先级排序                    .ThenBy(x => warehouseCodes.IndexOf(x.WarehouseCode))                    .FirstOrDefault();                try                {                    //获取所有的库存信息                    var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCell.ContGrpBarCode);                    var nowTime = DateTime.Now;                    //创建流水信息                    var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);                    foreach (var invFlow in invFlowList)                    {                        invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                        invFlow.AddTime = nowTime;                        invFlow.Id = IdFactory.NewId();                    }                    _db.BeginTran(); //创建事务                    //更新货位信息                    if (!_basewarecellrepository.UpdateModelColumns(                            p => new BaseWarecell { StateNum = FjLocationState.StockOut },                            p => p.Id == wareCell.locId && p.StateNum == FjLocationState.Full))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"请重新叫料,{wareCell.Code}货位货物已被其他机台叫走!";                        return res;                    }                    //跟新库存                    _billInvnowrepository.UpdateModelColumns(                        p => new BillInvnow                        {                            InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                            EditTime = nowTime                        }, p => p.ContGrpBarCode == wareCell.ContGrpBarCode);                    //新建流水                    _billInvflow.InsertRange(invFlowList);                    //添加出库任务                    RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                    {                        ContGrpBarCode = wareCell.ContGrpBarCode,                        CellNo = wareCell.Code,                        MatCode = wareCell.MatCode,                        EquCode = "1",                        Floor = 1,                        Device = wareCell.WarehouseCode switch                        {                            "1N" => "SRM1",                            "1S" => "SRM2",                            "2N" => "SRM3",                            "2S" => "SRM4",                            "3N" => "SRM5",                            "3S" => "SRM6",                            _ => "ERROR"                        },                        WorkBench = mach.Station,                        WarehouseCode = wareCell.WarehouseCode,                        BusType = FJTaskBusType.车间叫料,                        LastInteractionPoint = reqDto.Type,                        MesNo = reqDto.ReqId,                        EmptyInventory = mach.NearestWarehouseName.IsNullOrEmpty()                            ? wareCell.WarehouseCode                            : mach.NearestWarehouseName                    });                    _db.CommitTran();                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.Memo1 = sotcks.First().Grade;                }                catch (Exception ex)                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = ex.Message;                }            }            else if (reqDto.Type == "2") //单独取空            {                //获取对应机台绑定的仓库                var mach = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.WbCode);                if (mach == null)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"没有对应机台-{reqDto.WbCode}";                    return res;                }                var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p =>                        p.WorkBench == mach.Station && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish)                    .SplitTable(tabs => tabs.Take(2));                if (taskold != null && taskold.Any())                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = mach.Station + "站台号存在进行中的单独取空任务任务,不要重复申请";                    return res;                }                if (string.IsNullOrEmpty(mach.Station))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";                    return res;                }                //获取对应仓库                var warehouse = _basewarehouserepository.GetFirst(x => x.Id == mach.WarehouseId);                if (warehouse == null)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"当前机台没有分配对应仓库-{reqDto.WbCode}";                    return res;                }                //创建入库任务                var wcstask = new WCS_TaskInfo                {                    Type = TaskType.EnterDepot,                    Status = TaskStatus.NewBuild,                    Priority = 0,                    Device = warehouse.Code switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    AddrFrom = reqDto.WbCode,                    AddrTo = warehouse.Code switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    LastInteractionPoint = reqDto.Type,                    BarCode = reqDto.WbCode,                    Floor = 1,                    Length = 1,                    AddTime = DateTime.Now,                    DocID = 0,                    PalletType = 1,                    ProdLine = 1,                    FullQty = 1,                    AddWho = "WMS",                    WarehouseCode = warehouse.Code,                    Enabled = true,                    WorkBench = mach.Station,                    GoodsType = 1,                    BusType = FJTaskBusType.皮盘入库.GetDescription(),                    MatCode = "",                    MaterialCode = mach.NearestWarehouseName.IsNullOrEmpty()                        ? warehouse.Code                        : mach.NearestWarehouseName                };                var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);                try                {                    var task = _taskrepository.InsertReturnEntity(wcstask);                    wcstaskhis.Id = task.ID;                    _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);                    var taskdetail = new WCS_TaskDtl                    {                        ID = Guid.NewGuid(),                        CurPoint = reqDto.WbCode,                        AddTime = DateTime.Now,                        AddWho = "wms",                        Enabled = true,                        ParentTaskCode = task.ID,                        Desc = "单独返空任务"                    };                    _taskdetailrepository.InsertableSplitTable(taskdetail);                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                 }                catch (Exception ex)                {                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                    _logger.LogInformation("保存任务异常:" + ex);                    return res;                }                return res;            }            else            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"位置业务类型-{reqDto.Type}";            }            return res;        }        /// <summary>        ///     帘线叫料接口(人工码垛托盘/芯股)        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes CurtainProductionStockOut1(CurtainProductionStockOutRequest1 reqDto)        {            var res = new SRes();            var agvMaxSm = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "AGVSendsMaxQuantity").SContent);            var agvMaxFk = Convert.ToInt32(_sysconfigrepository.AsQueryable().With(SqlWith.NoLock)                .First(x => x.Code == "AGVMaxNumberEmptyRetur").SContent);            var agvSmNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.CallMaterial)                .SplitTable(x => x.Take(2)).Count();            var agvFkNumber = _agvTaskInfoRepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.AgvStatus < AGVTaskStatus.MissionCompleted && x.TaskType == AGVTaskType.EnterDepot)                .SplitTable(x => x.Take(2)).Count();            var waitingTask = _taskrepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.BusType == FJTaskBusType.车间叫料.GetDescription() && x.Status == TaskStatus.WaitingToExecute)                .Count();            switch (reqDto.Type)            {                case "1":                    if (agvMaxSm <= agvSmNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";                        return res;                    }                    if (agvMaxFk <= agvFkNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";                        return res;                    }                    if (agvMaxSm <= waitingTask)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大待执行叫料任务已达{waitingTask}";                        return res;                    }                    break;                case "2":                    if (agvMaxFk <= agvFkNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大返空任务已达{agvFkNumber}";                        return res;                    }                    break;                case "3":                    if (agvMaxSm <= agvSmNumber)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大送满任务已达{agvSmNumber}";                        return res;                    }                    if (agvMaxSm <= waitingTask)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"禁止叫料,最大待执行叫料任务已达{waitingTask}";                        return res;                    }                    break;            }            if (reqDto.Type == "1" || reqDto.Type == "3")            {                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);                if (doc == null)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.BillCode + "工单信息不存在";                    return res;                }                //获取机台信息                var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);                if (mach == null || string.IsNullOrEmpty(mach.Station))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";                    return res;                }                var warehouse = reqDto.Grade == "A" ?  _basewarehouserepository                    .GetList(x =>x.TypeNum == FjLocationType.Storage || x.TypeNum == FjLocationType.Virtual).Select(x => x.Id).ToList() : _basewarehouserepository                    .GetList(x => x.TypeNum == FjLocationType.Pingku).Select(x => x.Id).ToList();                //判断平库是否有该物料,如有先取平库料                var sotck1 = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.WarehouseId == 1703346265607246826 && x.MatCode.Contains(reqDto.Materialcodecall) && x.InvStateCode ==                InvState.InvEcecState_In.ToString()).First();                if (sotck1 != null && _basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x => x.ContGrpBarCode == sotck1.ContGrpBarCode && x.IsStop == 0 && x.StateNum == FjLocationState.Full)                    && reqDto.Grade == "B")                {                    warehouse = _basewarehouserepository                   .GetList(x => x.TypeNum == FjLocationType.Pingku).Select(x => x.Id).ToList();                }                else                {                    //找到所有的立库/虚拟货位/平库货位                    warehouse = _basewarehouserepository                   .GetList(x =>                       x.TypeNum == FjLocationType.Storage || x.TypeNum == FjLocationType.Virtual                       ).Select(x => x.Id).ToList();                }                                                 var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                    .Where(p => p.WorkBench == mach.Station && p.Status < TaskStatus.Finish)                    .SplitTable(tabs => tabs.Take(2));                if (task != null && task.Any())                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";                    return res;                }                //获取所有的立库/虚拟有货库位信息                var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                        new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })                    .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) &&                                         loc.StateNum == FjLocationState.Full &&                                         inv.InvStateCode == InvState.InvEcecState_In.ToString() &&                                         inv.MatCode.Contains(reqDto.Materialcodecall) &&                                         (!inv.Secondary || inv.ProductTime < DateTime.Now.AddHours(-6)))                    .Where((loc, inv) => inv.IsTorsChk == true)                    .Select((loc, inv) => new                    {                        locId = loc.Id,                        loc.ContGrpBarCode,                        loc.WarehouseId,                        loc.WarehouseCode,                        loc.Code,                        loc.Row,                        loc.Col,                        loc.Layer,                        loc.Depth,                        loc.EditTime,                        loc.TypeNum,                        inv.MatCode,                        inv.SideNum,                        inv.CLBarCode,                        inv.ProductTime,                        invId = inv.Id                    }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();                if (!wareCellList.Any())                {                    res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.NotEnoughStock.GetDescription();                    return res;                }                //var warehouseCodes = new List<string>();                //switch (mach.WarehouseCode)                //{                //    case "1N":                //        warehouseCodes.AddRange(new List<string>() { "1N", "1S", "2N", "2S", "3N", "3S" });                //        break;                //    case "1S":                //        warehouseCodes.AddRange(new List<string>() { "1S", "1N", "2S", "2N", "3S", "3N" });                //        break;                //    case "2N":                //        warehouseCodes.AddRange(new List<string>() { "2N", "2S", "1N", "1S", "3N", "3S" });                //        break;                //    case "2S":                //        warehouseCodes.AddRange(new List<string>() { "2S", "2N", "1S", "1N", "3S", "3N" });                //        break;                //    case "3N":                //        warehouseCodes.AddRange(new List<string>() { "3N", "3S", "2N", "2S", "1N", "1S" });                //        break;                //    case "3S":                //        warehouseCodes.AddRange(new List<string>() { "3S", "3N", "2S", "2N", "1S", "1N" });                //        break;                //}                var wareCell = wareCellList.OrderBy(x => x.ProductTime).FirstOrDefault(); //按照优先级排序                try                {                    //获取所有的库存信息                    var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCell.ContGrpBarCode);                    var nowTime = DateTime.Now;                    //创建流水信息                    var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);                    foreach (var invFlow in invFlowList)                    {                        invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                        invFlow.AddTime = nowTime;                        invFlow.Id = IdFactory.NewId();                    }                    _db.BeginTran(); //创建事务                    //更新货位信息                    if (!_basewarecellrepository.UpdateModelColumns(                            p => new BaseWarecell { StateNum = FjLocationState.StockOut },                            p => p.Id == wareCell.locId && p.StateNum == FjLocationState.Full))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"请重新叫料,{wareCell.Code}货位货物已被其他机台叫走!";                        return res;                    }                    //更新库存                    _billInvnowrepository.UpdateModelColumns(                        p => new BillInvnow                        {                            InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                            EditTime = nowTime                        }, p => p.ContGrpBarCode == wareCell.ContGrpBarCode);                    //新建流水                    _billInvflow.InsertRange(invFlowList);                    //添加出库任务                    RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                    {                        ContGrpBarCode = wareCell.ContGrpBarCode,                        CellNo = wareCell.Code,                        MatCode = wareCell.MatCode,                        EquCode = wareCell.TypeNum == FjLocationType.Storage ? "1" : wareCell.Code,                        Floor = 1,                        Device = wareCell.WarehouseCode switch                        {                            "1N" => "SRM1",                            "1S" => "SRM2",                            "2N" => "SRM3",                            "2S" => "SRM4",                            "3N" => "SRM5",                            "3S" => "SRM6",                            "CRZP" => "CR",                            _ => wareCell.WarehouseCode                        },                        WorkBench = mach.Station,                        WarehouseCode = wareCell.TypeNum == FjLocationType.Storage                            ? wareCell.WarehouseCode                            : mach.WarehouseCode, //如果是芯股的话就使用叫料机台对应的仓库                                               BusType = FJTaskBusType.车间叫料,                        LastInteractionPoint = reqDto.Type,                        MesNo = reqDto.ReqId,                        EmptyInventory = mach.NearestWarehouseName.IsNullOrEmpty()                            ? wareCell.WarehouseCode                            : mach.NearestWarehouseName                    });                    //如果是从芯股虚拟机台叫料的话需要记录芯股组盘机台的送空托需求                    if (wareCell.TypeNum == FjLocationType.Virtual)                    {                        //检查对应芯股支架是否有对应的送空托任务                        var taskList = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                            .Where(p => p.WorkBench == wareCell.Code && p.Type == TaskType.OutDepot                                                                     && p.BusType == FJTaskBusType.芯股站台送空托                                                                         .GetDescription()                                                                     && p.Status < TaskStatus.Finish)                            .SplitTable(tabs => tabs.Take(2)).ToList();                        if (taskList != null && taskList.Any())                        {                            _logger.LogInformation(wareCell.Code + "已有执行中的空托输送任务,不要重复申请");                        }                        else                        {                            //检查是否有对应配置信息                            var sysConfig =                                _sysconfigrepository.GetFirst(x => x.Code == $"{wareCell.Code}-EmptyPallet");                            if (sysConfig == null)                            {                                sysConfig = new fjSysConfig                                {                                    Code = $"{wareCell.Code}-EmptyPallet",                                    Name = $"芯股支架补空托-{wareCell.Code}",                                    SContent = "0",                                    SType = "1",                                    AddWho = "WMS",                                    EditWho = "WMS",                                    Default1 = "1",                                    Default2 = "2",                                    Default3 = "3",                                    Memo = "值为0表示不需要补充空托,1表示有空托需求"                                };                                _sysconfigrepository.Insert(sysConfig);                                sysConfig = _sysconfigrepository.GetFirst(x =>                                    x.Code == $"{wareCell.Code}-EmptyPallet");                            }                            //检查当前站台是否已经有空托需求,无的话改为需要空托盘                            if (sysConfig.SContent == "0")                                //更新库存                                _sysconfigrepository.UpdateModelColumns(                                    p => new fjSysConfig                                    {                                        SContent = "1",                                        EditTime = nowTime                                    }, p => p.Id == sysConfig.Id);                        }                    }                    _db.CommitTran();                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    res.Memo1 = sotcks.First().Grade;                }                catch (Exception ex)                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = ex.Message;                }            }            else if (reqDto.Type == "2") //单独取空            {                //获取对应机台绑定的仓库                var mach = _basemachinforepository.GetFirst(x => x.MachNo == reqDto.WbCode);                if (mach == null)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"没有对应机台-{reqDto.WbCode}";                    return res;                }                var taskold = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p =>                        p.WorkBench == mach.Station && p.Type == TaskType.EnterDepot && p.Status < TaskStatus.Finish)                    .SplitTable(tabs => tabs.Take(2));                if (taskold != null && taskold.Any())                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = mach.Station + "站台号存在进行中的单独取空任务任务,不要重复申请";                    return res;                }                if (string.IsNullOrEmpty(mach.Station))                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";                    return res;                }                //获取对应仓库                var warehouse = _basewarehouserepository.GetFirst(x => x.Id == mach.WarehouseId);                if (warehouse == null)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"当前机台没有分配对应仓库-{reqDto.WbCode}";                    return res;                }                //创建入库任务                var wcstask = new WCS_TaskInfo                {                    Type = TaskType.EnterDepot,                    Status = TaskStatus.NewBuild,                    Priority = 0,                    Device = warehouse.Code switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    AddrFrom = reqDto.WbCode,                    AddrTo = warehouse.Code switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    LastInteractionPoint = reqDto.Type,                    BarCode = reqDto.WbCode,                    Floor = 1,                    Length = 1,                    AddTime = DateTime.Now,                    DocID = 0,                    PalletType = 1,                    ProdLine = 1,                    FullQty = 1,                    AddWho = "WMS",                    WarehouseCode = warehouse.Code,                    Enabled = true,                    WorkBench = mach.Station,                    GoodsType = 1,                    BusType = FJTaskBusType.皮盘入库.GetDescription(),                    MatCode = "",                    MaterialCode = mach.NearestWarehouseName.IsNullOrEmpty()                        ? warehouse.Code                        : mach.NearestWarehouseName                };                var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);                try                {                    var task = _taskrepository.InsertReturnEntity(wcstask);                    wcstaskhis.Id = task.ID;                    _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);                    var taskdetail = new WCS_TaskDtl                    {                        ID = Guid.NewGuid(),                        CurPoint = reqDto.WbCode,                        AddTime = DateTime.Now,                        AddWho = "wms",                        Enabled = true,                        ParentTaskCode = task.ID,                        Desc = "单独返空任务"                    };                    _taskdetailrepository.InsertableSplitTable(taskdetail);                    res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                }                catch (Exception ex)                {                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                    _logger.LogInformation("保存任务异常:" + ex);                    return res;                }                return res;            }            else            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"位置业务类型-{reqDto.Type}";            }            return res;        }        /// <summary>        ///     帘线手动领料出库        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes ManualCurtainProductionStockOut(ManualCurtainProductionStockOut reqDto)        {            var res = new SRes();            //获取机台信息            var mach = _basemachinforepository.GetSingle(x => x.MachNo == reqDto.WbCode);            if (mach == null || string.IsNullOrEmpty(mach.Station))            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = reqDto.WbCode + "机台号没有配置AGV点位坐标";                return res;            }            var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.AddrTo == mach.Station && p.Status < TaskStatus.Finish).SplitTable(tabs => tabs.Take(2));            if (task != null && task.Any())            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = mach.Station + "站台号存在进行中的任务,不要重复申请";                return res;            }            //货位信息验证            var location =                _basewarecellrepository.GetSingle(p => p.Code == reqDto.cellCode && p.WarehouseCode == reqDto.wareCode);            if (location == null)            {                res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();                res.ResMsg = reqDto.cellCode + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();                return res;            }            if (location.StateNum != FjLocationState.Full)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.cellCode + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件";                return res;            }            if (location.IsStop == 1)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + reqDto.cellCode + "被禁用";                return res;            }            //库存信息验证            var stock = _billInvnowrepository.GetFirst(p =>                p.ContGrpBarCode == location.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());            if (stock == null)            {                res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();                return res;            }            if (stock.InvStateCode != InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = reqDto.cellCode + "组盘状态不是已入库";                return res;            }            try            {                //获取所有的库存信息                var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == location.ContGrpBarCode);                var nowTime = DateTime.Now;                //创建流水信息                var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);                foreach (var invFlow in invFlowList)                {                    invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                    invFlow.AddTime = nowTime;                    invFlow.Id = IdFactory.NewId();                }                _db.BeginTran(); //创建事务                //更新货位信息                if (!_basewarecellrepository.UpdateModelColumns(                        p => new BaseWarecell { StateNum = FjLocationState.StockOut },                        p => p.Id == location.Id && p.StateNum == FjLocationState.Full))                {                    _db.RollbackTran();                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"请重新叫料,{location.Code}货位货物已被其他机台叫走!";                    return res;                }                //跟新库存                _billInvnowrepository.UpdateModelColumns(                    p => new BillInvnow                    {                        InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                        EditTime = nowTime                    }, p => p.ContGrpBarCode == location.ContGrpBarCode);                //新建流水                _billInvflow.InsertRange(invFlowList);                //添加出库任务                RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                {                    ContGrpBarCode = location.ContGrpBarCode,                    CellNo = location.Code,                    MatCode = stock.MatCode,                    EquCode = "1",                    Floor = 1,                    Device = location.WarehouseCode switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    WorkBench = mach.Station,                    WarehouseCode = location.WarehouseCode,                    BusType = FJTaskBusType.车间手动叫料                });                _db.CommitTran();                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                res.Memo1 = sotcks.First().Grade;            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.Message;            }            return res;        }        public SRes ProductionBack(FjProductionBackRequest reqDto)        {            var res = new SRes();            return res;        }        /// <summary>        ///     变更流向        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes EditorialFlow(FjEditorialFlowRequest reqDto)        {            var res = new SRes();            //获取对应任务信息             var taskInfo = _wcstaskoldrepository.AsQueryable().Where(x => x.Id == reqDto.TaskId)                .SplitTable(tabs => tabs.Take(2)).First();            if (taskInfo == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"不存在任务{reqDto.TaskId}";                return res;            }            if (taskInfo.Status > TaskStatus.WaitingToExecute)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"任务状态大于待执行{reqDto.TaskId}";                return res;            }            //库存            var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == taskInfo.BarCode);            if (stock != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            //仓库            var warehouse = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode);            if (stock != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            #region 变更仓库信息            try            {                _db.BeginTran();                //变更码垛信息所属仓库                _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans                {                    WarehouseCode = reqDto.WareCode,                    WarehouseSort = int.Parse(reqDto.WareCode.Substring(0, 1)),                    EditTime = DateTime.Now                }, p => p.ConBarCode == taskInfo.BarCode);                //变更条码所属仓库信息                _billInvinitrepository.UpdateModelColumns(x => new BillInvinit                {                    WarehouseId = warehouse.Id                }, x => x.ContGrpBarCode == taskInfo.BarCode);                _db.CommitTran();            }            catch (Exception e)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.StackTrace;            }            #endregion            return res;        }        public SRes ProductionLeftFeedBack(string doccode)        {            var res = new SRes();            return res;        }        public SRes ErrorMaterialStockOut(FjErrorMaterialStockOutRequest reqDto)        {            var res = new SRes();            return res;        }        public SRes BGradeMaterialStockOut(BGradeMaterialStockOutRequest reqDto)        {            var res = new SRes();            return res;        }        public SRes StockChange(FjStockChangeRequest reqDto)        {            var res = new SRes();            return res;        }        public SRes BomInfoTrans(BomInfoTransRequest reqDto)        {            var res = new SRes();            return res;        }        public SRes FJ1NorthAutoGenerateLocation()        {            var res = new SRes();            var BaseWarearea = new BaseWarehouse            {                Id = IdFactory.NewId(),                IsStop = 0,                Code = "1N",                Name = "分拣库1北",                AddTime = DateTime.Now,                AddWho = "admin",                EditTime = DateTime.Now,                EditWho = "admin",                TypeNum = FjLocationType.Storage            };            var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);            var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();            var shelfcode = "";            var list = new List<BaseWarecell>();            var codes = new List<string>();            for (var row = 1; row <= 2; row++) //行            {                var tunnel = 1;                //12行 48列9层                for (var layer = 1; layer <= 10; layer++) //层                for (var col = 1; col <= 10; col++) //列                {                    var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +                               layer.ToString().PadLeft(2, '0') + "-" + tunnel;                    codes.Add(code);                    var name = row + "行" + col + "列" + layer + "层";                    list.Add(new BaseWarecell                    {                        Id = IdFactory.NewId(),                        WarehouseId = baseWareareaEntity.Id,                        WareAreaId = 1669154208777113600,                        IsStop = 0,                        Code = code,                        Name = name,                        StateNum = FjLocationState.Empty,                        TypeNum = FjLocationType.Storage,                        Size = 1,                        Shelf = tunnel + shelfcode,                        WarehouseCode = BaseWarearea.Code,                        Row = row,                        Col = col,                        Layer = layer,                        Depth = 1,                        Tunnel = tunnel,                        SCRel = "SRM" + tunnel.ToString().PadLeft(2, '0'),                        ContGrpId = 0,                        ContGrpBarCode = "",                        Memo = "",                        AddWho = "admin",                        AddTime = DateTime.Now,                        EditWho = "admin",                        EditTime = DateTime.Now                    });                }            }            _basewarecellrepository.InsertRange(list);            return res;        }        public SRes FJSouthAutoGenerateLocation()        {            var res = new SRes();            var BaseWarearea = new BaseWarehouse            {                Id = IdFactory.NewId(),                IsStop = 0,                Code = "1S",                Name = "分拣库1南",                AddTime = DateTime.Now,                AddWho = "admin",                EditTime = DateTime.Now,                EditWho = "admin",                TypeNum = FjLocationType.Storage            };            var baseWareareaEntity = _basewarehouserepository.InsertReturnEntity(BaseWarearea);            var dbBaseWarecellLists = _basewarehouserepository.AsQueryable().ToList();            var shelfcode = "";            var list = new List<BaseWarecell>();            var codes = new List<string>();            for (var row = 1; row <= 2; row++) //行            {                var tunnel = 1;                //12行 48列9层                for (var layer = 1; layer <= 10; layer++) //层                for (var col = 11; col <= 20; col++) //列                {                    var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +                               layer.ToString().PadLeft(2, '0') + "-" + tunnel;                    codes.Add(code);                    var name = row + "行" + col + "列" + layer + "层";                    list.Add(new BaseWarecell                    {                        Id = IdFactory.NewId(),                        WarehouseId = baseWareareaEntity.Id,                        WareAreaId = 1669154208777113600,                        IsStop = 0,                        Code = code,                        Name = name,                        StateNum = FjLocationState.Empty,                        TypeNum = FjLocationType.Storage,                        Size = 1,                        Shelf = tunnel + shelfcode,                        WarehouseCode = BaseWarearea.Code,                        Row = row,                        Col = col,                        Layer = layer,                        Depth = 1,                        Tunnel = tunnel,                        SCRel = "SRM" + 2,                        ContGrpId = 0,                        ContGrpBarCode = "",                        Memo = "",                        AddWho = "admin",                        AddTime = DateTime.Now,                        EditWho = "admin",                        EditTime = DateTime.Now                    });                }            }            _basewarecellrepository.InsertRange(list);            return res;        }        /// <summary>        ///     获取垛型数组        /// </summary>        /// <param name="req"></param>        /// <returns></returns>        public SRes<List<BillBomsetgrp>> FjGetSetGrpList(FjGetSetGrpListRequest req)        {            var res = new SRes<List<BillBomsetgrp>>();            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();            res.ResMsg = "失败";            var setGrps = _BillBomsetgrpRepository.GetList(x => x.ProMaterCode == req.OutMaterialCode && x.IsStop == 0);            if (req.ListmatInfo.Any(v => v == "null"))            {                res.ResMsg = "请重新打开界面";                return res;            }            foreach (var setGrpList in req.ListmatInfo.Select(info =>                         _BillBomsetgrpRepository.GetList(x =>                             (x.BomCode == info || x.BomCode.Contains(info)) && x.IsStop == 0)))                setGrps.AddRange(setGrpList);            setGrps = setGrps.DistinctBy(x => x.Id).ToList();            if (setGrps != null && setGrps.Any())            {                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                res.ResMsg = "成功";                res.Listinfo = setGrps;                return res;            }            res.ResMsg = $"{req}没有对应启用垛型";            return res;        }        /// <summary>        ///     分拣南环形库自动生成库位        /// </summary>        /// <returns></returns>        public SRes RingLibraryAutoGenerateLocation(string WareCode)        {            var res = new SRes();            var wareHouse = _basewarehouserepository.GetSingle(x => x.Code == WareCode);            var list = new List<BaseWarecell>();            var codes = new List<string>();            for (var row = 1; row <= 3; row++) //3行            for (var layer = 1; layer <= 7; layer++) //7层            for (var col = 1; col <= 17; col++) //17列            {                //行列层深度                var code = row.ToString().PadLeft(2, '0') + "-" + col.ToString().PadLeft(2, '0') + "-" +                           layer.ToString().PadLeft(2, '0') + "-" + row.ToString().PadLeft(2, '0');                codes.Add(code);                var name = row + "行" + col + "列" + layer + "层" + row + "深";                list.Add(new BaseWarecell                {                    Id = IdFactory.NewId(),                    WarehouseId = wareHouse.Id,                    WareAreaId = 1669154208777113600,                    IsStop = 0,                    Code = code,                    Name = name,                    StateNum = FjLocationState.Empty,                    TypeNum = FjLocationType.RingLibrary,                    Size = 1,                    Shelf = "1",                    WarehouseCode = wareHouse.Code,                    Row = row,                    Col = col,                    Layer = layer,                    Depth = row,                    SCRel = "Robot" + 2,                    ContGrpId = 0,                    ContGrpBarCode = "",                    Memo = "",                    AddWho = "admin",                    AddTime = DateTime.Now,                    EditWho = "admin",                    EditTime = DateTime.Now                });            }            _basewarecellrepository.InsertRange(list);            return res;        }        /// <summary>        ///     实时库存查询接口        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public GetFJCurStockListResponse GetCurStockList(GetFJCurStockListRequest reqDto)        {            var res = new GetFJCurStockListResponse            {                ResData = new List<FJResDataItem>()            };            var totalCount = 0;            var list = _billInvnowrepository.Context.Queryable<BillInvnow>()                .Where(p => p.InvStateCode == InvState.InvEcecState_In.ToString())                .WhereIF(!string.IsNullOrEmpty(reqDto.MatCode), p => p.MatCode.Contains(reqDto.MatCode))                .WhereIF(!string.IsNullOrEmpty(reqDto.MatName), p => p.MatName.Contains(reqDto.MatName))                .ToPageList(reqDto.PageIndex, reqDto.PageSize, ref totalCount)                .Select(p => new FJResDataItem                    {                        MatCode = p.MatCode,                        MatName = p.MatName,                        MatBarCode = p.CLBarCode,                        Describe = "",                        LocCell = p.PutCol.ToString(),                        LocLayer = p.PutLayer.ToString(),                        LocRow = p.PutRow.ToString(),                        LocCode = p.PutRow + p.PutCol.ToString() + p.PutLayer,                        ConBarCode = p.ContGrpBarCode,                        HWBarCode = p.HWBarCode,                        UpdatedTime = p.EditTime                    }                );            res.TotalCount = totalCount;            res.ResData = list.ToList();            return res;        }        /// <summary>        ///     创建芯股用空托入库任务        /// </summary>        /// <returns></returns>        public void CreateCoreStrandEmptyPalletEnterWarehouse()        {            //查询配置最大库存数量            var sycon = _sysconfigrepository.GetList(x => x.Code.Contains("CoreStrandEmptyPalletMaxNumber"));            foreach (var config in sycon)            {                //获取仓库编号                var warehouseCode = config.Code.Split("-")[1];                var warehouse = _basewarehouserepository.GetFirst(x => x.Code == warehouseCode);                if (warehouse == null)                {                    _logger.LogInformation($"找不到仓库{warehouse}");                    return;                }                //判断对应仓库中是否存在指定缓存数量的空托盘                var invnowCount = _billInvnowrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.ContGrpType == FJContGrpType.EmptyPal && x.InvStateCode == InvState.InvEcecState_In.ToString() &&                    x.WarehouseId == warehouse.Id);                //获取正在执行中的任务                var taskInfoCount = _taskrepository.AsQueryable().With(SqlWith.NoLock).Count(x =>                    x.Status < TaskStatus.Finish && x.BusType == FJTaskBusType.芯股用空托盘入库.GetDescription() &&                    x.WarehouseCode == warehouse.Code);                //创建对应任务                var maxNumber = Convert.ToInt32(config.SContent);                var now = invnowCount + taskInfoCount;                if (now < maxNumber) //已有任务数量和库存数量小于最大缓存数量                {                    _db.BeginTran();                    //开始生成WCS                    var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                    {                        BusType = FJTaskBusType.芯股用空托盘入库.GetDescription(),                        Qty = 1,                        WarehouseCode = warehouse.Code,                        Floor = 2,                        MatCode = "",                        EquCode = "",                        Type = TaskType.EnterDepot,                        DocCode = "",                        WorkBench = ""                    };                    createStockInWcsTaskReqest.ContGrpBarCode = $"{createStockInWcsTaskReqest.BusType}-{warehouseCode}";                    //下发wcs任务 - 分解方法                    var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);                    if (taskRes.ResCode != 200)                    {                        _db.RollbackTran();                        _logger.LogInformation($"{taskRes.ResMsg}");                    }                    _db.CommitTran();                }            }        }        /// <summary>        ///     创建芯股站台用的空托出库任务        /// </summary>        /// <returns></returns>        public SRes CoreStrandSupportReplenishEmptyPallet()        {            var res = new SRes            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()            };            //芯股支架补空托,获取需要空托的支架            var sycon = _sysconfigrepository.GetList(x =>                x.Code.Contains("EmptyPallet") && x.Name.Contains("芯股支架补空托") && x.SContent == "1");            var isEnd = false;            foreach (var config in sycon)            {                if (isEnd) continue;                //获取仓库编号                var wareCellCode = config.Code.Split("-")[0];                var wareCell = _basewarecellrepository.GetFirst(x => x.Code == wareCellCode);                if (wareCell == null)                {                    _logger.LogInformation($"找不到货位{wareCellCode}");                    continue;                }                var taskInfo = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                    .Where(p => p.WorkBench == wareCell.Code && p.Type == TaskType.OutDepot                                                             && p.BusType == FJTaskBusType.芯股站台送空托.GetDescription()                                                             && p.Status < TaskStatus.Finish)                    .SplitTable(tabs => tabs.Take(2)).First();                if (taskInfo != null)                {                    _logger.LogInformation(wareCell.Code + "已有执行中的空托输送任务,不要重复申请");                    continue;                }                //找到所有的立库货位                var warehouse = _basewarehouserepository.GetList(x => x.TypeNum == FjLocationType.Storage)                    .Select(x => x.Id).ToList();                //获取所有的立库有货库位信息                var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                        new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode })                    .Where((loc, inv) => warehouse.Contains(loc.WarehouseId) && loc.IsStop == 0 &&                                         loc.StateNum == FjLocationState.Full &&                                         inv.InvStateCode == InvState.InvEcecState_In.ToString())                    .Where((loc, inv) => inv.ContGrpType == FJContGrpType.EmptyPal)                    .Select((loc, inv) => new                    {                        locId = loc.Id,                        loc.ContGrpBarCode,                        loc.WarehouseId,                        loc.WarehouseCode,                        loc.Code,                        loc.Row,                        loc.Col,                        loc.Layer,                        loc.Depth,                        loc.EditTime,                        loc.TypeNum,                        inv.MatCode,                        inv.SideNum,                        inv.CLBarCode,                        inv.OneInTime,                        invId = inv.Id                    }).ToList().DistinctBy(x => x.ContGrpBarCode).ToList();                if (!wareCellList.Any())                {                    res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                    res.ResMsg = "没有可用空托盘";                    isEnd = true;                    continue;                }                //TODO:暂时不按照芯股支架的位置进行空托盘的出库                var wareCellInfo = wareCellList.OrderBy(x => x.OneInTime).First();                //获取所有的库存信息                var sotcks = _billInvnowrepository.GetList(x => x.ContGrpBarCode == wareCellInfo.ContGrpBarCode);                var nowTime = DateTime.Now;                //创建流水信息                var invFlowList = _mapper.Map<List<BillInvflow>>(sotcks);                foreach (var invFlow in invFlowList)                {                    invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                    invFlow.AddTime = nowTime;                    invFlow.Id = IdFactory.NewId();                }                _db.BeginTran(); //创建事务                //更新货位信息                if (!_basewarecellrepository.UpdateModelColumns(                        p => new BaseWarecell { StateNum = FjLocationState.StockOut },                        p => p.Id == wareCellInfo.locId && p.StateNum == FjLocationState.Full))                {                    _db.RollbackTran();                    _logger.LogInformation($"请重新叫料,{wareCellInfo.Code}货位货物已被其他机台叫走!");                    continue;                }                //更新库存                _billInvnowrepository.UpdateModelColumns(                    p => new BillInvnow                    {                        InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                        EditTime = nowTime                    }, p => p.ContGrpBarCode == wareCellInfo.ContGrpBarCode);                //新建流水                _billInvflow.InsertRange(invFlowList);                //添加出库任务                RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                {                    ContGrpBarCode = wareCellInfo.ContGrpBarCode,                    CellNo = wareCellInfo.Code,                    MatCode = wareCellInfo.MatCode,                    EquCode = wareCellInfo.TypeNum == FjLocationType.Storage ? "1" : wareCellInfo.Code,                    Floor = 1,                    Device = wareCellInfo.WarehouseCode switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => wareCellInfo.WarehouseCode                    },                    WorkBench = wareCell.Code,                    WarehouseCode = wareCellInfo.WarehouseCode, //如果是芯股的话就使用叫料机台对应的仓库                    BusType = FJTaskBusType.芯股站台送空托,                    LastInteractionPoint = "1"                });                _sysconfigrepository.UpdateModelColumns(                    p => new fjSysConfig                    {                        SContent = "0",                        EditTime = nowTime                    }, p => p.Id == config.Id);                _db.CommitTran();                isEnd = true;            }            return res;        }        /// <summary>        ///     二次扫码分配输送地址        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes AllocationConveyorSort(AllocationConveyorSortRequest reqDto)        {            var res = new SRes();            var baritem = _billSpoolTransrepository.GetFirst(p => p.ConBarCode == reqDto.BarCode);            //判断当前库是否有mix垛型            //var mixrow = _billBomsetinfoRepository.AsQueryable().Where(p => p.IsMixRow == 1 && p.WarehouseCode == baritem.WarehouseCode);            //if (mixrow == null || !mixrow.Any())            //{            //    var matcodelist = _billBomsetinfoRepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode);            //    var curmatrate = matcodelist.Where(p => p.MatCode == baritem.MatCode).Count() / matcodelist.Count();            //    //需要的总量            //}            //else            //{            //}            //var translist = _billSpoolTransrepository.AsQueryable().Where(p => p.WarehouseCode == baritem.WarehouseCode).ToList();            //foreach (var item in translist.GroupBy(p => p.ConveyorSort))            //{            //}            return res;        }        #region 初始化仓储        private Repository<fjSysConfig> _sysconfigrepository => new Repository<fjSysConfig>();        /// <summary>        ///     容器表        /// </summary>        private Repository<BaseContinfo> _baseContinfo => new Repository<BaseContinfo>();        /// <summary>        ///     环形库码垛缓存信息        /// </summary>        private Repository<BillRingPalletizingInfo> _billRingPalletizingInfo =>            new Repository<BillRingPalletizingInfo>();        /// <summary>        ///     当前任务表        /// </summary>        private RepositoryTask<WCS_TaskInfo> _taskrepository => new RepositoryTask<WCS_TaskInfo>();        /// <summary>        ///     库存表        /// </summary>        private Repository<BillInvnow> _billInvnowrepository => new Repository<BillInvnow>();        /// <summary>        ///     条码表        /// </summary>        private Repository<BillInvinit> _billInvinitrepository => new Repository<BillInvinit>();        /// <summary>        ///     物料表        /// </summary>        private Repository<BaseMatinfo> _basematerrepository => new Repository<BaseMatinfo>();        /// <summary>        ///     码垛工字轮信息        /// </summary>        private Repository<BillSpoolTrans> _billSpoolTransrepository => new Repository<BillSpoolTrans>();        /// <summary>        ///     异常信息        /// </summary>        private RepositoryTask<BaseErrorInfo> _baseErrorInfoRepository => new RepositoryTask<BaseErrorInfo>();        private Repository<BillBominfo> _billBominfoRepository => new Repository<BillBominfo>();        private Repository<BillPaiKu> _billBillPaiKuRepository => new Repository<BillPaiKu>();        /// <summary>        ///     垛形主表        /// </summary>        private Repository<BillBomsetgrp> _BillBomsetgrpRepository => new Repository<BillBomsetgrp>();        /// <summary>        ///     垛形信息        /// </summary>        private Repository<BillBomsetinfo> _billBomsetinfoRepository => new Repository<BillBomsetinfo>();        /// <summary>        ///     单据表        /// </summary>        private Repository<BillDocsinfo> _billdocrepository => new Repository<BillDocsinfo>();        /// <summary>        ///     任务历史表        /// </summary>        private RepositoryTask<WCS_TaskOld> _wcstaskoldrepository => new RepositoryTask<WCS_TaskOld>();        private RepositoryTask<Bill_InvflowHistory> _invFlowHistoryRepository => new RepositoryTask<Bill_InvflowHistory>();        /// <summary>        ///     agv任务表        /// </summary>        private RepositoryTask<WCS_AgvTaskInfo> _agvTaskInfoRepository => new RepositoryTask<WCS_AgvTaskInfo>();        /// <summary>        ///     流水表        /// </summary>        private Repository<BillInvflow> _billInvflow => new Repository<BillInvflow>();        /// <summary>        ///     甲方管理系统推送反馈        /// </summary>        private Repository<BillPushinfo> _billPushinforepository => new Repository<BillPushinfo>();        /// <summary>        ///     货位表        /// </summary>        private Repository<BaseWarecell> _basewarecellrepository => new Repository<BaseWarecell>();        /// <summary>        ///     仓库表        /// </summary>        private Repository<BaseWarehouse> _basewarehouserepository => new Repository<BaseWarehouse>();        private RepositoryTask<WCS_TaskDtl> _taskdetailrepository => new RepositoryTask<WCS_TaskDtl>();        /// <summary>        ///     机台表        /// </summary>        private Repository<BillMachinfo> _basemachinforepository => new Repository<BillMachinfo>();        private Repository<BillBomsetgrp> _billBomsetgrpRepository => new Repository<BillBomsetgrp>();        private Repository<fjSysJob> _jobRepository => new Repository<fjSysJob>();        private Repository<fjSysJobApiRelation> _jobApiRepository => new Repository<fjSysJobApiRelation>();        #endregion 初始化仓储        #region 湿拉工字轮/帘线芯股信息初始化        /// <summary>        ///     湿拉工字轮/帘线芯股信息初始化        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes SpoolMaterialInfoTrans(SpoolMaterialInfoTransRequest reqDto)        {            var res = new SRes();            try             {                var dateTime = DateTime.Now.AddHours(-12);                #region 超时判断                //获取时间                var prodate = reqDto.ProductDate.GetDateTime(_logger);                if (prodate < dateTime)                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"工字轮注册时间为{reqDto.ProductDate},已超过12小时不允许创建自动化上线任务!!!";                    var error = new BaseErrorInfo                    {                        BusName = "湿拉下盘注册",                        Message = $"{res.ResMsg},[{DateTime.Now:yyyyMMddHH}]",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo(_baseErrorInfoRepository);                    return res;                }                #endregion                //清除十二小时小时前的新建数据                if (_taskrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>                        x.Status == TaskStatus.NewBuild && x.Type == TaskType.SetPlate && x.AddTime < dateTime))                {                    var taskIdList = _taskrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                        .Where(x => x.Status == TaskStatus.NewBuild && x.Type == TaskType.SetPlate && x.AddTime < dateTime)                        .ToList();                    var ids = taskIdList.Select(x => x.ID).ToList();                    //有超过十二小时小时的数据,开始清除                    _taskrepository.Delete(x => ids.Contains(x.ID));                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                    {                        Status = TaskStatus.Cancel,                        ManualRemarks = "产品超时,自动清除任务"                    }, x => ids.Contains(x.Id));                    //清除相关条码、码垛信息                    var barCodes = taskIdList.Select(x => x.BarCode).ToList();                    _billSpoolTransrepository.Delete(x => barCodes.Contains(x.ConBarCode));                    _billInvinitrepository.Delete(x => barCodes.Contains(x.HWBarCode));                }                //容器                var container = _baseContinfo.GetSingle(p => p.ContBarCode == reqDto.SpoolCode);                if (container == null)                {                    var insertcon = new BaseContinfo                    {                        ContBarCode = reqDto.SpoolCode,                        Name = reqDto.SpoolCode,                        TypeCode = ContainerType.ContainerType_Spool.ToString(),                        PrintQty = 1,                        IsStop = 0,                        WarehouseId = 0,                        WeightQty = 0,                        AddWho = "wms",                        AddTime = DateTime.Now                    };                    //新加载具信息                    if (!_baseContinfo.Insert(insertcon))                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = "工字轮载具初始化失败";                        var error = new BaseErrorInfo                        {                            BusName = "湿拉下盘注册",                            Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                            Count = 1,                            Memo = "WCS"                        };                        error.UpdataErrorinfo(_baseErrorInfoRepository);                        return res;                    }                }                //物料                var mater = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);                if (mater == null)                {                    res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                    var error = new BaseErrorInfo                    {                        BusName = "湿拉下盘注册",                        Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo(_baseErrorInfoRepository);                    return res;                }                //码垛工字轮                var billSpoolTrans = new BillSpoolTrans();                billSpoolTrans.ConBarCode = reqDto.SpoolCode;                billSpoolTrans.BillCode = reqDto.BillCode;                billSpoolTrans.WorkOrder = reqDto.WorkOrder;                billSpoolTrans.MatCode = reqDto.MatCode;                billSpoolTrans.WarehouseCode = "";                billSpoolTrans.WarehouseSort = 0;                billSpoolTrans.LocSort = 0;                billSpoolTrans.ConveyorSort = 0;                billSpoolTrans.Direct = "";                billSpoolTrans.ErrType = 0;                billSpoolTrans.AddTime = DateTime.Now;                billSpoolTrans.EditTime = DateTime.Now;                billSpoolTrans.AddWho = "wms";                billSpoolTrans.EditWho = "wms";                //库存                var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == reqDto.SpoolCode);                if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                    return res;                }                if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                    var error = new BaseErrorInfo                    {                        BusName = "湿拉下盘注册",                        Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo(_baseErrorInfoRepository);                    return res;                }                //工字轮需要用到的托盘类型                var fJPalletType = FJPalletType.Pallet09;                if (reqDto.SpoolType != "WS09") fJPalletType = FJPalletType.PalletNo09;                //通过订单找到对应的机台信息                //通过投入物料找到垛型编码                var stackdetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == reqDto.MatCode && p.IsStop == 0);                if (stackdetail == null)                {                    _logger.LogInformation(reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode);                    _billInvinitrepository.Delete(x => x.ContGrpBarCode == billSpoolTrans.ConBarCode);                    _billSpoolTransrepository.Delete(x => x.ConBarCode == billSpoolTrans.ConBarCode);                    _logger.LogInformation($"找不到垛形信息时删除缓存信息{billSpoolTrans.ConBarCode}");                    var task = _taskrepository.GetSingle(x => x.BarCode == billSpoolTrans.ConBarCode);                    if (task != null)                    {                        //删除当前任务与更新历史任务                        _taskrepository.Delete(x => x.ID == task.ID);                        _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                        {                            Status = TaskStatus.Cancel,                            ManualRemarks = "产品重新投放,自动覆盖历史信息"                        }, x => x.Id == task.ID);                    }                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = reqDto.SpoolCode + "没有对应的垛型信息,物料编码" + reqDto.MatCode;                    var error = new BaseErrorInfo                    {                        BusName = "湿拉下盘注册",                        Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo(_baseErrorInfoRepository);                    return res;                }                //机台垛型编码                var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId && p.IsStop == 0);                //找到垛型对应的机台信息                //var macList = _basemachinforepository.GetList(p => stack.Code == p.SetGrpCode);                var paiKuList = _billBillPaiKuRepository.GetList(p => p.BomsetgrpId == stack.Id);                //查询出来的垛型没有对应的机台,开始尝试通过产出匹配机台(适配同产出配多个垛型的情况)                //if (macList.Count <= 0)                //{                //    //查出当前这个垛型同产出对应的所有启用垛型                //    var stacks =                //        _BillBomsetgrpRepository.GetList(p => p.ProMaterCode == stack.ProMaterCode && p.IsStop == 0);                //    var stackCodes = stacks.Select(x => x.Code).ToList();                //    macList = _basemachinforepository.GetList(p => stackCodes.Contains(p.SetGrpCode));                //}                if (paiKuList.Count <= 0)                {                    //查出当前这个垛型同产出对应的所有启用垛型                    var stacks =                        _BillBomsetgrpRepository.GetList(p => p.ProMaterCode == stack.ProMaterCode && p.IsStop == 0);                    var stackIds = stacks.Select(x => x.Id).ToList();                    paiKuList = _billBillPaiKuRepository.GetList(p => stackIds.Contains(p.BomsetgrpId));                }                //查询机台,找到机台对应的仓库信息                //var wareList = macList.Where(x => !x.WarehouseCode.IsNullOrEmpty()).Select(p => p.WarehouseCode).Distinct()                //    .OrderBy(v => v);                var wareList = paiKuList.Where(x => !x.WarehouseCode.IsNullOrEmpty()).Select(p => p.WarehouseCode).Distinct()                    .OrderBy(v => v);                if (!wareList.Any()) //当前订单没有对应仓库信息                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    //res.ResMsg = $"条码:[{reqDto.SpoolCode}]对应的垛型[{stack.Code}]没有配置机台信息";                    res.ResMsg = $"条码:[{reqDto.SpoolCode}]对应的垛型[{stack.Code}]没有配置排库信息";                    var error = new BaseErrorInfo                    {                        BusName = "湿拉下盘注册",                        Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                        Count = 1,                        Memo = "WCS"                    };                    error.UpdataErrorinfo(_baseErrorInfoRepository);                    return res;                }                if (wareList.Count() == 1) //当前订单对应一个仓库信息                {                    var sort = int.Parse(wareList.First().Substring(0, 1));                    _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans                    {                        WarehouseCode = wareList.First(),                        WarehouseSort = sort,                        Direct = wareList.First().Substring(1, 1),                        EditTime = DateTime.Now                    }, p => p.ConBarCode == billSpoolTrans.ConBarCode);                    billSpoolTrans.WarehouseCode = wareList.First();                    billSpoolTrans.WarehouseSort = sort;                    billSpoolTrans.Direct = wareList.First().Substring(1, 1);                }                else //当前订单对应多个仓库信息                {                    //先计算出当前物料在各仓库中应该的占比                    //var wareTempList = macList.Where(x => !x.WarehouseCode.IsNullOrEmpty())                    //    .Select(p => new { p.WarehouseCode }).Distinct();                    var wareTempList = paiKuList.Where(x => !x.WarehouseCode.IsNullOrEmpty())                       .Select(p => new { p.WarehouseCode }).Distinct();                    var vaule = _sysconfigrepository.GetSingle(x => x.Code == "EqualDistributionTimeRange");                    var equalDistributionTimeRange = Convert.ToDecimal(vaule.SContent);                    equalDistributionTimeRange = Math.Abs(equalDistributionTimeRange);                    var statTime = DateTime.Now.AddHours(-Convert.ToInt32(equalDistributionTimeRange));                    var warehouseGoods = _billSpoolTransrepository                        .GetList(s => s.MatCode == reqDto.MatCode && s.AddTime > statTime).ToList();                    var specificGravity = wareTempList.Select(x =>                    {                        decimal currentWarehouseGoodsSum = warehouseGoods.Count(s =>                            s.MatCode == reqDto.MatCode && s.WarehouseCode == x.WarehouseCode);                        decimal warehouseGoodsSum = warehouseGoods.Count;                        //var a = Convert.ToDecimal(macList.Count(m => m.WarehouseCode == x.WarehouseCode));                        //var b = Convert.ToDecimal(macList.Count);                        var a = Convert.ToDecimal(paiKuList.Where(m => m.WarehouseCode == x.WarehouseCode).Sum(m => m.Percent));                        var b = Convert.ToDecimal(paiKuList.Sum(m => m.Percent));                        var specificGravityValue = b == 0 ? 0 : a / b;                        var currentSpecificGravityValue =                            warehouseGoodsSum == 0 ? 0 : currentWarehouseGoodsSum / warehouseGoodsSum;                        return new                        {                            x.WarehouseCode,                            a,                            b,                            SpecificGravity = specificGravityValue, //预期比重                            WarehouseGoods = warehouseGoodsSum, //三个分拣中心实际数量                            CurrentWarehouseGoods = currentWarehouseGoodsSum, //当前分拣中心实际数量                            CurrentSpecificGravity = currentSpecificGravityValue, //当前分拣库实际已有货物占比                            //实际比重与预期比重差值                            //实际比重大于预期比重的默认排在最后                            //实际比重减去预期比重,结果值越大应优先送往                            ProportionGap = currentSpecificGravityValue > specificGravityValue                                ? 0                                : specificGravityValue - currentSpecificGravityValue,                            Direct = x.WarehouseCode.Substring(1, 1)                        };                    }).OrderByDescending(x => x.ProportionGap) //比差越大应当越优先送过去                        .ThenByDescending(x => x.SpecificGravity); //在各库已有货物实际占比达到预期值时按照预期占比最多的优先分配                    _logger.LogInformation($"SpoolMaterialInfoTrans:{JsonConvert.SerializeObject(specificGravity)}");                    var sort = int.Parse(wareList.First().Substring(0, 1));                    _billSpoolTransrepository.UpdateModelColumns(p => new BillSpoolTrans                    {                        WarehouseCode = specificGravity.FirstOrDefault().WarehouseCode,                        WarehouseSort = sort,                        Direct = specificGravity.FirstOrDefault().Direct,                        EditTime = DateTime.Now                    }, p => p.ConBarCode == billSpoolTrans.ConBarCode);                    billSpoolTrans.WarehouseCode = specificGravity.FirstOrDefault().WarehouseCode;                    billSpoolTrans.WarehouseSort = sort;                    billSpoolTrans.Direct = specificGravity.FirstOrDefault().Direct;                }                var promat = _basematerrepository.GetSingle(p => p.Code == stack.ProMaterCode);                //创建条码                var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == billSpoolTrans.WarehouseCode);                //检查条码                var barInfo = _billInvinitrepository.GetFirst(p => p.HWBarCode == reqDto.SpoolCode);                var gra = "";                if (reqDto.Grade != null && !string.IsNullOrEmpty(reqDto.Grade)) gra = reqDto.Grade;                if (barInfo == null) //当前条码无残留信息                {                    var barinfo = InitInvinitInfo(reqDto, wareHosue, stack, mater, promat, fJPalletType);                    try                    {                        _db.BeginTran();                        _billInvinitrepository.InsertReturnEntity(barinfo);                        _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);                        //删除因异常导致残留的对应库存信息                        _billInvnowrepository.Delete(x =>                            x.ContGrpBarCode == billSpoolTrans.ConBarCode || x.HWBarCode == billSpoolTrans.ConBarCode);                        //开始生成WCS                        var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                        {                            BusType = FJTaskBusType.二楼组盘.GetDescription(),                            ContGrpBarCode = reqDto.SpoolCode,                            Qty = 1,                            WarehouseCode = billSpoolTrans.WarehouseCode,                            Floor = 2,                            MatCode = billSpoolTrans.MatCode,                            EquCode = "Robot",                            Type = TaskType.SetPlate,                            DocCode = billSpoolTrans.WorkOrder,                            WorkBench = reqDto.WbCode                        };                        //下发wcs任务 - 分解方法                        var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, gra, true);                        if (taskRes.ResCode != 200)                        {                            _db.RollbackTran();                            res.ResCode = taskRes.ResCode;                            res.ResMsg = taskRes.ResMsg;                            var error = new BaseErrorInfo                            {                                BusName = "湿拉下盘注册",                                Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                                Count = 1,                                Memo = "WCS"                            };                            error.UpdataErrorinfo(_baseErrorInfoRepository);                            return res;                        }                        _db.CommitTran();                        RedisHelper.Set($"AllocationWarehouseSort:{reqDto.SpoolCode}", JsonConvert.SerializeObject(                            new MainlineDiversion                            {                                TaskId = taskRes.ResData.ID,                                WarehouseCode = billSpoolTrans.WarehouseCode                            }));                    }                    catch (Exception ex)                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = ex.StackTrace;                    }                }                else //有残留条码信息更新                {                    try                    {                        //开始生成WCS                        var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                        {                            BusType = FJTaskBusType.二楼组盘.GetDescription(),                            ContGrpBarCode = reqDto.SpoolCode,                            Qty = 1,                            WarehouseCode = billSpoolTrans.WarehouseCode,                            Floor = 2,                            MatCode = billSpoolTrans.MatCode,                            EquCode = "Robot",                            Type = TaskType.SetPlate,                            DocCode = billSpoolTrans.WorkOrder,                            WorkBench = reqDto.WbCode                        };                        var barinfo = InitInvinitInfo(reqDto, wareHosue, stack, mater, promat, fJPalletType);                        _db.BeginTran();                        //更新条码信息                        _billInvinitrepository.Delete(x => x.Id == barInfo.Id);                        _billInvinitrepository.InsertReturnEntity(barinfo);                        //更新码垛信息                        _billSpoolTransrepository.UpdateModelColumns(x => new BillSpoolTrans                        {                            ConBarCode = reqDto.SpoolCode,                            BillCode = reqDto.BillCode,                            WorkOrder = reqDto.WorkOrder,                            MatCode = reqDto.MatCode,                            WarehouseCode = billSpoolTrans.WarehouseCode,                            WarehouseSort = billSpoolTrans.WarehouseSort,                            LocSort = 0,                            ConveyorSort = 0,                            Direct = billSpoolTrans.Direct,                            ErrType = 0,                            EditTime = DateTime.Now,                            EditWho = "wms"                        }, x => x.ConBarCode == billSpoolTrans.ConBarCode);                        if (!_billSpoolTransrepository.GetList(x => x.ConBarCode == billSpoolTrans.ConBarCode).Any())                            _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);                        //删除对应的库存信息                        _billInvnowrepository.Delete(x =>                            x.ContGrpBarCode == billSpoolTrans.ConBarCode || x.HWBarCode == billSpoolTrans.ConBarCode);                        var taskIdList = _taskrepository.AsQueryable().With(SqlWith.NoLock)                            .Where(x => x.BarCode == billSpoolTrans.ConBarCode).Select(x => x.ID).ToList();                        //下发wcs任务 - 分解方法                        var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, gra, true);                        if (taskRes.ResCode != 200)                        {                            _db.RollbackTran();                            res.ResCode = taskRes.ResCode;                            res.ResMsg = taskRes.ResMsg;                            var error = new BaseErrorInfo                            {                                BusName = "湿拉下盘注册",                                Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                                Count = 1,                                Memo = "WCS"                            };                            error.UpdataErrorinfo(_baseErrorInfoRepository);                            return res;                        }                        if (taskIdList != null)                        {                            //删除当前任务与更新历史任务                            _taskrepository.Delete(x => taskIdList.Contains(x.ID));                            _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                            {                                Status = TaskStatus.Cancel,                                ManualRemarks = "产品重新投放,自动覆盖历史信息"                            }, x => taskIdList.Contains(x.Id));                        }                        _db.CommitTran();                        //RedisHelper.Set($"AllocationWarehouseSort:{reqDto.SpoolCode}", JsonConvert.SerializeObject(new MainlineDiversion                        //{                        //    TaskId = taskRes.ResData.ID,                        //    WarehouseCode = billSpoolTrans.WarehouseCode                        //}));                    }                    catch (Exception ex)                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = ex.StackTrace;                        var error = new BaseErrorInfo                        {                            BusName = "湿拉下盘注册",                            Message = $"{res.ResMsg},{DateTime.Now:yyyyMMddHH}",                            Count = 1,                            Memo = "WCS"                        };                        error.UpdataErrorinfo(_baseErrorInfoRepository);                    }                }            }            catch (Exception e)             {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.StackTrace;            }            return res;        }        /// <summary>        ///     生成条码信息        /// </summary>        /// <param name="reqDto">请求实体</param>        /// <param name="wareHosue">仓库信息</param>        /// <param name="stack">垛形信息</param>        /// <param name="mater">物料信息</param>        /// <param name="promat">帘线物料信息</param>        /// <param name="fJPalletType">托盘类型</param>        /// <returns></returns>        public BillInvinit InitInvinitInfo(SpoolMaterialInfoTransRequest reqDto, BaseWarehouse wareHosue,            BillBomsetgrp stack, BaseMatinfo mater, BaseMatinfo promat, FJPalletType fJPalletType)        {            var invInit = new BillInvinit();            invInit.InvBarCode = reqDto.MatBarCode;            invInit.WarehouseId = wareHosue != null ? wareHosue.Id : 0;            invInit.ExecStateCode = InvLockState.InvState_Normal.ToString();            invInit.ExecDocsNo = reqDto.WorkOrder;            invInit.ExecDocsRowNo = reqDto.MatBarCode;            invInit.ExecDocsTypeCode = DocType.DocType_FJ_WetStockIn.GetHashCode().ToString();            invInit.InvInOut = FJInvInOutType.In;            invInit.ExecWho = "MES";            invInit.EditTime = DateTime.Now;            invInit.InvStateCode = InvState.InvEcecState_BuildUp.ToString();            invInit.InDocsNo = reqDto.BillCode;            invInit.InDocsRowNo = reqDto.MatBarCode;            invInit.SuppCode = "";            invInit.BomDocsNo = stack.BomCode;            invInit.BomSetId = stack.Id;            invInit.SetGrpCode = stack.Code;            invInit.BomMatCode = promat.Code;            invInit.BomMatId = promat.Id;            invInit.BomMatName = promat.Name;            invInit.MatId = mater.Id;            invInit.MatCode = mater.Code;            invInit.MatName = mater.Name;            invInit.LengthQty = reqDto.Length;            invInit.TareWQty = reqDto.Weight;            invInit.ProductTime = DateTime.Parse(reqDto.ProductDate);            invInit.RFIDBarCode = "";            invInit.ProductLineNo = reqDto.WbCode;            invInit.Grade = reqDto.Grade;            invInit.HWBarCode = reqDto.SpoolCode;            invInit.HWTypeCode = reqDto.SpoolType; //工字轮类型            invInit.ContGrpBarCode = reqDto.SpoolCode;            invInit.ContGrpType = FJContGrpType.Material;            invInit.ContGrpId = IdFactory.NewId();            invInit.IsFast = reqDto.IsFast;            invInit.IsRework = false;            invInit.CLBarCode = reqDto.MatBarCode;            invInit.Size = 1;            invInit.AddTime = DateTime.Now;            invInit.BackReason = "";            invInit.IsBack = reqDto.IsBack;            invInit.SilkTypeCode = reqDto.SilkType;            invInit.IsCore = reqDto.BusType == 1;            invInit.PalletType = fJPalletType;            return invInit;        }        #endregion 湿拉工字轮/帘线芯股信息初始化        #region 同WCS交互部分        #region 满轮主线        /// <summary>        ///     工字轮/芯股进入主线扫码        /// </summary>        /// <returns></returns>        public SRes<SRes> EnteMainLine(FJEnteMainLineRequest reqDto)        {            var res = new SRes<SRes>();            return res;        }        /// <summary>        ///     码垛创建异常任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes PalletizingCreateseErrorTasks(PalletizingCreateseErrorTasksRequest reqDto)        {            var res = new SRes();            //异常物料的物料号使用Error + 型号组合而成            var matCode = "Error" + reqDto.Type;            //物料            var mater = _basematerrepository.GetSingle(p => p.Code == matCode);            if (mater == null)            {                res.ResCode = ResponseStatusCodeEnum.MaterInfoNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.MaterInfoNotExist.GetDescription();                return res;            }            //判断任务表中是否有相同物料号、起始地址且未结束的任务            var wcsTask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.MatCode == matCode && p.AddrFrom == reqDto.EquNo && p.Status < TaskStatus.Finish)                .SplitTable(tabs => tabs.Take(2)).First();            ;            if (wcsTask != null && wcsTask.Status < TaskStatus.FinishOfShunt) // 如果任务状态小于分流结束,表示已有任务,无需重新生成            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"{reqDto.EquNo}已有新建任务,需优先处理任务{wcsTask.Id}";                return res;            }            //生成一个随机条码            var spoolCode = $"Error{reqDto.Type}{IdFactory.GetInstance().NextId()}";            //码垛工字轮            var billSpoolTrans = new BillSpoolTrans();            billSpoolTrans.ConBarCode = spoolCode;            billSpoolTrans.BillCode = "";            billSpoolTrans.WorkOrder = "";            billSpoolTrans.MatCode = matCode;            billSpoolTrans.WarehouseCode = reqDto.WarehouseCode;            billSpoolTrans.WarehouseSort = 0;            billSpoolTrans.LocSort = 0;            billSpoolTrans.ConveyorSort = 0;            billSpoolTrans.Direct = "";            billSpoolTrans.ErrType = 0;            billSpoolTrans.AddTime = DateTime.Now;            billSpoolTrans.EditTime = DateTime.Now;            billSpoolTrans.AddWho = "wms";            billSpoolTrans.EditWho = "wms";            //库存            var stock = _billInvnowrepository.GetSingle(p => p.HWBarCode == spoolCode);            if (stock != null && stock.InvStateCode == InvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号已在库中,请检查RFID号是否重复";                return res;            }            if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "该工字轮条码号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //检查条码            var barstock = _billInvinitrepository.GetFirst(p => p.HWBarCode == spoolCode);            if (barstock != null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = barstock.HWBarCode + "已使用请检查条码是否重复";                return res;            }            //工字轮需要用到的托盘类型            var fJPalletType = FJPalletType.Pallet09;            if (reqDto.Type != "9") fJPalletType = FJPalletType.PalletNo09;            var prodate = DateTime.Now;            //通过投入物料找到垛型编码            var stackdetail = _billBomsetinfoRepository.GetFirst(p => p.MatCode == matCode);            if (stackdetail == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"请配置{reqDto.Type}工字轮对应的异常垛形";                return res;            }            var stack = _BillBomsetgrpRepository.GetSingle(p => p.Id == stackdetail.BomSetHdrId);            var promat = _basematerrepository.GetSingle(p => p.Code == stack.ProMaterCode);            //创建条码            var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == billSpoolTrans.WarehouseCode);            var barinfo = new BillInvinit            {                InvBarCode = "",                WarehouseId = wareHosue != null ? wareHosue.Id : 0,                ExecStateCode = InvLockState.InvState_Normal.ToString(),                ExecDocsNo = "",                ExecDocsRowNo = "",                ExecDocsTypeCode = "",                InvInOut = FJInvInOutType.In,                ExecWho = "WMS",                EditTime = DateTime.Now,                InvStateCode = InvState.InvEcecState_BuildUp.ToString(),                InDocsNo = "",                InDocsRowNo = "",                SuppCode = "",                BomDocsNo = stack.BomCode,                BomSetId = stack.Id,                SetGrpCode = stack.Code,                BomMatCode = promat.Code,                BomMatId = promat.Id,                BomMatName = promat.Name,                MatId = mater.Id,                MatCode = mater.Code,                MatName = mater.Name,                LengthQty = 0,                TareWQty = 0,                ProductTime = prodate,                RFIDBarCode = "",                ProductLineNo = reqDto.EquNo,                Grade = "",                HWBarCode = spoolCode,                HWTypeCode = reqDto.Type, //工字轮类型                ContGrpBarCode = spoolCode,                ContGrpType = FJContGrpType.Material,                ContGrpId = IdFactory.NewId(),                IsFast = false,                IsRework = false,                CLBarCode = "",                Size = 1,                AddTime = DateTime.Now,                BackReason = "",                IsBack = false,                SilkTypeCode = "",                IsCore = false,                PalletType = fJPalletType            };            try            {                //构造WCS信息                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = FJTaskBusType.二楼异常组盘.GetDescription(),                    ContGrpBarCode = spoolCode,                    Qty = 1,                    WarehouseCode = billSpoolTrans.WarehouseCode,                    Floor = 2,                    MatCode = billSpoolTrans.MatCode,                    EquCode = reqDto.EquNo,                    Type = TaskType.SetPlate,                    DocCode = billSpoolTrans.WorkOrder,                    GoodsType = Convert.ToInt32(reqDto.Type)                };                _db.BeginTran();                _billInvinitrepository.InsertReturnEntity(barinfo);                _billSpoolTransrepository.InsertReturnEntity(billSpoolTrans);                //下发wcs任务 - 分解方法                var graMemo = "";                if (reqDto.errType == 2)                    graMemo = "南北流错";                else if (reqDto.errType == 3) graMemo = "BC";                var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest, graMemo);                if (taskRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskRes.ResCode;                    res.ResMsg = taskRes.ResMsg;                    return res;                }                _db.CommitTran();                RedisHelper.Set($"ErrorTasks:{reqDto.EquNo}:{reqDto.Type}", JsonConvert.SerializeObject(                    new MainlineDiversion                    {                        TaskId = taskRes.ResData.ID,                        WarehouseCode = billSpoolTrans.WarehouseCode                    }));            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.ToString();            }            return res;        }        #endregion 满轮主线        #region 环形库        #region 环形库申请货位(二深)        /// <summary>        ///     环形库申请货位        /// </summary>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc1(FJApplyStockInLocRequest reqEntity)        {            var res = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            try            {                #region 任务信息是否正常                var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                    .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();                ;                if (wcsTask == null)                {                    res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                    return res;                }                if (wcsTask.Type == TaskType.OutDepot)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;                    return res;                }                if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人                {                    res.ResData.CellNo = wcsTask.AddrTo;                    res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[0])                        : 0;                    res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[1])                        : 0;                    res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[2])                        : 0;                    return res;                }                #endregion 任务信息是否正常                //验证仓库信息                var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);                if (wareHouse == null)                {                    res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                    return res;                }                //验证库存                var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);                if (stock == null)                {                    //获取条码表相关信息                    var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode)                        .OrderByDescending(x => x.AddTime).FirstOrDefault();                    if (billInvinit == null)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = "无条码信息";                        return res;                    }                    //将条码表映射到库存表                    stock = _mapper.Map<BillInvnow>(billInvinit);                    stock.AddTime = DateTime.Now;                    stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();                    stock.Id = IdFactory.NewId();                    if (!_billInvnowrepository.Insert(stock))                    {                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                        res.ResMsg = "满轮库存信息存储失败";                        return res;                    }                }                if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";                    return res;                }                //获取包含当前物料、计划个数大于已有个数、未出库                var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x =>                    x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty &&                    !x.Out).OrderBy(x => x.AddTime);                BillRingPalletizingInfo ringPalletizingInfo = null;                if (ringPalletizingInfoList.Any())                    foreach (var ringPalletizing in ringPalletizingInfoList)                    {                        if (ringPalletizingInfo != null) continue;                        //取当前任务SKU在货位中已有的信息                        var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                                new object[]                                {                                    JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                                }).Where((loc, inv) =>                                loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                            .Select((loc, inv) => new                            {                                loc.GroupID,                                inv.MatCode,                                loc.XYNO                            }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);                        var bomSetInfo = _billBomsetinfoRepository.GetList(x =>                            x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 &&                            x.MatCode == wcsTask.MatCode).ToList();                        if (cells.Count() == bomSetInfo.Count)                        {                            res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";                            ringPalletizingInfo = null;                        }                        else                        {                            ringPalletizingInfo = ringPalletizing;                        }                    }                if (ringPalletizingInfo != null)                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);                    var bomSetInfo = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    if (cells.Count() == bomSetInfo.Count)                    {                        res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";                        ringPalletizingInfo = null;                    }                }                if (ringPalletizingInfo == null) //如果没有码垛信息                {                    var bomsetGrp =                        _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));                    if (bomsetGrp == null)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = "未找到对应垛型信息,请确认是否被禁用";                        return res;                    }                    var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)                        .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();                    //跟据垛形信息生成                    ringPalletizingInfo = new BillRingPalletizingInfo                    {                        Id = IdFactory.NewId(),                        WareHouseId = wareHouse.Id,                        BomSetGrpId = bomsetGrp.Id,                        HWCountQty = bomsetGrp.HWCountQty,                        BomCode = bomsetGrp.BomCode,                        HaveQty = 0,                        Out = false,                        LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0                    };                    if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))                    {                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                        res.ResMsg = "环形库满轮码垛信息存储失败";                        return res;                    }                    res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";                }                //获取所有可用货位                var emptyLocList = _basewarecellrepository.Context                    .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(                        (loc1, inv1, loc2, inv2) => new object[]                        {                            JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,                            JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,                            JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode                        })                    .Where((loc1, inv1, loc2, inv2) =>                        loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的                    .Where((loc1, inv1, loc2, inv2) => loc1.IsStop == 0 && loc2.IsStop == 0)                    .Where((loc1, inv1, loc2, inv2) => loc2.Size == loc1.Size)                    .Where((loc1, inv1, loc2, inv2) =>                        wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))                    .Where((loc1, inv1, loc2, inv2) => loc1.Depth == 1 && loc2.Depth == 2) //保证三个深度与字段对应                    .Where((loc1, inv1, loc2, inv2) => loc2.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID                    .Where((loc1, inv1, loc2, inv2) =>                        (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full ||                                                                    loc2.StateNum ==                                                                    FjLocationState.StockIn)) //1空、2有/入锁、3有                        || (loc1.StateNum == FjLocationState.Empty &&                            loc2.StateNum == FjLocationState.Empty) //1空、2空、3有/入锁                        || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty)                    ) //1空、2空、3空                    .Where((loc1, inv1, loc2, inv2) =>                        loc2.StateNum == FjLocationState.Empty ||                        ((loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) &&                         inv2.MatCode == wcsTask.MatCode)                    )                    .Select((loc1, inv1, loc2, inv2) => new                    {                        Loc1Code = loc1.Code,                        Loc1Id = loc1.Id,                        Loc1Row = loc1.Row,                        Loc1Col = loc1.Col,                        Loc1Layer = loc1.Layer,                        Loc1Depth = loc1.Depth,                        Loc1Size = loc1.Size,                        Loc1StateNum = loc1.StateNum,                        Loc1ContGrpBarCode = loc1.ContGrpBarCode,                        Inv1MatCode = inv1.MatCode,                        Loc2Code = loc2.Code,                        Loc2Id = loc2.Id,                        Loc2Row = loc2.Row,                        Loc2Col = loc2.Col,                        Loc2Layer = loc2.Layer,                        Loc2Depth = loc2.Depth,                        Loc2Size = loc2.Size,                        Loc2StateNum = loc2.StateNum,                        Loc2ContGrpBarCode = loc2.ContGrpBarCode,                        Inv2MatCode = inv2.MatCode                    }).ToList();                if (emptyLocList.Any()) //有货位                {                    var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc2StateNum)                        .ThenByDescending(x => x.Loc1StateNum)                        .First();                    if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2                    {                        res.ResData.CellNo = emptyLoc.Loc2Code;                        res.ResData.Row = emptyLoc.Loc2Row;                        res.ResData.Colomn = emptyLoc.Loc2Col;                        res.ResData.Layer = emptyLoc.Loc2Layer;                        res.ResData.Depth = emptyLoc.Loc2Depth;                    }                    else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1                    {                        res.ResData.CellNo = emptyLoc.Loc1Code;                        res.ResData.Row = emptyLoc.Loc1Row;                        res.ResData.Colomn = emptyLoc.Loc1Col;                        res.ResData.Layer = emptyLoc.Loc1Layer;                        res.ResData.Depth = emptyLoc.Loc1Depth;                    }                }                else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息                {                    var emptyLocList1 = _basewarecellrepository.Context                        .Queryable<BaseWarecell, BaseWarecell>(                            (loc1, loc2) => new object[]                            {                                JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer                            })                        .Where((loc1, loc2) =>                            loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的                        .Where((loc1, loc2) => loc1.IsStop == 0 && loc2.IsStop == 0)                        .Where((loc1, loc2) => loc2.Size == loc1.Size)                        .Where((loc1, loc2) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))                        .Where((loc1, loc2) => loc1.Depth == 1 && loc2.Depth == 2) //保证三个深度与字段对应                        .Where((loc1, loc2) => loc1.GroupID == 0 && loc2.GroupID == 0) //获取三个货位都是没有绑定缓存信息的                        .Where((loc1, loc2) =>                            loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty) //1空、2空、3空                        .Select((loc1, loc2) => new                        {                            Loc1Code = loc1.Code,                            Loc1Id = loc1.Id,                            Loc1Row = loc1.Row,                            Loc1Col = loc1.Col,                            Loc1Layer = loc1.Layer,                            Loc1Depth = loc1.Depth,                            Loc1Size = loc1.Size,                            Loc1StateNum = loc1.StateNum,                            Loc1ContGrpBarCode = loc1.ContGrpBarCode,                            Loc2Code = loc2.Code,                            Loc2Id = loc2.Id,                            Loc2Row = loc2.Row,                            Loc2Col = loc2.Col,                            Loc2Layer = loc2.Layer,                            Loc2Depth = loc2.Depth,                            Loc2Size = loc2.Size,                            Loc2StateNum = loc2.StateNum,                            Loc2ContGrpBarCode = loc2.ContGrpBarCode                        }).ToList();                    if (emptyLocList1.Any())                    {                        var emptyLoc = emptyLocList1.OrderBy(x => x.Loc2Layer).ThenBy(x => x.Loc2Col).First();                        res.ResData.CellNo = emptyLoc.Loc2Code;                        res.ResData.Row = emptyLoc.Loc2Row;                        res.ResData.Colomn = emptyLoc.Loc2Col;                        res.ResData.Layer = emptyLoc.Loc2Layer;                        res.ResData.Depth = emptyLoc.Loc2Depth;                    }                }                if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位                {                    res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();                    res.ResMsg = "有空货位单无可用货位";                    return res;                }                List<BillBomsetinfo> bomSetInfos = new List<BillBomsetinfo>();                //分配当前轮子在垛形中的位置                if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList();                    if (cells.Count != ringPalletizingInfo.HaveQty)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg =                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";                        return res;                    }                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);                    //取当前SKU在垛形明细中所有的信息                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个                    var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo))                        .OrderByDescending(x => x).First());                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的                    {                        lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)                            .OrderByDescending(x => x).First();                        ringPalletizingInfo.LastXYNO = xyNo;                    }                    else                    {                        ringPalletizingInfo.LastXYNO = lastXYNO;                    }                }                else //南侧小到大,出的时候刚好可用反过来;                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList();                    if (cells.Count != ringPalletizingInfo.HaveQty)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg =                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";                        return res;                    }                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);                    //取当前SKU在垛形明细中所有的信息                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个                    var lastXYNO =                        Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的                    {                        lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)                            .OrderBy(x => x).First();                        ringPalletizingInfo.LastXYNO = xyNo;                    }                    else                    {                        ringPalletizingInfo.LastXYNO = lastXYNO;                    }                }                if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>                        x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";                    return res;                }                try                {                    _db.BeginTran();                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                        .Where(p => p.Id == reqEntity.TaskNum)                        .SplitTable(x => x.Take(2)).First();                    if (task == null)                    {                        res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                        return res;                    }                    if (task.Type == TaskType.OutDepot)                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;                        return res;                    }                    var outTime = ringPalletizingInfo.AddTime;                    if (stock.ProductTime < ringPalletizingInfo.AddTime) outTime = stock.ProductTime;                    //更新目标缓存信息                    if (!_billRingPalletizingInfo.UpdateModelColumns(                            p => new BillRingPalletizingInfo                            {                                HaveQty = ringPalletizingInfo.HaveQty + 1, LastXYNO = ringPalletizingInfo.LastXYNO,                                AddTime = outTime                            }, p => p.Id == ringPalletizingInfo.Id))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";                        return res;                    }                    //更新目标货位                    if (!_basewarecellrepository.UpdateModelColumns(                            p => new BaseWarecell                            {                                StateNum = FjLocationState.StockIn,                                ContGrpBarCode = task.BarCode,                                ContGrpId = stock.ContGrpId,                                GroupID = ringPalletizingInfo.Id,                                EditTime = DateTime.Now,                                XYNO = ringPalletizingInfo.LastXYNO                            },                            p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo &&                                 p.StateNum == FjLocationState.Empty))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";                        return res;                    }                    //更新货位信息至历史表,防止WCS重复请求,导致信息异常                    if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                        {                            AddrTo = res.ResData.CellNo                        }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";                        return res;                    }                    var bomSetInfo = bomSetInfos.First(x => x.XYNo == ringPalletizingInfo.LastXYNO.ToString());                    //更新库存货物大小信息                    _billInvnowrepository.UpdateModelColumns(                        x => new BillInvnow { Size = reqEntity.Height, SideNum = bomSetInfo.SideNum },                        x => x.Id == stock.Id);                    _db.CommitTran();                }                catch (Exception ex)                {                    _db.RollbackTran();                    _logger.LogInformation(ex.ToString());                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = ex.Message;                }            }            catch (Exception ex)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.Message + ex.StackTrace;            }            return res;        }        /// <summary>        ///     环形库申请货位        /// </summary>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)        {            var res = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            try            {                #region 任务信息是否正常                var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                    .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();                ;                if (wcsTask == null)                {                    res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                    return res;                }                if (wcsTask.Type == TaskType.OutDepot)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;                    return res;                }                if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人                {                    res.ResData.CellNo = wcsTask.AddrTo;                    res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[0])                        : 0;                    res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[1])                        : 0;                    res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null                        ? int.Parse(wcsTask.AddrTo.Split('-')[2])                        : 0;                    return res;                }                #endregion 任务信息是否正常                //验证仓库信息                var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);                if (wareHouse == null)                {                    res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                    return res;                }                //验证库存                var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);                if (stock == null)                {                    //获取条码表相关信息                    var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode)                        .OrderByDescending(x => x.AddTime).FirstOrDefault();                    if (billInvinit == null)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = "无条码信息";                        return res;                    }                    //将条码表映射到库存表                    stock = _mapper.Map<BillInvnow>(billInvinit);                    stock.AddTime = DateTime.Now;                    stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();                    stock.Id = IdFactory.NewId();                    if (!_billInvnowrepository.Insert(stock))                    {                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                        res.ResMsg = "满轮库存信息存储失败";                        return res;                    }                }                if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";                    return res;                }                //获取包含当前物料、计划个数大于已有个数、未出库                var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x =>                    x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty &&                    !x.Out).OrderBy(x => x.AddTime);                BillRingPalletizingInfo ringPalletizingInfo = null;                if (ringPalletizingInfoList.Any())                {                    foreach (var ringPalletizing in ringPalletizingInfoList)                    {                        if (ringPalletizingInfo != null) continue;                        //取当前任务SKU在货位中已有的信息                        var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                                new object[]                                {                                    JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                                }).Where((loc, inv) =>                                loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                            .Select((loc, inv) => new                            {                                loc.GroupID,                                inv.MatCode,                                loc.XYNO                            }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);                        var bomSetInfo = _billBomsetinfoRepository.GetList(x =>                            x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 &&                            x.MatCode == wcsTask.MatCode).ToList();                        if (cells.Count() == bomSetInfo.Count)                        {                            res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";                            ringPalletizingInfo = null;                        }                        else                        {                            ringPalletizingInfo = ringPalletizing;                        }                    }                }                if (ringPalletizingInfo != null)                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);                    var bomSetInfo = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    if (cells.Count() == bomSetInfo.Count)                    {                        res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";                        ringPalletizingInfo = null;                    }                }                else                {   //如果没有码垛信息                    var bomsetGrp =                        _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));                    if (bomsetGrp == null)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = "未找到对应垛型信息,请确认是否被禁用";                        return res;                    }                    var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)                        .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();                    //跟据垛形信息生成                    ringPalletizingInfo = new BillRingPalletizingInfo                    {                        Id = IdFactory.NewId(),                        WareHouseId = wareHouse.Id,                        BomSetGrpId = bomsetGrp.Id,                        HWCountQty = bomsetGrp.HWCountQty,                        BomCode = bomsetGrp.BomCode,                        HaveQty = 0,                        Out = false,                        LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0                    };                    if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))                    {                        res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                        res.ResMsg = "环形库满轮码垛信息存储失败";                        return res;                    }                    res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";                }                //获取所有可用货位                var emptyLocList = _basewarecellrepository.Context                    .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(                        (loc1, inv1, loc2, inv2, loc3, inv3) => new object[]                        {                             JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,                             JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,                             JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode,                             JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,                             JoinType.Left, loc3.ContGrpBarCode == inv3.ContGrpBarCode                        })                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc3.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID                    .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>                        (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) && loc3.StateNum == FjLocationState.Full) //1空、2有/入锁、3有                        || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && (loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn)) //1空、2空、3有/入锁                    || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty)                ) //1空、2空、3空                .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>                        loc3.StateNum == FjLocationState.Empty || ((loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn) && inv3.MatCode == wcsTask.MatCode))                .Select((loc1, inv1, loc2, inv2, loc3, inv3) => new                {                    Loc1Code = loc1.Code,                    Loc1Id = loc1.Id,                    Loc1Row = loc1.Row,                    Loc1Col = loc1.Col,                    Loc1Layer = loc1.Layer,                    Loc1Depth = loc1.Depth,                    Loc1Size = loc1.Size,                    Loc1StateNum = loc1.StateNum,                    Loc1ContGrpBarCode = loc1.ContGrpBarCode,                    Inv1MatCode = inv1.MatCode,                    Loc2Code = loc2.Code,                    Loc2Id = loc2.Id,                    Loc2Row = loc2.Row,                    Loc2Col = loc2.Col,                    Loc2Layer = loc2.Layer,                    Loc2Depth = loc2.Depth,                    Loc2Size = loc2.Size,                    Loc2StateNum = loc2.StateNum,                    Loc2ContGrpBarCode = loc2.ContGrpBarCode,                    Inv2MatCode = inv2.MatCode,                    Loc3Code = loc3.Code,                    Loc3Id = loc3.Id,                    Loc3Row = loc3.Row,                    Loc3Col = loc3.Col,                    Loc3Layer = loc3.Layer,                    Loc3Depth = loc3.Depth,                    Loc3Size = loc3.Size,                    Loc3StateNum = loc3.StateNum,                    Loc3ContGrpBarCode = loc3.ContGrpBarCode,                    Inv3MatCode = inv3.MatCode,                }).ToList();                if (emptyLocList.Any()) //有货位                {                    var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc3StateNum)                    .ThenByDescending(x => x.Loc2StateNum)                    .ThenByDescending(x => x.Loc1StateNum)                    .First();                    if (emptyLoc.Loc3StateNum == FjLocationState.Empty) //优先3                    {                        res.ResData.CellNo = emptyLoc.Loc3Code;                        res.ResData.Row = emptyLoc.Loc3Row;                        res.ResData.Colomn = emptyLoc.Loc3Col;                        res.ResData.Layer = emptyLoc.Loc3Layer;                        res.ResData.Depth = emptyLoc.Loc3Depth;                    }                    else if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2                    {                        res.ResData.CellNo = emptyLoc.Loc2Code;                        res.ResData.Row = emptyLoc.Loc2Row;                        res.ResData.Colomn = emptyLoc.Loc2Col;                        res.ResData.Layer = emptyLoc.Loc2Layer;                        res.ResData.Depth = emptyLoc.Loc2Depth;                    }                    else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1                    {                        res.ResData.CellNo = emptyLoc.Loc1Code;                        res.ResData.Row = emptyLoc.Loc1Row;                        res.ResData.Colomn = emptyLoc.Loc1Col;                        res.ResData.Layer = emptyLoc.Loc1Layer;                        res.ResData.Depth = emptyLoc.Loc1Depth;                    }                }                else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息                {                    var emptyLocList1 = _basewarecellrepository.Context                       .Queryable<BaseWarecell, BaseWarecell, BaseWarecell>(                           (loc1, loc2, loc3) => new object[]                           {                            JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,                            JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,                           })                       .Where((loc1, loc2, loc3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的                       .Where((loc1, loc2, loc3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)                       .Where((loc1, loc2, loc3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)                       .Where((loc1, loc2, loc3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))                       .Where((loc1, loc2, loc3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应                       .Where((loc1, loc2, loc3) => loc1.GroupID == 0 && loc2.GroupID == 0 && loc3.GroupID == 0) //获取三个货位都是没有绑定缓存信息的                       .Where((loc1, loc2, loc3) => loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty) //1空、2空、3空                       .Select((loc1, loc2, loc3) => new                       {                           Loc1Code = loc1.Code,                           Loc1Id = loc1.Id,                           Loc1Row = loc1.Row,                           Loc1Col = loc1.Col,                           Loc1Layer = loc1.Layer,                           Loc1Depth = loc1.Depth,                           Loc1Size = loc1.Size,                           Loc1StateNum = loc1.StateNum,                           Loc1ContGrpBarCode = loc1.ContGrpBarCode,                           Loc2Code = loc2.Code,                           Loc2Id = loc2.Id,                           Loc2Row = loc2.Row,                           Loc2Col = loc2.Col,                           Loc2Layer = loc2.Layer,                           Loc2Depth = loc2.Depth,                           Loc2Size = loc2.Size,                           Loc2StateNum = loc2.StateNum,                           Loc2ContGrpBarCode = loc2.ContGrpBarCode,                           Loc3Code = loc3.Code,                           Loc3Id = loc3.Id,                           Loc3Row = loc3.Row,                           Loc3Col = loc3.Col,                           Loc3Layer = loc3.Layer,                           Loc3Depth = loc3.Depth,                           Loc3Size = loc3.Size,                           Loc3StateNum = loc3.StateNum,                           Loc3ContGrpBarCode = loc3.ContGrpBarCode,                       }).ToList();                    if (emptyLocList1.Any())                    {                        var emptyLoc = emptyLocList1.OrderBy(x => x.Loc3Layer).ThenBy(x => x.Loc3Col).First();                        res.ResData.CellNo = emptyLoc.Loc3Code;                        res.ResData.Row = emptyLoc.Loc3Row;                        res.ResData.Colomn = emptyLoc.Loc3Col;                        res.ResData.Layer = emptyLoc.Loc3Layer;                        res.ResData.Depth = emptyLoc.Loc3Depth;                    }                }                if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位                {                    res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();                    res.ResMsg = "有空货位单无可用货位";                    return res;                }                List<BillBomsetinfo> bomSetInfos = new List<BillBomsetinfo>();                //分配当前轮子在垛形中的位置                if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList();                    if (cells.Count != ringPalletizingInfo.HaveQty)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg =                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";                        return res;                    }                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);                    //取当前SKU在垛形明细中所有的信息                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个                    var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo))                        .OrderByDescending(x => x).First());                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的                    {                        lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)                            .OrderByDescending(x => x).First();                        ringPalletizingInfo.LastXYNO = xyNo;                    }                    else                    {                        ringPalletizingInfo.LastXYNO = lastXYNO;                    }                }                else //南侧小到大,出的时候刚好可用反过来;                {                    //取当前任务SKU在货位中已有的信息                    var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                            new object[]                            {                                JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode                            }).Where((loc, inv) =>                            loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full ||                                                                      loc.StateNum == FjLocationState.StockIn))                        .Select((loc, inv) => new                        {                            loc.GroupID,                            inv.MatCode,                            loc.XYNO                        }).ToList();                    if (cells.Count != ringPalletizingInfo.HaveQty)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg =                            $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";                        return res;                    }                    var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);                    //取当前SKU在垛形明细中所有的信息                    bomSetInfos = _billBomsetinfoRepository.GetList(x =>                        x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 &&                        x.MatCode == wcsTask.MatCode).ToList();                    //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个                    var lastXYNO =                        Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());                    if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的                    {                        lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;                        var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)                            .OrderBy(x => x).First();                        ringPalletizingInfo.LastXYNO = xyNo;                    }                    else                    {                        ringPalletizingInfo.LastXYNO = lastXYNO;                    }                }                if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>                        x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";                    return res;                }                try                {                    _db.BeginTran();                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                        .Where(p => p.Id == reqEntity.TaskNum)                        .SplitTable(x => x.Take(2)).First();                    if (task == null)                    {                        res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                        return res;                    }                    if (task.Type == TaskType.OutDepot)                    {                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                        res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;                        return res;                    }                    var outTime = ringPalletizingInfo.AddTime;                    if (stock.ProductTime < ringPalletizingInfo.AddTime) outTime = stock.ProductTime;                    //更新目标缓存信息                    if (!_billRingPalletizingInfo.UpdateModelColumns(                            p => new BillRingPalletizingInfo                            {                                HaveQty = ringPalletizingInfo.HaveQty + 1,                                LastXYNO = ringPalletizingInfo.LastXYNO,                                AddTime = outTime                            }, p => p.Id == ringPalletizingInfo.Id))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";                        return res;                    }                    //更新目标货位                    if (!_basewarecellrepository.UpdateModelColumns(                            p => new BaseWarecell                            {                                StateNum = FjLocationState.StockIn,                                ContGrpBarCode = task.BarCode,                                ContGrpId = stock.ContGrpId,                                GroupID = ringPalletizingInfo.Id,                                EditTime = DateTime.Now,                                XYNO = ringPalletizingInfo.LastXYNO                            },                            p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo &&                                 p.StateNum == FjLocationState.Empty))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}被锁定";                        return res;                    }                    //更新货位信息至历史表,防止WCS重复请求,导致信息异常                    if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                    {                        AddrTo = res.ResData.CellNo                    }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";                        return res;                    }                    var bomSetInfo = bomSetInfos.First(x => x.XYNo == ringPalletizingInfo.LastXYNO.ToString());                    //更新库存货物大小信息                    _billInvnowrepository.UpdateModelColumns(                        x => new BillInvnow { Size = reqEntity.Height, SideNum = bomSetInfo.SideNum },                        x => x.Id == stock.Id);                    _db.CommitTran();                }                catch (Exception ex)                {                    _db.RollbackTran();                    _logger.LogInformation(ex.ToString());                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = ex.Message;                }            }            catch (Exception ex)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.Message + ex.StackTrace;            }            return res;        }        #endregion        //#region 环形库货位申请(三深)        //public SRes<FJApplyStockInLocResponse> RingApplyStockInLoc(FJApplyStockInLocRequest reqEntity)        //{        //    var res = new SRes<FJApplyStockInLocResponse>()        //    {        //        ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),        //        ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),        //        ResData = new FJApplyStockInLocResponse()        //    };        //    try        //    {        //        #region 任务信息是否正常        //        var wcsTask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();        //        ;        //        if (wcsTask == null)        //        {        //            res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();        //            res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();        //            return res;        //        }        //        if (wcsTask.Type == TaskType.OutDepot)        //        {        //            res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();        //            res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcsTask.Id;        //            return res;        //        }        //        if (!string.IsNullOrEmpty(wcsTask.AddrTo) && wcsTask.AddrTo != "Robot") //如果目标地址不是机器人        //        {        //            res.ResData.CellNo = wcsTask.AddrTo;        //            res.ResData.Row = wcsTask.AddrTo.Split('-')[0] != null ? int.Parse(wcsTask.AddrTo.Split('-')[0]) : 0;        //            res.ResData.Colomn = wcsTask.AddrTo.Split('-')[1] != null ? int.Parse(wcsTask.AddrTo.Split('-')[1]) : 0;        //            res.ResData.Layer = wcsTask.AddrTo.Split('-')[2] != null ? int.Parse(wcsTask.AddrTo.Split('-')[2]) : 0;        //            return res;        //        }        //        #endregion 任务信息是否正常        //        //验证仓库信息        //        var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == wcsTask.WarehouseCode);        //        if (wareHouse == null)        //        {        //            res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();        //            res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();        //            return res;        //        }        //        //验证库存        //        var stock = _billInvnowrepository.GetFirst(p => p.HWBarCode == wcsTask.BarCode);        //        if (stock == null)        //        {        //            //获取条码表相关信息        //            var billInvinit = _billInvinitrepository.GetList(x => x.HWBarCode == wcsTask.BarCode).OrderByDescending(x => x.AddTime).FirstOrDefault();        //            if (billInvinit == null)        //            {        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = "无条码信息";        //                return res;        //            }        //            //将条码表映射到库存表        //            stock = _mapper.Map<BillInvnow>(billInvinit);        //            stock.AddTime = DateTime.Now;        //            stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();        //            stock.Id = IdFactory.NewId();        //            if (!_billInvnowrepository.Insert(stock))        //            {        //                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();        //                res.ResMsg = "满轮库存信息存储失败";        //                return res;        //            }        //        }        //        if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())        //        {        //            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //            res.ResMsg = $"工字轮{wcsTask.BarCode}库存状态异常,不是已组盘,请检查相关任务信息";        //            return res;        //        }        //        //获取包含当前物料、计划个数大于已有个数、未出库        //        var ringPalletizingInfoList = _billRingPalletizingInfo.GetList(x => x.WareHouseId == wareHouse.Id && x.BomCode.Contains(wcsTask.MatCode) && x.HWCountQty > x.HaveQty && !x.Out).OrderBy(x => x.AddTime);        //        BillRingPalletizingInfo ringPalletizingInfo = null;        //        if (ringPalletizingInfoList.Any())        //        {        //            foreach (var ringPalletizing in ringPalletizingInfoList)        //            {        //                if (ringPalletizingInfo != null) continue;        //                //取当前任务SKU在货位中已有的信息        //                var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>        //                        new object[]        //                        {        //                            JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode        //                        }).Where((loc, inv) => loc.GroupID == ringPalletizing.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))        //                    .Select((loc, inv) => new        //                    {        //                        loc.GroupID,        //                        inv.MatCode,        //                        loc.XYNO        //                    }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizing.Id);        //                var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizing.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();        //                if (cells.Count() == bomSetInfos.Count)        //                {        //                    res.Memo2 = $"[{ringPalletizing.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";        //                    ringPalletizingInfo = null;        //                }        //                else ringPalletizingInfo = ringPalletizing;        //            }        //        }        //        if (ringPalletizingInfo != null)        //        {        //            //取当前任务SKU在货位中已有的信息        //            var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>        //                    new object[]        //                    {        //                        JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode        //                    }).Where((loc, inv) => loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))        //                .Select((loc, inv) => new        //                {        //                    loc.GroupID,        //                    inv.MatCode,        //                    loc.XYNO        //                }).ToList().Where(x => x.MatCode == wcsTask.MatCode && x.GroupID == ringPalletizingInfo.Id);        //            var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();        //            if (cells.Count() == bomSetInfos.Count)        //            {        //                res.Memo2 = $"[{ringPalletizingInfo.Id}]-同规格产品已满足需求,任务[{wcsTask.Id}]创建了新的码垛信息";        //                ringPalletizingInfo = null;        //            }        //        }        //        if (ringPalletizingInfo == null) //如果没有码垛信息        //        {        //            var bomsetGrp = _billBomsetgrpRepository.GetFirst(x => x.IsStop == 0 && x.BomCode.Contains(wcsTask.MatCode));        //            var xyNo = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0).ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();        //            //跟据垛形信息生成        //            ringPalletizingInfo = new BillRingPalletizingInfo        //            {        //                Id = IdFactory.NewId(),        //                WareHouseId = wareHouse.Id,        //                BomSetGrpId = bomsetGrp.Id,        //                HWCountQty = bomsetGrp.HWCountQty,        //                BomCode = bomsetGrp.BomCode,        //                HaveQty = 0,        //                Out = false,        //                LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0        //            };        //            if (!_billRingPalletizingInfo.Insert(ringPalletizingInfo))        //            {        //                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();        //                res.ResMsg = "环形库满轮码垛信息存储失败";        //                return res;        //            }        //            res.Memo3 = $"[{wcsTask.MatCode}],任务[{wcsTask.Id}]创建了新的码垛信息";        //        }        //        //获取所有可用货位        //        var emptyLocList = _basewarecellrepository.Context        //            .Queryable<BaseWarecell, BillInvnow, BaseWarecell, BillInvnow, BaseWarecell, BillInvnow>(        //                (loc1, inv1, loc2, inv2, loc3, inv3) => new object[]        //                {        //                    JoinType.Left, loc1.ContGrpBarCode == inv1.ContGrpBarCode,        //                    JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,        //                    JoinType.Left, loc2.ContGrpBarCode == inv2.ContGrpBarCode,        //                    JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,        //                    JoinType.Left, loc3.ContGrpBarCode == inv3.ContGrpBarCode        //                })        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) => loc3.GroupID == ringPalletizingInfo.Id) //三深货位的绑定ID是码垛缓存信息的ID        //            .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>        //                (loc1.StateNum == FjLocationState.Empty && (loc2.StateNum == FjLocationState.Full || loc2.StateNum == FjLocationState.StockIn) && loc3.StateNum == FjLocationState.Full) //1空、2有/入锁、3有        //                || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && (loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn)) //1空、2空、3有/入锁        //            || (loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty)        //        ) //1空、2空、3空        //        .Where((loc1, inv1, loc2, inv2, loc3, inv3) =>        //                loc3.StateNum == FjLocationState.Empty || ((loc3.StateNum == FjLocationState.Full || loc3.StateNum == FjLocationState.StockIn) && inv3.MatCode == wcsTask.MatCode))        //        .Select((loc1, inv1, loc2, inv2, loc3, inv3) => new        //        {        //            Loc1Code = loc1.Code,        //            Loc1Id = loc1.Id,        //            Loc1Row = loc1.Row,        //            Loc1Col = loc1.Col,        //            Loc1Layer = loc1.Layer,        //            Loc1Depth = loc1.Depth,        //            Loc1Size = loc1.Size,        //            Loc1StateNum = loc1.StateNum,        //            Loc1ContGrpBarCode = loc1.ContGrpBarCode,        //            Inv1MatCode = inv1.MatCode,        //            Loc2Code = loc2.Code,        //            Loc2Id = loc2.Id,        //            Loc2Row = loc2.Row,        //            Loc2Col = loc2.Col,        //            Loc2Layer = loc2.Layer,        //            Loc2Depth = loc2.Depth,        //            Loc2Size = loc2.Size,        //            Loc2StateNum = loc2.StateNum,        //            Loc2ContGrpBarCode = loc2.ContGrpBarCode,        //            Inv2MatCode = inv2.MatCode,        //            Loc3Code = loc3.Code,        //            Loc3Id = loc3.Id,        //            Loc3Row = loc3.Row,        //            Loc3Col = loc3.Col,        //            Loc3Layer = loc3.Layer,        //            Loc3Depth = loc3.Depth,        //            Loc3Size = loc3.Size,        //            Loc3StateNum = loc3.StateNum,        //            Loc3ContGrpBarCode = loc3.ContGrpBarCode,        //            Inv3MatCode = inv3.MatCode,        //        }).ToList();        //        if (emptyLocList.Any()) //有货位        //        {        //            var emptyLoc = emptyLocList.OrderByDescending(x => x.Loc3StateNum)        //            .ThenByDescending(x => x.Loc2StateNum)        //            .ThenByDescending(x => x.Loc1StateNum)        //            .First();        //            if (emptyLoc.Loc3StateNum == FjLocationState.Empty) //优先3        //            {        //                res.ResData.CellNo = emptyLoc.Loc3Code;        //                res.ResData.Row = emptyLoc.Loc3Row;        //                res.ResData.Colomn = emptyLoc.Loc3Col;        //                res.ResData.Layer = emptyLoc.Loc3Layer;        //                res.ResData.Depth = emptyLoc.Loc3Depth;        //            }        //            else if (emptyLoc.Loc2StateNum == FjLocationState.Empty) //次2        //            {        //                res.ResData.CellNo = emptyLoc.Loc2Code;        //                res.ResData.Row = emptyLoc.Loc2Row;        //                res.ResData.Colomn = emptyLoc.Loc2Col;        //                res.ResData.Layer = emptyLoc.Loc2Layer;        //                res.ResData.Depth = emptyLoc.Loc2Depth;        //            }        //            else if (emptyLoc.Loc1StateNum == FjLocationState.Empty) //再次1        //            {        //                res.ResData.CellNo = emptyLoc.Loc1Code;        //                res.ResData.Row = emptyLoc.Loc1Row;        //                res.ResData.Colomn = emptyLoc.Loc1Col;        //                res.ResData.Layer = emptyLoc.Loc1Layer;        //                res.ResData.Depth = emptyLoc.Loc1Depth;        //            }        //        }        //        else //找不到对应货位当前缓存信息对应的货位,找到三个全是同一货位的信息        //        {        //            var emptyLocList1 = _basewarecellrepository.Context        //               .Queryable<BaseWarecell, BaseWarecell, BaseWarecell>(        //                   (loc1, loc2, loc3) => new object[]        //                   {        //                    JoinType.Left, loc2.Col == loc1.Col && loc2.Layer == loc1.Layer,        //                    JoinType.Left, loc3.Col == loc2.Col && loc3.Layer == loc2.Layer,        //                   })        //               .Where((loc1, loc2, loc3) => loc1.WarehouseId == wareHouse.Id && loc2.WarehouseId == wareHouse.Id && loc3.WarehouseId == wareHouse.Id) //保证三个深度都是同一个从仓库的        //               .Where((loc1, loc2, loc3) => loc1.IsStop == 0 && loc2.IsStop == 0 && loc3.IsStop == 0)        //               .Where((loc1, loc2, loc3) => loc2.Size == loc1.Size && loc3.Size == loc1.Size)        //               .Where((loc1, loc2, loc3) => wcsTask.GoodsType == 34 || (wcsTask.GoodsType != 34 && loc1.Layer != 6))        //               .Where((loc1, loc2, loc3) => loc1.Depth == 1 && loc2.Depth == 2 && loc3.Depth == 3) //保证三个深度与字段对应        //               .Where((loc1, loc2, loc3) => loc1.GroupID == 0 && loc2.GroupID == 0 && loc3.GroupID == 0) //获取三个货位都是没有绑定缓存信息的        //               .Where((loc1, loc2, loc3) => loc1.StateNum == FjLocationState.Empty && loc2.StateNum == FjLocationState.Empty && loc3.StateNum == FjLocationState.Empty) //1空、2空、3空        //               .Select((loc1, loc2, loc3) => new        //               {        //                   Loc1Code = loc1.Code,        //                   Loc1Id = loc1.Id,        //                   Loc1Row = loc1.Row,        //                   Loc1Col = loc1.Col,        //                   Loc1Layer = loc1.Layer,        //                   Loc1Depth = loc1.Depth,        //                   Loc1Size = loc1.Size,        //                   Loc1StateNum = loc1.StateNum,        //                   Loc1ContGrpBarCode = loc1.ContGrpBarCode,        //                   Loc2Code = loc2.Code,        //                   Loc2Id = loc2.Id,        //                   Loc2Row = loc2.Row,        //                   Loc2Col = loc2.Col,        //                   Loc2Layer = loc2.Layer,        //                   Loc2Depth = loc2.Depth,        //                   Loc2Size = loc2.Size,        //                   Loc2StateNum = loc2.StateNum,        //                   Loc2ContGrpBarCode = loc2.ContGrpBarCode,        //                   Loc3Code = loc3.Code,        //                   Loc3Id = loc3.Id,        //                   Loc3Row = loc3.Row,        //                   Loc3Col = loc3.Col,        //                   Loc3Layer = loc3.Layer,        //                   Loc3Depth = loc3.Depth,        //                   Loc3Size = loc3.Size,        //                   Loc3StateNum = loc3.StateNum,        //                   Loc3ContGrpBarCode = loc3.ContGrpBarCode,        //               }).ToList();        //            if (emptyLocList1.Any())        //            {        //                var emptyLoc = emptyLocList1.OrderBy(x => x.Loc3Layer).ThenBy(x => x.Loc3Col).First();        //                res.ResData.CellNo = emptyLoc.Loc3Code;        //                res.ResData.Row = emptyLoc.Loc3Row;        //                res.ResData.Colomn = emptyLoc.Loc3Col;        //                res.ResData.Layer = emptyLoc.Loc3Layer;        //                res.ResData.Depth = emptyLoc.Loc3Depth;        //            }        //        }        //        if (string.IsNullOrEmpty(res.ResData.CellNo)) //没有分配货位        //        {        //            res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();        //            res.ResMsg = "有空货位单无可用货位";        //            return res;        //        }        //        //分配当前轮子在垛形中的位置        //        if (wareHouse.Code.Contains("N")) //北侧由大到小,出的时候刚好可用反过来;        //        {        //            //取当前任务SKU在货位中已有的信息        //            var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>        //                    new object[]        //                    {        //                        JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode        //                    }).Where((loc, inv) => loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))        //                .Select((loc, inv) => new        //                {        //                    loc.GroupID,        //                    inv.MatCode,        //                    loc.XYNO        //                }).ToList();        //            if (cells.Count != ringPalletizingInfo.HaveQty)        //            {        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";        //                return res;        //            }        //            var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);        //            //取当前SKU在垛形明细中所有的信息        //            var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();        //            //取当前SKU在垛形明细中最大的一个坐标号,初始化时默认取第一个        //            var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First());        //            if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最小数,最小数表示最近入库的        //            {        //                lastXYNO = cellMatCodeList.OrderBy(x => x.XYNO).First().XYNO;        //                var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO).OrderByDescending(x => x).First();        //                ringPalletizingInfo.LastXYNO = xyNo;        //            }        //            else ringPalletizingInfo.LastXYNO = lastXYNO;        //        }        //        else //南侧小到大,出的时候刚好可用反过来;        //        {        //            //取当前任务SKU在货位中已有的信息        //            var cells = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>        //                    new object[]        //                    {        //                        JoinType.Inner, loc.ContGrpBarCode == inv.ContGrpBarCode        //                    }).Where((loc, inv) =>        //                    loc.GroupID == ringPalletizingInfo.Id && (loc.StateNum == FjLocationState.Full || loc.StateNum == FjLocationState.StockIn))        //                .Select((loc, inv) => new        //                {        //                    loc.GroupID,        //                    inv.MatCode,        //                    loc.XYNO        //                }).ToList();        //            if (cells.Count != ringPalletizingInfo.HaveQty)        //            {        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = $"码垛信息组【{ringPalletizingInfo.Id}】记录已有【{ringPalletizingInfo.HaveQty}】个轮子,但对应的库存信息只有【{cells.Count}】,请在WMS检查对应的库存信息";        //                return res;        //            }        //            var cellMatCodeList = cells.Where(x => x.MatCode == wcsTask.MatCode);        //            //取当前SKU在垛形明细中所有的信息        //            var bomSetInfos = _billBomsetinfoRepository.GetList(x => x.BomSetHdrId == ringPalletizingInfo.BomSetGrpId && x.IsEmpty == 0 && x.MatCode == wcsTask.MatCode).ToList();        //            //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个        //            var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());        //            if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的        //            {        //                lastXYNO = cellMatCodeList.OrderByDescending(x => x.XYNO).First().XYNO;        //                var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO).OrderBy(x => x).First();        //                ringPalletizingInfo.LastXYNO = xyNo;        //            }        //            else ringPalletizingInfo.LastXYNO = lastXYNO;        //        }        //        if (_basewarecellrepository.AsQueryable().With(SqlWith.NoLock).Any(x => x.GroupID == ringPalletizingInfo.Id && x.XYNO == ringPalletizingInfo.LastXYNO))        //        {        //            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //            res.ResMsg = $"当前位置已经被分配过了,请检查异常码垛信息{ringPalletizingInfo.Id}-{ringPalletizingInfo.LastXYNO}";        //            return res;        //        }        //        try        //        {        //            _db.BeginTran();        //            var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)").Where(p => p.Id == reqEntity.TaskNum)        //                .SplitTable(x => x.Take(2)).First();        //            if (task == null)        //            {        //                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();        //                res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();        //                return res;        //            }        //            if (task.Type == TaskType.OutDepot)        //            {        //                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();        //                res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;        //                return res;        //            }        //            //更新目标缓存信息        //            if (!_billRingPalletizingInfo.UpdateModelColumns(p => new BillRingPalletizingInfo() { HaveQty = ringPalletizingInfo.HaveQty + 1, LastXYNO = ringPalletizingInfo.LastXYNO }, p => p.Id == ringPalletizingInfo.Id))        //            {        //                _db.RollbackTran();        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = $"货位{res.ResData.CellNo}被锁定";        //                return res;        //            }        //            //更新目标货位        //            if (!_basewarecellrepository.UpdateModelColumns(        //                    p => new BaseWarecell()        //                    {        //                        StateNum = FjLocationState.StockIn,        //                        ContGrpBarCode = task.BarCode,        //                        ContGrpId = stock.ContGrpId,        //                        GroupID = ringPalletizingInfo.Id,        //                        EditTime = DateTime.Now,        //                        XYNO = ringPalletizingInfo.LastXYNO        //                    },        //                    p => p.WarehouseId == wareHouse.Id && p.Code == res.ResData.CellNo && p.StateNum == FjLocationState.Empty))        //            {        //                _db.RollbackTran();        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = $"货位{res.ResData.CellNo}被锁定";        //                return res;        //            }        //            //更新货位信息至历史表,防止WCS重复请求,导致信息异常        //            if (!_wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld()        //            {        //                AddrTo = res.ResData.CellNo        //            }, x => x.Id == wcsTask.Id && x.AddrTo == "Robot"))        //            {        //                _db.RollbackTran();        //                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //                res.ResMsg = $"货位{res.ResData.CellNo}更新货位至任务历史表失败";        //                return res;        //            }        //            //更新库存货物大小信息        //            _billInvnowrepository.UpdateModelColumns(x => new BillInvnow() { Size = reqEntity.Height }, x => x.Id == stock.Id);        //            _db.CommitTran();        //        }        //        catch (Exception ex)        //        {        //            _db.RollbackTran();        //            _logger.LogInformation(ex.ToString());        //            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //            res.ResMsg = ex.Message;        //        }        //    }        //    catch (Exception ex)        //    {        //        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();        //        res.ResMsg = ex.Message + ex.StackTrace;        //    }        //    return res;        //}        //#endregion        /// <summary>        ///     WCS申请码垛出库        /// </summary>        public SRes ApplyPalletizingStockOut(RingApplyPalletizingStockOutRequest req)        {            var res = new SRes            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()            };            //验证仓库信息            var wareHouse = _basewarehouserepository.GetFirst(p => p.Code == req.WareHouseCode);            if (wareHouse == null)            {                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                return res;            }            #region 获取已经成组的码垛信息            var matInfoList = _basematerrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.TimeOut != 0)                .ToList();            var defaultOutTime = _sysconfigrepository.GetFirst(x => x.Code == "DefaultOutTime");            if (defaultOutTime == null) defaultOutTime = new fjSysConfig { SContent = "12" };            var ringPalletizingInfo = _billRingPalletizingInfo                .GetList(x => x.WareHouseId == wareHouse.Id && x.HaveQty > 0 && !x.Out).ToList().OrderBy(x => x.AddTime)                .FirstOrDefault(x =>                {                    var outTime = Convert.ToInt32(defaultOutTime.SContent);                    if (matInfoList.Any(m => x.BomCode.Contains(m.Code)))                        outTime = matInfoList.Where(m => x.BomCode.Contains(m.Code)).Min(m => m.TimeOut);                    return x.HaveQty == x.HWCountQty || x.AddTime < DateTime.Now.AddHours(-outTime);                });            if (ringPalletizingInfo == null)            {                res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                res.ResMsg = "无满跺码垛信息";                return res;            }            #endregion            var wareCellList = _basewarecellrepository.Context.Queryable<BaseWarecell, BillInvnow>((loc, inv) =>                    new object[] { JoinType.Inner, loc.ContGrpBarCode == inv.HWBarCode })                .Where((loc, inv) => loc.WarehouseCode == req.WareHouseCode && loc.StateNum == FjLocationState.Full &&                                     ringPalletizingInfo.Id == loc.GroupID)                .Select((loc, inv) => new CellInfo                {                    Id = loc.Id,                    ContGrpBarCode = loc.ContGrpBarCode,                    WarehouseId = loc.WarehouseId,                    WarehouseCode = loc.WarehouseCode,                    Code = loc.Code,                    Row = loc.Row,                    Col = loc.Col,                    Layer = loc.Layer,                    Depth = loc.Depth,                    EditTime = loc.EditTime,                    MatCode = inv.MatCode,                    SideNum = inv.SideNum,                    CLBarCode = inv.CLBarCode,                    XYNo = loc.XYNO,                    BomDocsNo = inv.BomDocsNo                }).ToList();            if (ringPalletizingInfo.HaveQty != wareCellList.Count)            {                res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                res.ResMsg = $"库存不足{ringPalletizingInfo.Id}";                return res;            }            if (ringPalletizingInfo.HaveQty != wareCellList.DistinctBy(x => x.XYNo).Count())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "码垛信息组XYNo存在重复情况,请查看环形库码垛信息找出是哪一个位置出现重复";                return res;            }            try            {                //找到当前库存信息中可以使用的垛形信息                var bomDocsNos = wareCellList.Select(x => x.BomDocsNo).Distinct().ToList();                var bomSetGrpList = _BillBomsetgrpRepository.GetList(x => bomDocsNos.Contains(x.BomCode));                if (!bomSetGrpList.Any())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = $"{JsonConvert.SerializeObject(bomDocsNos.Distinct())}未找到对应的垛形信息";                    return res;                }                #region 分区计算                //获取最佳码垛位                var findBestStackingPosition = FindBestStackingPosition(wareCellList);                if (findBestStackingPosition.IsNullOrEmpty())                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = "分区计算异常无对应结果";                    return res;                }                if (findBestStackingPosition != req.EquCode) //当前码垛位不是最近码垛位置                {                    //查看最近码垛位是否存在未结束的码垛任务                    var used = _taskrepository.AsQueryable().With(SqlWith.NoLock).Any(x =>                        x.AddrTo == findBestStackingPosition && x.BusType == FJTaskBusType.环形库出库码垛任务.GetDescription() &&                        x.Status < TaskStatus.Finish);                    //有正在执行的任务,报错返回                    if (!used)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"优先最近码垛位执行-{findBestStackingPosition}";                        return res;                    }                }                #endregion                foreach (var doc in bomSetGrpList)                {                    //找到对应的垛形信息                    var bomSetGrp = _BillBomsetgrpRepository.GetSingle(x => doc.Id == x.Id);                    //是否可以码垛,默认可以码垛                    var isPalletize = true;                    if (isPalletize) //开始计算出库任务                        //开始为各种物料生成对应的出库任务                        try                        {                            //开始更新相关数据                            _db.BeginTran(); //创建事务                            _billRingPalletizingInfo.UpdateModelColumns(p => new BillRingPalletizingInfo { Out = true },                                p => p.Id == ringPalletizingInfo.Id);                            foreach (var cell in wareCellList)                            {                                //更新货位信息                                _basewarecellrepository.UpdateModelColumns(                                    p => new BaseWarecell { StateNum = FjLocationState.StockOut },                                    p => p.Id == cell.Id && p.StateNum == FjLocationState.Full);                                //更新库存信息                                var sotck = _billInvnowrepository.GetSingle(x =>                                    x.ContGrpBarCode == cell.ContGrpBarCode && x.HWBarCode == cell.ContGrpBarCode &&                                    x.PutCol == cell.Col && x.PutLayer == cell.Layer && x.PutRow == cell.Row);                                if (sotck == null)                                {                                    _db.RollbackTran(); //回滚事务                                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                                    res.ResMsg = $"未找到库存信息{cell.ContGrpBarCode}";                                    return res;                                }                                _billInvnowrepository.UpdateModelColumns(                                    p => new BillInvnow                                    {                                        InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                                        EditTime = DateTime.Now                                    }, p => p.HWBarCode == cell.ContGrpBarCode);                                //更新流水信息                                var invFlow = _mapper.Map<BillInvflow>(sotck);                                invFlow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                                invFlow.AddTime = DateTime.Now;                                invFlow.Id = IdFactory.NewId();                                invFlow.Memo = "出库码垛";                                _billInvflow.Insert(invFlow);                                //添加出库任务                                var task = RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                                {                                    ContGrpBarCode = cell.ContGrpBarCode,                                    CellNo = cell.Code,                                    MatCode = cell.MatCode,                                    EquCode = req.EquCode,                                    Floor = 2,                                    ProdLine = Convert.ToInt16(cell.XYNo),                                    PalletType = bomSetGrp.ShortCode,                                    FullQty = (short)ringPalletizingInfo.HaveQty,                                    Device = req.Device,                                    WarehouseCode = cell.WarehouseCode,                                    BusType = FJTaskBusType.环形库出库码垛任务,                                    GoodsType = sotck.Size                                });                                if (task.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())                                {                                    _db.RollbackTran(); //回滚事务                                    res = task;                                    return res;                                }                                wareCellList = wareCellList.Where(x => x.Id != cell.Id).ToList();                            }                            _db.CommitTran(); //提交事务                            break;                        }                        catch (Exception e)                        {                            _db.RollbackTran(); //回滚事务                            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                            _logger.LogInformation(e.ToString());                            res.ResMsg = e.StackTrace;                        }                }            }            catch (Exception e)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                _logger.LogInformation(e.ToString());                res.ResMsg = e.Message;            }            ;            return res;        }        /// <summary>        ///     环形库创建WCS出库任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<WCS_TaskInfo> RingCreateStockOutWcsTask(FJCreateStockOutWcsTaskRequest reqDto)        {            var res = new SRes<WCS_TaskInfo>();            var bus = reqDto.BusType.GetDescription();            var wcstask = new WCS_TaskInfo            {                Type = TaskType.OutDepot,                Status = TaskStatus.NewBuild,                Priority = 0,                Device = reqDto.Device,                SrmStation = reqDto.EquCode,                AddrFrom = reqDto.CellNo,                AddrTo = reqDto.EquCode,                LastInteractionPoint = reqDto.LastInteractionPoint,                BarCode = reqDto.ContGrpBarCode,                Floor = reqDto.Floor,                Length = reqDto.Qty,                AddTime = DateTime.Now,                DocID = 0,                PalletType = reqDto.PalletType,                ProdLine = reqDto.ProdLine,                FullQty = reqDto.FullQty,                AddWho = "WMS",                WarehouseCode = reqDto.WarehouseCode,                Enabled = true,                WorkBench = reqDto.WorkBench,                GoodsType = reqDto.GoodsType,                BusType = bus,                MatCode = reqDto.MatCode,                WorkOrder = reqDto.MesNo,                MaterialCode = reqDto.EmptyInventory            };            var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);            try            {                var task = _taskrepository.InsertReturnEntity(wcstask);                wcstaskhis.Id = task.ID;                _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);                var taskdetail = new WCS_TaskDtl                {                    ID = Guid.NewGuid(),                    CurPoint = reqDto.CellNo,                    AddTime = DateTime.Now,                    AddWho = "wms",                    Enabled = true,                    ParentTaskCode = task.ID,                    Desc = "创建出库任务"                };                _taskdetailrepository.InsertableSplitTable(taskdetail);                res.ResData = task;                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            }            catch (Exception ex)            {                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                _logger.LogInformation("保存任务异常:" + ex);                return res;            }            return res;        }        #endregion 环形库        #region 码垛        /// <summary>        ///     生成组盘任务,空托盘        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes GroupTask(FJBuildEmptyPalletsStockDto reqDto)        {            var res = new SRes();            var BusType = reqDto.BusType;            //验证业务类型            if (reqDto.BusType != FJTaskBusType.组盘_托盘)            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription();                return res;            }            ////验证是否有空余货位            //res = _mapper.Map<CopperLineResponse>(IsThereAnySpaceVacancy());            //if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            //检查仓库是否存在            res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WareCode));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            //验证容器是否存在            res = _mapper.Map<CopperLineResponse>(                CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            //验证托盘是否有未结束的任务            res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(reqDto.PalletCode));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest            {                BusType = BusType.GetDescription(),                ContGrpBarCode = reqDto.PalletCode,                Qty = reqDto.PalletNum.ObjToDecimal(),                EquCode = reqDto.StartLoc,                WarehouseCode = reqDto.WareCode,                Floor = reqDto.Floor,                Type = TaskType.SetPlate            };            //下发wcs任务 - 分解方法            var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);            if (taskres.ResCode != 200)            {                res.ResCode = taskres.ResCode;                res.ResMsg = taskres.ResMsg;                return res;            }            return res;        }        /// <summary>        ///     绑定托盘与工字轮        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes BingPallet(FJBingPalletDto reqDto)        {            var res = new SRes();            reqDto.PalletCode = Regex.Replace(reqDto.PalletCode.Trim(), @"[\r\n]", "");            //检查仓库是否存在            res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WarehouseCode));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            #region 检查托盘任务是否有效            //容器信息            var palletContainer = _baseContinfo.GetSingle(x => x.ContBarCode == reqDto.PalletCode);            if (palletContainer == null)            {                //创建容器信息                var cont = new BaseContinfo                {                    ContBarCode = reqDto.PalletCode,                    Name = reqDto.PalletCode,                    TypeCode = FJContainerType.ContainerType_Pallet.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    AddWho = "WMS",                    AddTime = DateTime.Now                };                //加载新的容器信息                if (!_baseContinfo.Insert(cont))                {                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "载具初始化失败";                    return res;                }            }            else if (palletContainer.IsStop != 0)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "容器已停用";                return res;            }            #endregion 检查托盘任务是否有效            if (reqDto.IsFinish)            {                if (reqDto.IsItHalf)                {                    _db.BeginTran();                    var invnow = _billInvnowrepository.GetList(x => reqDto.PalletCode == x.ContGrpBarCode);                    var invnowIds = invnow.Select(x => x.Id);                    _billInvnowrepository.UpdateModelColumns(x => new BillInvnow                    {                        IsFail = reqDto.IsFail,                        FailReason = reqDto.FailReason,                        Secondary = true                    }, x => invnowIds.Contains(x.Id));                    //开始生成WCS                    var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                    {                        BusType = FJTaskBusType.码垛入库.GetDescription(),                        ContGrpBarCode = reqDto.PalletCode,                        Qty = 1,                        WarehouseCode = reqDto.WarehouseCode,                        Floor = 2,                        EquCode = reqDto.loc,                        Height = 1, //带料托盘默认为小货位                        Type = TaskType.EnterDepot                    };                    //下发wcs任务 - 分解方法                    var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);                    if (taskRes.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())                    {                        _db.RollbackTran(); //回滚事务                        res = taskRes;                        return res;                    }                    _db.CommitTran();                }                else                {                    _db.BeginTran();                    var invnow = _billInvnowrepository.GetList(x => reqDto.PalletCode == x.ContGrpBarCode);                    if (invnow.Count <= 0)                    {                        _db.RollbackTran(); //回滚事务                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = "无法结盘,当前托盘条码无对应绑盘库存信息请检查当前码垛工位是否完成绑定动作";                        return res;                    }                    if (!reqDto.IsFail)                        if (invnow.Count != reqDto.TaskCode.Count)                        {                            _db.RollbackTran(); //回滚事务                            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                            res.ResMsg = $"实有库存信息数量与应有库存信息数量不匹配;实有{invnow.Count}--应有{reqDto.TaskCode.Count}";                            return res;                        }                    var invnowIds = invnow.Select(x => x.Id);                    _billInvnowrepository.UpdateModelColumns(x => new BillInvnow                    {                        IsFail = reqDto.IsFail,                        FailReason = reqDto.FailReason,                        Secondary = false                    }, x => invnowIds.Contains(x.Id));                    //开始生成WCS                    var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                    {                        BusType = FJTaskBusType.码垛入库.GetDescription(),                        ContGrpBarCode = reqDto.PalletCode,                        Qty = 1,                        WarehouseCode = reqDto.WarehouseCode,                        Floor = 2,                        EquCode = reqDto.loc,                        Height = 1, //带料托盘默认为小货位                        Type = TaskType.EnterDepot                    };                    //下发wcs任务 - 分解方法                    var taskRes = CreateStockInWcsTask(createStockInWcsTaskReqest);                    if (taskRes.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode())                    {                        _db.RollbackTran(); //回滚事务                        res = taskRes;                        return res;                    }                    _db.CommitTran();                }                return res;            }            #region 检查工字轮任务是否有效            var wareHosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WarehouseCode);            //无论是桁架还是环形库绑盘都要验证条码信息            foreach (var code in from code in reqDto.TaskCode                     let billInvinit = _billInvinitrepository.GetFirst(x => x.HWBarCode == code)                     where billInvinit == null                     select code)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"条码{code}无条码信息";                return res;            }            var isDP = GetIsDirectPalletizing(reqDto.RobotCode);            if (wareHosue.TypeNum == FjLocationType.RingLibrary && !isDP) //环形库需要验证一下库存信息            {                foreach (var code in reqDto.TaskCode)                {                    var billInvnow = _billInvnowrepository.GetSingle(x => x.HWBarCode == code);                    if (billInvnow == null)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"工字轮{code}无库存信息";                        return res;                    }                    if (billInvnow.InvStateCode != FJInvState.InvEcecState_BuildUp.ToString())                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"工字轮{code}库存状态错误";                        return res;                    }                }            }            #endregion 检查工字轮任务是否有效            try            {                _db.BeginTran();                var contGrpId = IdFactory.NewId();                //开始更新条码信息                foreach (var code in reqDto.TaskCode)                {                    //无论桁架码垛还是环形库都能找到条码信息,因上方已经验证过条码信息是否存在,所以不再二次验证                    var billInv = _billInvinitrepository.GetFirst(x => x.HWBarCode == code);                    if (billInv == null)                    {                        _db.RollbackTran();                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = $"{code}未找到条码信息";                        return res;                    }                    var stock = _billInvnowrepository.GetSingle(x => x.HWBarCode == billInv.HWBarCode);                    switch (wareHosue.TypeNum)                    {                        case FjLocationType.RingLibrary:                            if (isDP)                            {                                if (stock != null)                                {                                    _db.RollbackTran();                                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                                    res.ResMsg = $"{code}已有库存信息";                                    return res;                                }                                //将条码表映射到库存表                                stock = _mapper.Map<BillInvnow>(billInv);                                stock.AddTime = DateTime.Now;                                stock.Id = IdFactory.NewId();                                stock.ContGrpId = contGrpId;                                stock.ContGrpType = FJContGrpType.Material;                                stock.ContGrpBarCode = reqDto.PalletCode;                                stock.WarehouseId = wareHosue.Id;                                stock.IsFail = reqDto.IsFail;                                stock.FailReason = reqDto.FailReason;                                stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();                                if (!_billInvnowrepository.Insert(stock))                                {                                    _db.RollbackTran();                                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                                    res.ResMsg = "库存信息存储失败";                                    return res;                                }                            }                            else                             {                                if (stock == null)                                {                                    _db.RollbackTran();                                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                                    res.ResMsg = $"{code}未找到库存信息";                                    return res;                                }                                //更新库存信息                                _billInvnowrepository.UpdateModelColumns(                                    x => new BillInvnow                                    {                                        WarehouseId = wareHosue.Id,                                        ContGrpId = contGrpId,                                        ContGrpType = FJContGrpType.Material,                                        ContGrpBarCode = reqDto.PalletCode,                                        IsFail = reqDto.IsFail,                                        FailReason = reqDto.FailReason                                    },                                    x => x.Id == stock.Id && x.InvStateCode == FJInvState.InvEcecState_BuildUp.ToString());                            }                            break;                        case FjLocationType.Storage:                            if (stock != null)                            {                                _db.RollbackTran();                                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                                res.ResMsg = $"{code}已有库存信息";                                return res;                            }                            //将条码表映射到库存表                            stock = _mapper.Map<BillInvnow>(billInv);                            stock.AddTime = DateTime.Now;                            stock.Id = IdFactory.NewId();                            stock.ContGrpId = contGrpId;                            stock.ContGrpType = FJContGrpType.Material;                            stock.ContGrpBarCode = reqDto.PalletCode;                            stock.WarehouseId = wareHosue.Id;                            stock.IsFail = reqDto.IsFail;                            stock.FailReason = reqDto.FailReason;                            stock.InvStateCode = InvState.InvEcecState_BuildUp.ToString();                            if (!_billInvnowrepository.Insert(stock))                            {                                _db.RollbackTran();                                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                                res.ResMsg = "库存信息存储失败";                                return res;                            }                            break;                        case FjLocationType.Pingku:                            _db.RollbackTran();                            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                            res.ResMsg = "无效仓库类型";                            return res;                        case FjLocationType.Virtual:                            _db.RollbackTran();                            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                            res.ResMsg = "无效仓库类型";                            return res;                        default:                            _db.RollbackTran();                            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                            res.ResMsg = "无效仓库类型";                            return res;                    }                    //增加流水信息                    var depotstocklist = _billInvnowrepository.GetList(p =>                        p.ContGrpBarCode == reqDto.PalletCode &&                        p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                    foreach (var item in depotstocklist)                    {                        item.Id = IdFactory.NewId();                        item.AddTime = DateTime.Now;                        item.Memo = "整托入库组盘";                    }                    _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(depotstocklist));                }                _db.CommitTran();            }            catch (Exception e)            {                _db.RollbackTran();                ;                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.Message;            }            return res;        }        public SRes<int> GetTwoPallet(FJGetTwoPalletDto reqDto)        {            var res = new SRes<int>();            res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();            res.ResMsg = "暂停";            return res;            //检查仓库是否存在            var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WarehouseCode);            if (warehosue == null)            {                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                return res;            }            //通过任务号在历史任务中找到对应货位号            var task = _wcstaskoldrepository.AsQueryable().Where(p => p.Id == reqDto.TaskId)                .SplitTable(tabs => tabs.Take(2)).First();            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return res;            }            if (task.Type != TaskType.EnterDepot)            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = "不是入库任务,无法获取出库货位;任务号" + task.Id;                return res;            }            var cell = _basewarecellrepository.GetSingle(x =>                x.ContGrpBarCode == task.BarCode && x.WarehouseCode == reqDto.WarehouseCode);            if (cell == null || cell.StateNum != FjLocationState.Full)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "当前货物以超时出库" + task.Id;                return res;            }            try            {                _db.BeginTran();                _basewarecellrepository.UpdateModelColumns(x => new BaseWarecell                {                    StateNum = FjLocationState.StockOut,                    EditTime = DateTime.Now,                    EditWho = "WMS"                }, x => x.Id == cell.Id);                //添加出库任务                var resTask = RingCreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                {                    ContGrpBarCode = cell.ContGrpBarCode,                    CellNo = cell.Code,                    EquCode = cell.WarehouseCode switch                    {                        "1N" => "1605",                        "1S" => "1615",                        "2N" => "1625",                        "2S" => "1635",                        "3N" => "1645",                        "3S" => "1655",                        _ => "ERROR"                    },                    Floor = 2,                    Device = cell.WarehouseCode switch                    {                        "1N" => "SRM1",                        "1S" => "SRM2",                        "2N" => "SRM3",                        "2S" => "SRM4",                        "3N" => "SRM5",                        "3S" => "SRM6",                        _ => "ERROR"                    },                    WorkBench = "",                    WarehouseCode = cell.WarehouseCode,                    BusType = FJTaskBusType.二楼二次码垛出库                });                _db.CommitTran();                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                res.ResMsg = "成功";                res.ResData = resTask.ResData.ID;            }            catch (Exception e)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.Message;            }            return res;        }        #endregion 码垛        #region 立库        /// <summary>        ///     一楼空托盘人工入库任务创建        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes OneFloorWorkerBuildEmptyPalletsStock(FJBuildEmptyPalletsStockRequest reqDto)        {            var res = new SRes();            reqDto.PalletCode = Regex.Replace(reqDto.PalletCode.Trim(), @"[\r\n]", "");            ;            //判断时候存在组盘信息            var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == reqDto.PalletCode);            if (stock != null && stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())            {                res.ResCode = ResponseStatusCodeEnum.StockStateFail.GetHashCode();                res.ResMsg = reqDto.PalletCode + ResponseStatusCodeEnum.StockStateFail.GetDescription();                return res;            }            if (stock == null)            {                var req = _mapper.Map<FJBuildEmptyPalletsStockDto>(reqDto);                req.Floor = 1;                req.BusType = FJTaskBusType.OneLayerManualPallets;                req.PalletType = req.PalletCode.StartsWith("TPA") ? FJPalletType.Pallet09 : FJPalletType.PalletNo09;                req.PalletNum = "5";                res = FJEmptyPalletsStockIn(req);            }            //后续补充            return res;        }        /// <summary>        ///     分拣库空托盘入库        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes FJEmptyPalletsStockIn(FJBuildEmptyPalletsStockDto reqDto)        {            var res = new CopperLineResponse();            var BusType = reqDto.BusType;            //验证业务类型            if (reqDto.BusType <= FJTaskBusType.def || reqDto.BusType > FJTaskBusType.OneLayerAutoPallets)            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = "指令类型" + reqDto.BusType + ResponseStatusCodeEnum.ErrParam.GetDescription();                return res;            }            //验证是否有空余货位            res = _mapper.Map<CopperLineResponse>(IsThereAnySpaceVacancy());            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            //检查仓库是否存在            res = _mapper.Map<CopperLineResponse>(CheckWareCode(reqDto.WareCode));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            //验证容器是否存在            res = _mapper.Map<CopperLineResponse>(                CheckContinfo(reqDto.PalletCode, FJContainerType.ContainerType_Pallet));            if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            if (reqDto.PalletCode != "TPA" && reqDto.PalletCode != "TPB")            {                //验证托盘是否有未结束的任务                res = _mapper.Map<CopperLineResponse>(CheckNoFinishTask(reqDto.PalletCode));                if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;                //验证是否存在库存信息                res = _mapper.Map<CopperLineResponse>(CheckInvnow(reqDto.PalletCode));                if (res.ResCode != ResponseStatusCodeEnum.Sucess.GetHashCode()) return res;            }            else            {                reqDto.PalletCode = reqDto.PalletCode + IdFactory.GetInstance().NextId();            }            //保存条码信息 空托盘条码即条码表条码            var barinfo = _billInvinitrepository.GetSingle(p => p.InvBarCode == reqDto.PalletCode);            if (barinfo == null)            {                var warehosue = _basewarehouserepository.GetSingle(p => p.Code == reqDto.WareCode);                var mat = _basematerrepository.GetSingle(p => p.Code == reqDto.PalletCode.Substring(0, 3));                barinfo = new BillInvinit                {                    InvBarCode = reqDto.PalletCode,                    CLBarCode = reqDto.PalletCode,                    WarehouseId = warehosue.Id,                    ContGrpId = IdFactory.NewId(),                    ContGrpBarCode = reqDto.PalletCode,                    ExecStateCode = FJInvLockState.InvState_Normal.ToString(),                    ExecDocsTypeCode = FJDocType.DocType_FJ_EmptyPalletsStockIn.GetHashCode().ToString(),                    ContGrpType = FJContGrpType.EmptyCon,                    InvInOut = FJInvInOutType.In,                    ExecWho = "WCS",                    EditTime = DateTime.Now,                    InvStateCode = FJInvState.InvEcecState_BuildUp.ToString(),                    SuppCode = "",                    Size = 2,                    MatCode = mat.Code,                    MatId = mat.Id,                    MatName = mat.Name,                    AddTime = DateTime.Now,                    PalletType = reqDto.PalletType                };                barinfo = _billInvinitrepository.InsertReturnEntity(barinfo);            }            try            {                _db.BeginTran();                //生成库存信息-分解方法                var createStockRes = CreateStock(new List<BillInvinit> { barinfo }, reqDto.PalletCode);                if (createStockRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = createStockRes.ResCode;                    res.ResMsg = createStockRes.ResMsg;                    return res;                }                //生成流水数据-分解方法                var createInvFlowRes = CreateInvFlow(createStockRes.ResDataList);                if (createInvFlowRes.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = createInvFlowRes.ResCode;                    res.ResMsg = createInvFlowRes.ResMsg;                    return res;                }                var createStockInWcsTaskReqest = new FJCreateStockInWcsTaskRequest                {                    BusType = BusType.GetDescription(),                    ContGrpBarCode = reqDto.PalletCode,                    ContGrpId = createStockRes.ResDataList.First().ContGrpId,                    Qty = reqDto.PalletNum.ObjToDecimal(),                    EquCode = reqDto.StartLoc,                    WarehouseCode = reqDto.WareCode,                    Floor = reqDto.Floor,                    Type = TaskType.EnterDepot                };                //下发wcs任务 - 分解方法                var taskres = CreateStockInWcsTask(createStockInWcsTaskReqest);                if (taskres.ResCode != 200)                {                    _db.RollbackTran();                    res.ResCode = taskres.ResCode;                    res.ResMsg = taskres.ResMsg;                    return res;                }                _db.CommitTran();            }            catch (Exception e)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = e.Message;            }            return res;        }        #endregion 立库        #region 巷道及货位分配        /// <summary>        ///     获取平库可用货位        /// </summary>        /// <param name="reqEntity"></param>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> FindAvailableFlatStorageSlot(FJApplyStockInLocRequest reqEntity)        {            var res = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            //检查任务是否异常            var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqEntity.TaskNum)                .SplitTable(tabs => tabs.Take(2)).First();            ;            if (wcstask == null)            {                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return res;            }            if (wcstask.Type == TaskType.OutDepot)            {                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;                return res;            }                      //验证仓库信息            var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);            if (warehouse == null)            {                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                return res;            }            //验证库存            var stock = _billInvnowrepository.GetFirst(p =>                p.ContGrpBarCode == wcstask.BarCode.Trim() &&                p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());            if (stock == null)            {                if (wcstask.BusType == FJTaskBusType.帘线退料重绕.GetDescription())                {                    var nov = new BillInvnow                    {                        WarehouseId = warehouse.Id,                        ContGrpBarCode = wcstask.BarCode,                        ContGrpId = IdFactory.NewId(),                        BoxBarCode = "",                        InvStateCode = InvState.InvEcecState_BuildUp.ToString(),                        ExecStateCode = InvLockState.InvState_Normal.ToString(),                        MatId = default,                        MatCode = "",                        MatName = "",                        RFIDBarCode = wcstask.BarCode,                        HWBarCode = wcstask.BarCode,                        HWTypeCode = "",                        InvInOut = FJInvInOutType.In,                        Size = 1,                        ContGrpType = FJContGrpType.EmptyPal,                        LengthQty = 0 //存放托盘数量                    };                    _db.BeginTran();                    _billInvnowrepository.Insert(nov);                    _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));                    _db.CommitTran();                }                else                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = "没有库存信息";                    return res;                }            }                      //找到可用货位            var loc1ist = _basewarecellrepository.Context                .Queryable<BaseWarecell>()                .Where(loc1 => loc1.IsStop == 0                               && loc1.StateNum == FjLocationState.Empty                               && loc1.TypeNum == FjLocationType.Pingku                               && loc1.Code == reqEntity.PickUpEquipmentNo                               && loc1.WarehouseId == warehouse.Id                               && loc1.Depth == 1)                //.Where(loc1 => loc1.Tunnel == reqEntity.TunnelNum)                .Select(loc1 => new                {                    loc1.Code,                    loc1.Id,                    loc1.Row,                    loc1.Col,                    loc1.Layer,                    loc1.Tunnel                }).ToList();            if (loc1ist.Any())            {                var resloc = loc1ist.ToList().OrderBy(x => x.Code).First();                res.ResData.TunnelNum = resloc.Tunnel.ToString();                res.ResData.WarehuoseId = warehouse.Id;                res.ResData.CellNo = resloc.Code;                res.ResData.Row = resloc.Row;                res.ResData.Colomn = resloc.Col;                res.ResData.Layer = resloc.Layer;                try                {                    _db.BeginTran();                    var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                        .Where(x => x.Id == wcstask.Id).SplitTable(x => x.Take(2)).First();                    //更新货位                    _basewarecellrepository.UpdateModelColumns(                        p => new BaseWarecell                        {                            StateNum = FjLocationState.StockIn,                            ContGrpBarCode = "",                            ContGrpId = 0,                            EditTime = DateTime.Now                        },                        p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);                    _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                    {                        AddrTo = res.ResData.CellNo                    }, x => x.Id == task.Id);                    _db.CommitTran();                }                catch (Exception ex)                {                    _db.RollbackTran();                    _logger.LogInformation(ex.ToString());                }                return res;            }            res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();            res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();            return res;        }        /// <summary>        ///     分配货位        /// </summary>        /// <param name="request"></param>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> ApplyStockInLoc(FJApplyStockInLocRequest reqEntity)        {            var res = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            res = ApplyStockInLocTemp(reqEntity);            if (string.IsNullOrEmpty(res.ResData.CellNo)) return res;            try            {                _db.BeginTran();                var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                    .Where(x => x.Id == reqEntity.TaskNum).SplitTable(x => x.Take(2)).First();                if (task == null)                {                    res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                    return res;                }                if (task.Type == TaskType.OutDepot)                {                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                    res.ResMsg = "该任务是出库任务,不能分配货位;任务号" + task.Id;                    return res;                }                var stock = _billInvnowrepository.GetFirst(p =>                    p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                //更新货位                _basewarecellrepository.UpdateModelColumns(                    p => new BaseWarecell                    {                        StateNum = FjLocationState.StockIn,                        ContGrpBarCode = "",                        ContGrpId = 0,                        EditTime = DateTime.Now                    },                    p => p.Code == res.ResData.CellNo && res.ResData.WarehuoseId == p.WarehouseId);                _wcstaskoldrepository.UpdateSplitTableModelColumns(x => new WCS_TaskOld                {                    AddrTo = res.ResData.CellNo                }, x => x.Id == task.Id);                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                _logger.LogInformation(ex.ToString());            }            return res;        }        /// <summary>        ///     分配货位        /// </summary>        /// <param name="request"></param>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> ApplyStockInLocTemp(FJApplyStockInLocRequest reqEntity)        {            var result = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            //检查任务是否异常            var wcstask = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                .Where(p => p.Id == reqEntity.TaskNum).SplitTable(tabs => tabs.Take(2)).First();            ;            if (wcstask == null)            {                result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return result;            }            if (wcstask.Type == TaskType.OutDepot)            {                result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                result.ResMsg = "该任务是出库任务,不能分配货位;任务号" + wcstask.Id;                return result;            }            if (!string.IsNullOrEmpty(wcstask.AddrTo) && wcstask.AddrTo != "SRM") //如果目标地址不是堆垛机            {                result.ResData.TunnelNum = wcstask.Tunnel;                result.ResData.CellNo = wcstask.AddrTo;                result.ResData.Row = wcstask.AddrTo.Split('-')[0] != null ? int.Parse(wcstask.AddrTo.Split('-')[0]) : 0;                result.ResData.Colomn =                    wcstask.AddrTo.Split('-')[1] != null ? int.Parse(wcstask.AddrTo.Split('-')[1]) : 0;                result.ResData.Layer =                    wcstask.AddrTo.Split('-')[2] != null ? int.Parse(wcstask.AddrTo.Split('-')[2]) : 0;                return result;            }            if (reqEntity.TunnelNum <= 0)            {                result.ResCode = ResponseStatusCodeEnum.NotTunnelNum.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.NotTunnelNum.GetDescription();                return result;            }            //验证仓库信息            var warehouse = _basewarehouserepository.GetFirst(p => p.Code == wcstask.WarehouseCode);            if (warehouse == null)            {                result.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                return result;            }            //验证库存            var stock = _billInvnowrepository.GetFirst(p =>                p.ContGrpBarCode == wcstask.BarCode.Trim() &&                p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());            if (stock == null)            {                if (wcstask.BusType == FJTaskBusType.芯股用空托盘入库.GetDescription())                {                    var nov = new BillInvnow                    {                        WarehouseId = warehouse.Id,                        ContGrpBarCode = wcstask.BarCode,                        ContGrpId = IdFactory.NewId(),                        BoxBarCode = "",                        InvStateCode = InvState.InvEcecState_BuildUp.ToString(),                        ExecStateCode = InvLockState.InvState_Normal.ToString(),                        MatId = default,                        MatCode = "",                        MatName = "",                        RFIDBarCode = wcstask.BarCode,                        HWBarCode = wcstask.BarCode,                        HWTypeCode = "",                        InvInOut = FJInvInOutType.In,                        Size = 1,                        ContGrpType = FJContGrpType.EmptyPal,                        LengthQty = 1 //存放托盘数量                    };                    _db.BeginTran();                    _billInvnowrepository.Insert(nov);                    _billInvflow.Insert(_mapper.Map<BillInvflow>(nov));                    _db.CommitTran();                }                result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();                return result;            }            if (reqEntity.TunnelNum <= 0)            {                result.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();                result.ResMsg = "没有传巷道值";                return result;            }            return ApplyLoc(new FJApplyLocRequest            {                MaterialId = stock.MatId,                MaterialCode = stock.MatCode,                Size = reqEntity.Height,                TunnelNum = reqEntity.TunnelNum,                WarehuoseId = warehouse.Id,                IsMove = wcstask.Type == TaskType.TransferDepot            });        }        /// <summary>        ///     分配货位        /// </summary>        /// <param name="reqEntity"></param>        /// <returns></returns>        public SRes<FJApplyStockInLocResponse> ApplyLoc(FJApplyLocRequest reqEntity)        {            var result = new SRes<FJApplyStockInLocResponse>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = new FJApplyStockInLocResponse()            };            //预留货位数量            var emptyLoc = _basewarecellrepository.GetList(p => p.IsStop == 0                                                                && p.StateNum == FjLocationState.Empty                                                                && p.TypeNum == FjLocationType.Storage                                                                && p.Tunnel == reqEntity.TunnelNum                                                                && p.WarehouseId == reqEntity.WarehuoseId                                                                && p.Size == reqEntity.Size);            //判断是否移库            if (!reqEntity.IsMove && (emptyLoc == null || emptyLoc.Count < 2))            {                result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();                result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();                return result;            }            //找到可用货位            var loc1ist = _basewarecellrepository.Context                .Queryable<BaseWarecell>()                .Where(loc1 => loc1.IsStop == 0                               && loc1.StateNum == FjLocationState.Empty                               && loc1.TypeNum == FjLocationType.Storage                               && loc1.Tunnel == reqEntity.TunnelNum                               && loc1.WarehouseId == reqEntity.WarehuoseId                               && loc1.Size == reqEntity.Size                               && loc1.Depth == 1)                .Where(loc1 => loc1.Tunnel == reqEntity.TunnelNum)                .Select(loc1 => new                {                    loc1.Code,                    loc1.Id,                    loc1.Row,                    loc1.Col,                    loc1.Layer,                    loc1.Tunnel                }).ToList();            if (loc1ist.Any())            {                var resloc = loc1ist.ToList().OrderBy(p => p.Layer).ThenBy(p => p.Col).ThenBy(p => p.Row).First();                result.ResData.TunnelNum = resloc.Tunnel.ToString();                result.ResData.WarehuoseId = reqEntity.WarehuoseId;                result.ResData.CellNo = resloc.Code;                result.ResData.Row = resloc.Row;                result.ResData.Colomn = resloc.Col;                result.ResData.Layer = resloc.Layer;                return result;            }            result.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();            result.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();            return result;        }        #endregion 巷道及货位分配        #region 二楼申请空托盘组出库        /// <summary>        ///     申请空托盘组出库任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes ApplyEmptyPalletGroupOutStorage(FjApplyEmptyPalletGroupOutStorageRequest reqDto)        {            var res = new SRes();            ////获取所有未被禁用的巷道            //var tunnel = _sysconfigrepository.AsQueryable().Where(p => p.SType == "OutStop" && string.IsNullOrEmpty(p.SContent)).ToList();            //if (!tunnel.Any())            //{            //    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();            //    res.ResMsg = +"没有可用巷道";            //    return res;            //}            //检查对应目标地址是否有出库任务            var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(x => x.Status < TaskStatus.Finish && x.AddrTo == reqDto.AddTo).SplitTable(v => v.Take(2));            if (task.Any())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = $"拆盘机{reqDto.AddTo}已存在未结束任务";                return res;            }            //计算巷道剩余空托盘数量            //TODO:跟据客户要救,暂时屏蔽调关于托盘类型的判断            var locationlist =                from loc in _basewarecellrepository.GetList(p => p.IsStop == 0 && p.StateNum == FjLocationState.Full)                join stock in _billInvnowrepository.GetList(p =>                        p.ContGrpType == FJContGrpType.EmptyCon &&                        p.InvStateCode == InvState.InvEcecState_In.ToString() &&                        p.ExecStateCode ==                        InvLockState.InvState_Normal.ToString() && /*p.PalletType == reqDto.FJPalletType &&*/                        p.ContGrpType == FJContGrpType.EmptyCon)                    on loc.ContGrpBarCode equals stock.ContGrpBarCode                orderby stock.AddTime                select new                {                    stock.MatCode,                    stock.InvBarCode,                    stock.RFIDBarCode,                    stock.IsFast,                    stock.Grade,                    stock.IsSurplus,                    stock.IsRework,                    stock.InvStateCode,                    stock.ProductTime,                    loc.Col,                    loc.Layer,                    loc.Shelf,                    loc.Depth,                    loc.Code,                    loc.Tunnel,                    loc.WarehouseCode,                    loc.ContGrpBarCode,                    loc.Id,                    loc.StateNum                };            locationlist = locationlist.Where(p => p.Tunnel == reqDto.Tunnel);            if (locationlist == null || !locationlist.Any())            {                res.ResCode = ResponseStatusCodeEnum.NotEnoughStock.GetHashCode();                res.ResMsg = reqDto.FJPalletType.GetDescription() +                             ResponseStatusCodeEnum.NotEnoughStock.GetDescription();                return res;            }            locationlist = locationlist.OrderBy(p => p.ProductTime);            //出库任务            var temploc = locationlist.First();            var sotck = _billInvnowrepository.GetFirst(p =>                p.ContGrpBarCode == temploc.ContGrpBarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());            try            {                _db.BeginTran();                //货位表                _basewarecellrepository.UpdateModelColumns(                    p => new BaseWarecell { StateNum = FjLocationState.StockOut }, p => p.Id == temploc.Id);                //库存表                _billInvnowrepository.UpdateModelColumns(                    p => new BillInvnow                        { InvStateCode = InvState.InvEcecState_OutGoing.ToString(), EditTime = DateTime.Now },                    p => p.Id == sotck.Id);                var invflow = _mapper.Map<BillInvflow>(sotck);                invflow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                invflow.AddTime = DateTime.Now;                invflow.Id = IdFactory.NewId();                invflow.Memo = "空托出库";                _billInvflow.Insert(invflow);                //添加出库任务                CreateStockOutWcsTask(new FJCreateStockOutWcsTaskRequest                {                    ContGrpBarCode = temploc.ContGrpBarCode,                    CellNo = temploc.Code,                    EquCode = reqDto.AddTo,                    Floor = 2,                    Qty = sotck.LengthQty,                    Tunnel = temploc.Tunnel.ToString(),                    WarehouseCode = temploc.WarehouseCode,                    BusType = FJTaskBusType.二楼空托盘组出库                });                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                _logger.LogInformation(ex.ToString());                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                return res;            }            return res;        }        /// <summary>        ///     创建WCS出库任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<WCS_TaskInfo> CreateStockOutWcsTask(FJCreateStockOutWcsTaskRequest reqDto)        {            var res = new SRes<WCS_TaskInfo>();            var bus = reqDto.BusType.GetDescription();            var wcstask = new WCS_TaskInfo            {                Type = TaskType.OutDepot,                Status = TaskStatus.NewBuild,                Priority = 0,                Device = "SRM" + reqDto.Tunnel,                AddrFrom = reqDto.CellNo,                AddrTo = reqDto.EquCode,                LastInteractionPoint = "",                BarCode = reqDto.ContGrpBarCode,                Floor = reqDto.Floor,                Length = reqDto.Qty,                AddTime = DateTime.Now,                StartTime = DateTime.Now,                DocID = 0,                PalletType = 1,                ProdLine = 0,                AddWho = "wms",                WarehouseCode = reqDto.WarehouseCode,                Enabled = true,                WorkBench = reqDto.WorkBench,                Tunnel = reqDto.Tunnel,                BusType = bus            };            var wcstaskhis = _mapper.Map<WCS_TaskOld>(wcstask);            try            {                _db.BeginTran();                var task = _taskrepository.InsertReturnEntity(wcstask);                wcstaskhis.Id = task.ID;                _wcstaskoldrepository.InsertableSplitTable(wcstaskhis);                var taskdetail = new WCS_TaskDtl                {                    ID = Guid.NewGuid(),                    CurPoint = reqDto.CellNo,                    AddTime = DateTime.Now,                    AddWho = "wms",                    Enabled = true,                    ParentTaskCode = task.ID,                    Desc = reqDto.EquCode + "分拣空托盘组备料"                };                _taskdetailrepository.InsertableSplitTable(taskdetail);                _db.CommitTran();                res.ResData = task;            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                _logger.LogInformation("保存任务异常:" + ex);                return res;            }            return res;        }        #endregion 二楼申请空托盘组出库        #region 容器、物料、条码、库存检测及创建,创建流水信息        /// <summary>        ///     检查容器是否存在,不存在则创建        /// </summary>        /// <param name="contBarCode">容器条码</param>        /// <param name="fjContainerType">容器类型</param>        /// <returns></returns>        public SRes CheckContinfo(string contBarCode, FJContainerType fjContainerType)        {            var res = new SRes();            var container = _baseContinfo.GetSingle(x => x.ContBarCode == contBarCode);            if (container == null)            {                //创建容器信息                var cont = new BaseContinfo                {                    ContBarCode = contBarCode,                    Name = contBarCode,                    TypeCode = fjContainerType.ToString(),                    PrintQty = 1,                    IsStop = 0,                    WarehouseId = 0,                    AddWho = "WMS",                    AddTime = DateTime.Now                };                //加载新的容器信息                if (!_baseContinfo.Insert(cont))                {                    res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                    res.ResMsg = "托盘初始化失败";                    return res;                }            }            else if (container.IsStop != 0)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "容器已停用";                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            return res;        }        /// <summary>        ///     跟据库存信息创建流水信息        /// </summary>        /// <param name="barlist">库存信息</param>        /// <returns></returns>        public SRes CreateInvFlow(List<BillInvnow> barlist)        {            var res = new SRes();            var listflow = _mapper.Map<List<BillInvflow>>(barlist);            foreach (var item in listflow)            {                item.AddTime = DateTime.Now;                item.Id = IdFactory.NewId();            }            _billInvflow.InsertRange(listflow);            return res;        }        /// <summary>        ///     跟据库存信息创建流水信息        /// </summary>        /// <param name="bar">库存信息</param>        /// <returns></returns>        public SRes CreateInvFlow(BillInvnow bar)        {            var res = new SRes();            var flow = _mapper.Map<BillInvflow>(bar);            flow.AddTime = DateTime.Now;            flow.Id = IdFactory.NewId();            _billInvflow.Insert(flow);            return res;        }        /// <summary>        ///     是否有空余货位        /// </summary>        /// <returns></returns>        public SRes IsThereAnySpaceVacancy()        {            var res = new SRes();            //验证有剩余货位            if (_basewarecellrepository                    .GetList(p => p.IsStop == 0 && p.StateNum == FjLocationState.Empty && p.Size == 2).Count() < 2)            {                res.ResCode = ResponseStatusCodeEnum.NotEnoughLocation.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.NotEnoughLocation.GetDescription();                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            return res;        }        /// <summary>        ///     检查传入的仓库是否存在        /// </summary>        /// <param name="wareCode">仓库编号</param>        /// <returns></returns>        public SRes CheckWareCode(string wareCode)        {            var res = new SRes();            //验证是否有对应仓库            var warehosue = _basewarehouserepository.GetSingle(p => p.Code == wareCode);            if (warehosue == null)            {                res.ResCode = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.WarehouseCodeNotExist.GetDescription();                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            return res;        }        /// <summary>        ///     验证空托盘是否有未结束的任务        /// </summary>        /// <param name="PalletCode"></param>        /// <returns></returns>        public SRes CheckNoFinishTask(string PalletCode)        {            var res = new SRes();            //验证当前托盘是否有未结束的任务            var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.BarCode == PalletCode && p.Status < TaskStatus.Finish).SplitTable(p => p.Take(2)).First();            if (task != null && task.Id > 0)                switch (task.Type)                {                    case TaskType.SetPlate:                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "该号组盘任务还未完成,请先完成组盘任务";                        return res;                    case TaskType.EnterDepot:                        if (task.Status > TaskStatus.WaitingToExecute && task.Status < TaskStatus.Finish)                        {                            res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                            res.ResMsg = PalletCode + "已有进行中任务,请检查托盘条码是否重复";                            return res;                        }                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "任务已创建,请勿重复申请";                        return res;                    case TaskType.OutDepot:                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "该号出库任务还未完成,请先完成出库任务";                        return res;                    case TaskType.TransferDepot:                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "该号移库任务还未完成,请先完成移库任务";                        return res;                    case TaskType.Delivery:                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "该号输送任务还未完成,请先完成输送任务";                        return res;                    case TaskType.EmptyInit:                        res.ResCode = ResponseStatusCodeEnum.WcsTaskExist.GetHashCode();                        res.ResMsg = PalletCode + "该号空轮初始化任务还未完成,请先完成空轮初始化任务";                        return res;                }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            return res;        }        /// <summary>        ///     检查是否存在库存信息        /// </summary>        /// <param name="code">编码</param>        /// <returns></returns>        public SRes CheckInvnow(string code)        {            var res = new SRes();            //验证是否没有库存信息            var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == code);            if (stock != null && stock.InvStateCode == FJInvState.InvEcecState_In.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = code + "该托盘号已在库中,请检查托盘号是否重复";                return res;            }            if (stock != null && stock.InvStateCode == InvState.InvEcecState_OutGoing.ToString())            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = code + "该托盘号存在出库中任务,请检查上一个任务是否已经完成";                return res;            }            //else if (stock != null)            //{            //    res.ResCode = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetHashCode();            //    res.ResMsg = ResponseStatusCodeEnum.GroupStockDetailMaterialBarCodeExist.GetDescription();            //    return res;            //}            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            return res;        }        /// <summary>        ///     创建库存信息        ///     不验证容器是否存在        ///     不验证容器是否有未结束的任务        ///     不验条码信息是否存在        /// </summary>        /// <param name="barList">条码集合</param>        /// <param name="containerBarcode">容器编号</param>        /// <param name="containerType">容器类型</param>        /// <returns></returns>        public SRes<BillInvnow> CreateStock(List<BillInvinit> barList, string containerBarcode)        {            var res = new SRes<BillInvnow>();            if (string.IsNullOrEmpty(containerBarcode))            {                res.ResCode = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.ContainerCodeNotEmpty.GetDescription();                return res;            }            //将条码表映射到库存表            var stocklist = _mapper.Map<List<BillInvnow>>(barList);            foreach (var item in stocklist)            {                item.AddTime = DateTime.Now;                item.Id = IdFactory.NewId();            }            if (!_billInvnowrepository.InsertRange(stocklist))            {                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = "托盘库存信息存储失败";                return res;            }            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            res.ResDataList = stocklist;            return res;        }        /// <summary>        ///     创建WCS任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<WCS_TaskInfo> CreateStockInWcsTask(FJCreateStockInWcsTaskRequest reqDto, string gra = "",            bool isBench = false)        {            var res = new SRes<WCS_TaskInfo>();            var wcsTask = new WCS_TaskInfo            {                Type = reqDto.Type,                Status = TaskStatus.NewBuild,                Priority = 0,                Device = "",                SrmStation = "",                AddrFrom = reqDto.EquCode,                AddrTo = "SRM",                LastInteractionPoint = "",                BarCode = reqDto.ContGrpBarCode,                Floor = reqDto.Floor,                Length = reqDto.Qty,                AddTime = DateTime.Now,                StartTime = DateTime.Now,                DocID = 0,                WorkOrder = reqDto.DocCode,                PalletType = 1,                ProdLine = 0,                AddWho = "WMS",                WarehouseCode = reqDto.WarehouseCode,                Enabled = true,                Height = reqDto.Height,                Grade = gra,                //WorkBench = reqDto.EquCode,                //MaterialCode = reqDto.MaterialCode,                MatCode = reqDto.MatCode,                BusType = reqDto.BusType,                GoodsType = reqDto.GoodsType            };            if (isBench) wcsTask.WorkBench = reqDto.EquCode;            var wcsTaskHis = _mapper.Map<WCS_TaskOld>(wcsTask);            try            {                var task = _taskrepository.InsertReturnEntity(wcsTask);                wcsTaskHis.Id = task.ID;                _wcstaskoldrepository.InsertableSplitTable(wcsTaskHis);                var taskDetail = new WCS_TaskDtl                {                    ID = Guid.NewGuid(),                    CurPoint = reqDto.EquCode,                    AddTime = DateTime.Now,                    AddWho = "WMS",                    Enabled = true,                    ParentTaskCode = task.ID,                    Desc = reqDto.EquCode + "任务生成"                };                _taskdetailrepository.InsertableSplitTable(taskDetail);                res.ResData = task;            }            catch (Exception ex)            {                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                _logger.LogInformation("保存任务异常:" + ex);                return res;            }            return res;        }        #endregion 容器、物料、条码、库存检测及创建,创建流水信息        /// <summary>        ///     手动出库        /// </summary>        /// <param name="request"></param>        /// <returns></returns>        public string ManualTask(FJManualTaskRequest request)        {            var res = new SRes();            //必须要有货位信息            if (!request.Location.Any())            {                res.ResCode = ResponseStatusCodeEnum.ErrParamNotNull.GetHashCode();                res.ResMsg = "货位" + ResponseStatusCodeEnum.ErrParamNotNull.GetDescription();                return res.ToCamelCaseString();            }            try            {                foreach (var item in request.Location)                {                    //货位信息验证                    var location = _basewarecellrepository.GetSingle(p =>                        p.Code == item && p.WarehouseCode == request.WarehouseCode);                    if (location == null)                    {                        res.ResCode = ResponseStatusCodeEnum.WareLocationCodeNotExist.GetHashCode();                        res.ResMsg = item + ResponseStatusCodeEnum.WareLocationCodeNotExist.GetDescription();                        return res.ToCamelCaseString();                    }                    if (location.StateNum != FjLocationState.Full)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = item + ResponseStatusCodeEnum.Fail.GetDescription() + "货位状态不满足出库条件";                        return res.ToCamelCaseString();                    }                    if (location.IsStop == 1)                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + item + "被禁用";                        return res.ToCamelCaseString();                    }                    //库存信息验证                    var stock = _billInvnowrepository.GetFirst(p =>                        p.ContGrpBarCode == location.ContGrpBarCode &&                        p.InvStateCode == InvState.InvEcecState_In.ToString());                    if (stock == null)                    {                        res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();                        res.ResMsg = ResponseStatusCodeEnum.StockNotExist.GetDescription();                        return res.ToCamelCaseString();                    }                    if (stock.InvStateCode != InvState.InvEcecState_In.ToString())                    {                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                        res.ResMsg = item + "组盘状态不是已入库";                        return res.ToCamelCaseString();                    }                    var billTask = new WCS_TaskInfo();                    billTask.Status = TaskStatus.NewBuild;                    billTask.Type = TaskType.OutDepot;                    billTask.Priority = 0;                    billTask.Device = "SRM" + location.Tunnel;                    billTask.AddrFrom = item;                    billTask.AddrTo = request.AddTo;                    billTask.BarCode = stock.ContGrpBarCode;                    billTask.StartTime = DateTime.Now;                    billTask.AddTime = DateTime.Now;                    billTask.EditTime = DateTime.Now;                    billTask.AddWho = "WMS";                    billTask.WarehouseCode = location.WarehouseCode;                    billTask.Enabled = true;                    billTask.Floor = 2;                    billTask.Tunnel = location.Tunnel.ToString();                    billTask.PalletType = 1;                    billTask.Length = stock.LengthQty;                    billTask.MaterialCode = stock.MatCode;                    billTask.OutType = OutTypeEnum.全自动手动出库任务;                    billTask.BusType = FJTaskBusType.TaskBusType_FJ_ManualOut.GetDescription();                    _db.BeginTran();                    _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell                    {                        StateNum = FjLocationState.StockOut,                        EditTime = DateTime.Now                    }, p => p.Code == item && p.WarehouseCode == request.WarehouseCode);                    _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow                    {                        InvStateCode = InvState.InvEcecState_OutGoing.ToString(),                        EditTime = DateTime.Now                    }, p => p.ContGrpBarCode == stock.ContGrpBarCode);                    var flow = _mapper.Map<BillInvflow>(stock);                    flow.Id = IdFactory.NewId();                    flow.InvStateCode = InvState.InvEcecState_OutGoing.ToString();                    flow.EditTime = DateTime.Now;                    _billInvflow.Insert(flow);                    var wcs = _taskrepository.InsertReturnEntity(billTask);                    var wcshistory = _mapper.Map<WCS_TaskOld>(wcs);                    _wcstaskoldrepository.InsertableSplitTable(wcshistory);                    var taskdetail = new WCS_TaskDtl                    {                        ID = Guid.NewGuid(),                        CurPoint = item,                        AddTime = DateTime.Now,                        AddWho = "wms",                        Enabled = true,                        ParentTaskCode = wcs.ID,                        Desc = wcs.OutType.ToString()                    };                    _taskdetailrepository.InsertableSplitTable(taskdetail);                    _db.CommitTran();                }            }            catch (Exception ex)            {                _db.RollbackTran();                _logger.LogInformation("手动出库异常:" + ex.Message);                res.ResCode = ResponseStatusCodeEnum.DataSaveErr.GetHashCode();                res.ResMsg = ResponseStatusCodeEnum.DataSaveErr.GetDescription();                return res.ToCamelCaseString();            }            return res.ToCamelCaseString();        }        /// <summary>        ///     堆垛机出库完成        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<int> SrmPickOutCompleted(SrmPickOutCompletedRequest reqDto)        {            var result = new SRes<int>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = reqDto.TaskNum            };            var wcstask = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(p => p.Id == reqDto.TaskNum)                .SplitTable(tabs => tabs.Take(2)).First();            ;            if (wcstask == null || wcstask.Id <= 0)            {                result.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return result;            }            if (wcstask.Type != TaskType.OutDepot)            {                result.ResCode = ResponseStatusCodeEnum.OnlyStockOutAvil.GetHashCode();                result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.OnlyStockOutAvil.GetDescription();                return result;            }            if (wcstask.Status >= TaskStatus.Finish)            {                result.ResCode = ResponseStatusCodeEnum.StateNotUpdate.GetHashCode();                result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StateNotUpdate.GetDescription();                return result;            }            try            {                var well = _basewarecellrepository.GetSingle(x =>                    x.ContGrpBarCode == wcstask.BarCode && x.Code.Contains(wcstask.AddrFrom) &&                    (x.WarehouseCode == wcstask.WarehouseCode || wcstask.Device == "CR"));                if (well == null)                {                    result.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();                    result.ResMsg = reqDto.TaskNum + "任务已结束";                    return result;                }                var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == well.WarehouseId);                _db.BeginTran();                switch (wareHouse.TypeNum)                {                    case FjLocationType.Storage:                        //更新库存                        _billInvnowrepository.UpdateModelColumns(                            p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },                            p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&                                 p.ContGrpBarCode == wcstask.BarCode);                        break;                    case FjLocationType.Virtual:                        //更新库存                        _billInvnowrepository.UpdateModelColumns(                            p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },                            p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&                                 p.ContGrpBarCode == wcstask.BarCode);                        break;                    case FjLocationType.Pingku:                        _billInvnowrepository.UpdateModelColumns(                            p => new BillInvnow { PutRow = 0, PutCol = 0, PutLayer = 0 },                            p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&                                 p.ContGrpBarCode == wcstask.BarCode);                        break;                    case FjLocationType.RingLibrary:                        //更新库存                        _billInvnowrepository.UpdateModelColumns(                            p => new BillInvnow                            {                                PutRow = 0, PutCol = 0, PutLayer = 0,                                InvStateCode = FJInvState.InvEcecState_BuildUp.ToString()                            },                            p => p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() &&                                 (p.ContGrpBarCode == wcstask.BarCode || p.HWBarCode == wcstask.BarCode));                        break;                }                var stocklist = _billInvnowrepository.GetList(p =>                    (p.ContGrpBarCode == wcstask.BarCode || p.HWBarCode == wcstask.BarCode) &&                    (p.InvStateCode == InvState.InvEcecState_BuildUp.ToString() ||                     p.InvStateCode == InvState.InvEcecState_OutGoing.ToString()));                if (stocklist == null || !stocklist.Any())                {                    result.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();                    result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();                    return result;                }                var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);                foreach (var item in flowlist)                {                    item.Id = IdFactory.NewId();                    item.AddTime = DateTime.Now;                    item.Memo = "设备出库放货完成";                }                //货位                _basewarecellrepository.UpdateModelColumns(                    p => new BaseWarecell                    {                        StateNum = FjLocationState.Empty, ContGrpBarCode = "", ContGrpId = 0, EditTime = DateTime.Now,                        GroupID = 0, XYNO = 0                    },                    p => p.ContGrpBarCode == wcstask.BarCode && p.Code.Contains(wcstask.AddrFrom) &&                         (p.WarehouseCode == wcstask.WarehouseCode || wcstask.Device == "CR"));                _billInvflow.InsertRange(flowlist);                _db.CommitTran();            }            catch (Exception ex)            {                _db.RollbackTran();                _logger.LogInformation(ex.ToString());                result.ResCode = ResponseStatusCodeEnum.InnerServerErr.GetHashCode();                result.ResMsg = wcstask.Id + "设备出库放货完成异常";            }            return result;        }        /// <summary>        ///     完成任务        /// </summary>        /// <param name="reqDto"></param>        /// <returns></returns>        public SRes<int> CompleteTask(CompleteTaskRequest reqDto)        {            var result = new SRes<int>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription(),                ResData = reqDto.TaskNum            };            //检查历史任务表是否有任务            var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First();            var isBackRewind = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.Id == reqDto.TaskNum && p.BusType == FJTaskBusType.帘线退料重绕.GetDescription()).SplitTable(tabs => tabs.Take(2)).Any();            var isRewindIn = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock)                .Where(p => p.Id == reqDto.TaskNum && p.BusType == FJTaskBusType.重绕满托入库.GetDescription()).SplitTable(tabs => tabs.Take(2)).Any();            if (task == null)            {                result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return result;            }            switch (task.Type)            {                case TaskType.SetPlate:                    try                    {                        //检查库存信息是否正确                        var stock = _billInvnowrepository.GetFirst(p =>                            p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode);                        if (stock == null)                        {                            result.ResMsg = task.BarCode + "没有库存信息";                            return result;                        }                        var wareCell = _basewarecellrepository.GetFirst(x =>                            x.ContGrpBarCode == stock.ContGrpBarCode && x.WarehouseId == stock.WarehouseId);                        if (stock.InvStateCode == InvState.InvEcecState_In.ToString() &&                            wareCell.StateNum == FjLocationState.Full) //如果库存状态是入库,货位状态是有货直接返回成功,避免WCS重复调用造成出库异常                            return result;                        if (stock.InvStateCode != InvState.InvEcecState_BuildUp.ToString())                        {                            result.ResMsg = task.BarCode + $"库存状态错误{stock.InvStateCode}";                            return result;                        }                        var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);                        _db.BeginTran();                        var row = int.Parse(task.AddrTo.Split('-')[0]);                        var col = int.Parse(task.AddrTo.Split('-')[1]);                        var layer = int.Parse(task.AddrTo.Split('-')[2]);                        //更新库存                        _billInvnowrepository.UpdateModelColumns(p => new BillInvnow                            {                                WarehouseId = warehouse.Id,                                InvStateCode = InvState.InvEcecState_In.ToString(),                                PutRow = row,                                PutCol = col,                                PutLayer = layer,                                OneInTime = DateTime.Now,                                EditTime = DateTime.Now                            },                            p => p.HWBarCode == task.BarCode &&                                 p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                        //更新货位                        _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                        {                            StateNum = FjLocationState.Full,                            ContGrpBarCode = stock.HWBarCode,                            ContGrpId = stock.ContGrpId,                            EditTime = DateTime.Now                        }, p => p.Code == task.AddrTo && p.WarehouseId == warehouse.Id);                        //增加流水信息                        var enterDepotstocklist = _billInvnowrepository.GetList(p =>                            p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());                        foreach (var item in enterDepotstocklist)                        {                            item.Id = IdFactory.NewId();                            item.AddTime = DateTime.Now;                        }                        _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));                        _db.CommitTran();                    }                    catch (Exception ex)                    {                        _db.RollbackTran();                        result.ResMsg = task.Id + "完成任务异常";                        _logger.LogInformation("完成任务异常" + ex);                    }                    break;                case TaskType.EnterDepot:                    try                    {                        //退料                        if (isBackRewind)                        {                            var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);                            _db.BeginTran();                            if (task.AddrTo == "9001" || task.AddrTo == "9101")                            {                            }                            else if(task.AddrTo.StartsWith("92"))//退料缓存区                            {                                //检查库存信息是否正确                                var stock = _billInvnowrepository.GetFirst(p =>                                    (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)                                    && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                                if (stock == null)                                {                                    result.ResMsg = task.BarCode + "没有已组盘的信息";                                    return result;                                }                                                             //更新库存                                _billInvnowrepository.UpdateModelColumns(p => new BillInvnow                                {                                    InvStateCode = InvState.InvEcecState_In.ToString(),                                    WarehouseId = warehouse.Id,                                    OneInTime = DateTime.Now,                                    EditTime = DateTime.Now                                },                                 p => p.ContGrpBarCode == task.BarCode &&                                 p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                                //更新货位                                _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                                {                                    StateNum = FjLocationState.Full,                                    ContGrpBarCode = stock.ContGrpBarCode,                                    ContGrpId = stock.ContGrpId,                                    EditTime = DateTime.Now                                }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);                            }                            _db.CommitTran();                        }                        //组盘入库                        else if (isRewindIn)                        {                            //检查库存信息是否正确                            var stock = _billInvnowrepository.GetFirst(p =>                                (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)                                && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                            if (stock == null)                            {                                result.ResMsg = task.BarCode + "没有已组盘的信息";                                return result;                            }                            var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);                            _db.BeginTran();                                                             //更新库存                                _billInvnowrepository.UpdateModelColumns(p => new BillInvnow                                {                                    InvStateCode = InvState.InvEcecState_In.ToString(),                                    WarehouseId = warehouse.Id,                                                                        OneInTime = DateTime.Now,                                    EditTime = DateTime.Now                                },                                 p => p.ContGrpBarCode == task.BarCode &&                                 p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                                                        //更新货位                            _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                            {                                StateNum = FjLocationState.Full,                                ContGrpBarCode = stock.ContGrpBarCode,                                ContGrpId = stock.ContGrpId,                                EditTime = DateTime.Now                            }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);                            //增加流水信息                            var enterDepotstocklist = _billInvnowrepository.GetList(p =>                                p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());                            foreach (var item in enterDepotstocklist)                            {                                item.Id = IdFactory.NewId();                                item.AddTime = DateTime.Now;                            }                            _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));                            //添加反馈信息                            var pushtype = fjFackbeekType.InterfaceType_FJ_StockIn.ToString();                            var list = new List<BillPushinfo>();                            foreach (var item in enterDepotstocklist)                                list.Add(new BillPushinfo                                {                                    DocsNo = stock.ExecDocsNo,                                    TypeCode = pushtype,                                    RFIDBarCode = stock.ContGrpBarCode,                                    HWBarCode = item.HWBarCode,                                    CLBarCode = item.CLBarCode,                                    WarehouseId = warehouse.Id,                                    WarehouseCode = warehouse.Code,                                    WareCellId = 0,                                    WareCellCode = task.AddrTo,                                    MatId = item.MatId,                                    MatCode = item.MatCode,                                    MatName = item.MatName,                                    TolWQty = item.TolWQty,                                    NetWQty = item.NetWQty,                                    TareWQty = item.TareWQty,                                    ReqNo = Guid.NewGuid().ToString()                                });                            if (stock.ContGrpType == FJContGrpType.Material) _billPushinforepository.InsertRange(list);                            _db.CommitTran();                        }                        else                        {                            //检查库存信息是否正确                            var stock = _billInvnowrepository.GetFirst(p =>                                (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode)                                && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                            if (stock == null)                            {                                result.ResMsg = task.BarCode + "没有已组盘的信息";                                return result;                            }                            var warehouse = _basewarehouserepository.GetSingle(p => p.Code == task.WarehouseCode);                            _db.BeginTran();                            var row = int.Parse(task.AddrTo.Split('-')[0]);                            var col = int.Parse(task.AddrTo.Split('-')[1]);                            var layer = int.Parse(task.AddrTo.Split('-')[2]);                            //更新库存                            _billInvnowrepository.UpdateModelColumns(p => new BillInvnow                            {                                InvStateCode = InvState.InvEcecState_In.ToString(),                                WarehouseId = warehouse.Id,                                PutRow = row,                                PutCol = col,                                PutLayer = layer,                                OneInTime = DateTime.Now,                                EditTime = DateTime.Now                            },                                p => p.ContGrpBarCode == task.BarCode &&                                     p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                            //更新货位                            _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                            {                                StateNum = FjLocationState.Full,                                ContGrpBarCode = stock.ContGrpBarCode,                                ContGrpId = stock.ContGrpId,                                EditTime = DateTime.Now                            }, p => p.Code.Contains(task.AddrTo) && p.WarehouseId == warehouse.Id);                            //增加流水信息                            var enterDepotstocklist = _billInvnowrepository.GetList(p =>                                p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_In.ToString());                            foreach (var item in enterDepotstocklist)                            {                                item.Id = IdFactory.NewId();                                item.AddTime = DateTime.Now;                            }                            _billInvflow.InsertRange(_mapper.Map<List<BillInvflow>>(enterDepotstocklist));                            //添加反馈信息                            var pushtype = fjFackbeekType.InterfaceType_FJ_StockIn.ToString();                            var list = new List<BillPushinfo>();                            foreach (var item in enterDepotstocklist)                                list.Add(new BillPushinfo                                {                                    DocsNo = stock.ExecDocsNo,                                    TypeCode = pushtype,                                    RFIDBarCode = stock.ContGrpBarCode,                                    HWBarCode = item.HWBarCode,                                    CLBarCode = item.CLBarCode,                                    WarehouseId = warehouse.Id,                                    WarehouseCode = warehouse.Code,                                    WareCellId = 0,                                    WareCellCode = task.AddrTo,                                    MatId = item.MatId,                                    MatCode = item.MatCode,                                    MatName = item.MatName,                                    TolWQty = item.TolWQty,                                    NetWQty = item.NetWQty,                                    TareWQty = item.TareWQty,                                    ReqNo = Guid.NewGuid().ToString()                                });                            if (stock.ContGrpType == FJContGrpType.Material) _billPushinforepository.InsertRange(list);                            _db.CommitTran();                        }                                           }                    catch (Exception ex)                    {                        _db.RollbackTran();                        result.ResMsg = task.Id + "完成任务异常";                        _logger.LogInformation("完成任务异常" + ex);                    }                    break;                case TaskType.OutDepot:                    //验证库存信息                    var stocklist = _billInvnowrepository.GetList(p =>                        (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&                        (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||                         p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));                    if (stocklist == null || !stocklist.Any())                        result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();                    var flowlist = _mapper.Map<List<BillInvflow>>(stocklist);                    foreach (var item in flowlist)                    {                        item.Id = IdFactory.NewId();                        item.InvStateCode = InvState.InvEcecState_Out.ToString();                        item.AddTime = DateTime.Now;                        item.Memo = "任务完成";                    }                    try                    {                        _db.BeginTran();                        //删除库存及条码信息                        var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);                        switch (wareHouse.TypeNum)                        {                            case FjLocationType.Storage: //立库出库需要删除库存信息                                _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));                                var hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    hWBarCode.Contains(p.HWBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                var contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    contGrpBarCode.Contains(p.ContGrpBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                _billSpoolTransrepository.Delete(p =>                                    stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));                                _logger.LogInformation(                                    $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");                                //更新货位信息                                _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                                    {                                        StateNum = FjLocationState.Empty,                                        ContGrpBarCode = "",                                        ContGrpId = 0,                                        EditTime = DateTime.Now                                    },                                    p => p.StateNum == FjLocationState.StockOut && p.ContGrpBarCode == task.BarCode &&                                         p.Code.Contains(task.AddrFrom) && p.WarehouseCode == task.WarehouseCode);                                //更新流水信息                                _billInvflow.InsertRange(flowlist);                                //添加反馈信息                                var pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();                                var list = new List<BillPushinfo>();                                foreach (var item in stocklist)                                    list.Add(new BillPushinfo                                    {                                        DocsNo = item.ExecDocsNo,                                        TypeCode = pushtype,                                        RFIDBarCode = item.ContGrpBarCode,                                        HWBarCode = item.HWBarCode,                                        CLBarCode = item.CLBarCode,                                        WarehouseId = wareHouse.Id,                                        WarehouseCode = wareHouse.Code,                                        WareCellId = 0,                                        WareCellCode = task.AddrTo,                                        MatId = item.MatId,                                        MatCode = item.MatCode,                                        MatName = item.MatName,                                        TolWQty = item.TolWQty,                                        NetWQty = item.NetWQty,                                        TareWQty = item.TareWQty,                                        ReqNo = Guid.NewGuid().ToString()                                    });                                if (stocklist.First().ContGrpType == FJContGrpType.Material)                                    _billPushinforepository.InsertRange(list);                                _db.CommitTran();                                break;                            case FjLocationType.RingLibrary: //环形库的库存信息变更是在SrmPickOutCompleted                                break;                            case FjLocationType.Pingku:                                _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));                                hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    hWBarCode.Contains(p.HWBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    contGrpBarCode.Contains(p.ContGrpBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                _billSpoolTransrepository.Delete(p =>                                    stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));                                _logger.LogInformation(                                    $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");                                //更新货位信息                                _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                                    {                                        StateNum = FjLocationState.Empty,                                        ContGrpBarCode = "",                                        ContGrpId = 0,                                        EditTime = DateTime.Now                                    },                                    p => p.StateNum == FjLocationState.StockOut && p.ContGrpBarCode == task.BarCode &&                                         p.Code.Contains(task.AddrFrom) && (p.WarehouseCode == task.WarehouseCode || task.Device == "CR"));                                //更新流水信息                                _billInvflow.InsertRange(flowlist);                                //添加反馈信息                                pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();                                list = new List<BillPushinfo>();                                foreach (var item in stocklist)                                    list.Add(new BillPushinfo                                    {                                        DocsNo = item.ExecDocsNo,                                        TypeCode = pushtype,                                        RFIDBarCode = item.ContGrpBarCode,                                        HWBarCode = item.HWBarCode,                                        CLBarCode = item.CLBarCode,                                        WarehouseId = wareHouse.Id,                                        WarehouseCode = wareHouse.Code,                                        WareCellId = 0,                                        WareCellCode = task.AddrTo,                                        MatId = item.MatId,                                        MatCode = item.MatCode,                                        MatName = item.MatName,                                        TolWQty = item.TolWQty,                                        NetWQty = item.NetWQty,                                        TareWQty = item.TareWQty,                                        ReqNo = Guid.NewGuid().ToString()                                    });                                if (stocklist.First().ContGrpType == FJContGrpType.Material)                                    _billPushinforepository.InsertRange(list);                                _db.CommitTran();                                break;                            case FjLocationType.Virtual:                                _billInvnowrepository.Delete(p => stocklist.Select(p => p.Id).ToList().Contains(p.Id));                                hWBarCode = stocklist.Select(p => p.HWBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    hWBarCode.Contains(p.HWBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();                                _billInvinitrepository.Delete(p =>                                    contGrpBarCode.Contains(p.ContGrpBarCode) &&                                    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                                _billSpoolTransrepository.Delete(p =>                                    stocklist.Select(p => p.HWBarCode).ToList().Contains(p.ConBarCode));                                _logger.LogInformation(                                    $"删除缓存信息{JsonConvert.SerializeObject(stocklist.Select(x => x.HWBarCode).ToList())}");                                if (task.BusType == FJTaskBusType.车间叫料.ToString() && task.AddrFrom.Contains("NSTJ"))                                    //更新货位信息                                    _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                                        {                                            StateNum = FjLocationState.Empty,                                            ContGrpBarCode = "",                                            ContGrpId = 0,                                            EditTime = DateTime.Now                                        },                                        p => p.StateNum == FjLocationState.StockOut &&                                             p.ContGrpBarCode == task.BarCode &&                                             p.Code.Contains(task.AddrFrom) && p.WarehouseCode == "FJXG");                                else                                    //更新货位信息                                    _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                                        {                                            StateNum = FjLocationState.Empty,                                            ContGrpBarCode = "",                                            ContGrpId = 0,                                            EditTime = DateTime.Now                                        },                                        p => p.StateNum == FjLocationState.StockOut &&                                             p.ContGrpBarCode == task.BarCode &&                                             p.Code.Contains(task.AddrFrom) && p.WarehouseCode == task.WarehouseCode);                                //更新流水信息                                _billInvflow.InsertRange(flowlist);                                //添加反馈信息                                pushtype = fjFackbeekType.InterfaceType_FJ_StockOut.ToString();                                list = new List<BillPushinfo>();                                foreach (var item in stocklist)                                    list.Add(new BillPushinfo                                    {                                        DocsNo = item.ExecDocsNo,                                        TypeCode = pushtype,                                        RFIDBarCode = item.ContGrpBarCode,                                        HWBarCode = item.HWBarCode,                                        CLBarCode = item.CLBarCode,                                        WarehouseId = wareHouse.Id,                                        WarehouseCode = wareHouse.Code,                                        WareCellId = 0,                                        WareCellCode = task.AddrTo,                                        MatId = item.MatId,                                        MatCode = item.MatCode,                                        MatName = item.MatName,                                        TolWQty = item.TolWQty,                                        NetWQty = item.NetWQty,                                        TareWQty = item.TareWQty,                                        ReqNo = Guid.NewGuid().ToString()                                    });                                if (stocklist.First().ContGrpType == FJContGrpType.Material)                                    _billPushinforepository.InsertRange(list);                                _db.CommitTran();                                break;                            default:                                throw new ArgumentOutOfRangeException();                        }                    }                    catch (Exception ex)                    {                        _db.RollbackTran();                        _logger.LogInformation(ex.ToString());                        result.ResMsg = task.Id + "完成任务异常";                    }                    break;                case TaskType.TransferDepot:                    var fromcell = _basewarecellrepository.GetFirst(p =>                        p.Code == task.AddrFrom && task.WarehouseCode == p.WarehouseCode);                    var grcontid = fromcell.ContGrpId;                    var grcontcode = fromcell.ContGrpBarCode;                    var fromcellno = fromcell.Code;                    var tocellno = task.AddrTo;                    try                    {                        _db.BeginTran();                        //更新货位信息                        //起始货位                        _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                        {                            StateNum = FjLocationState.Empty,                            ContGrpBarCode = "",                            ContGrpId = 0,                            EditTime = DateTime.Now                        }, p => p.Code.Contains(fromcellno) && p.WarehouseCode == task.WarehouseCode);                        //目标货位                        _basewarecellrepository.UpdateModelColumns(p => new BaseWarecell                        {                            StateNum = FjLocationState.Full,                            ContGrpBarCode = grcontcode,                            ContGrpId = grcontid,                            EditTime = DateTime.Now                        }, p => p.Code.Contains(tocellno));                        //更新库存信息                        var row = int.Parse(tocellno.Split('-')[0]);                        var col = int.Parse(tocellno.Split('-')[1]);                        var layer = int.Parse(tocellno.Split('-')[2]);                        _billInvnowrepository.UpdateModelColumns(p => new BillInvnow                        {                            PutRow = row,                            PutCol = col,                            PutLayer = layer                        }, p => p.ContGrpId == grcontid && p.InvStateCode == InvState.InvEcecState_In.ToString());                        //更新流水信息                        var stock = _billInvnowrepository.GetFirst(p =>                            p.ContGrpId == grcontid && p.ContGrpBarCode == grcontcode &&                            p.InvStateCode == InvState.InvEcecState_In.ToString());                        var flow = _mapper.Map<BillInvflow>(stock);                        flow.Id = IdFactory.NewId();                        flow.AddTime = DateTime.Now;                        flow.Memo = grcontcode + "移库(" + fromcellno + "至" + tocellno + ")";                        _billInvflow.Insert(flow);                        _db.CommitTran();                    }                    catch (Exception ex)                    {                        _db.RollbackTran();                        result.ResMsg = task.Id + "完成任务异常";                        _logger.LogInformation("完成任务异常" + ex);                    }                    break;                case TaskType.Delivery:                    break;                case TaskType.EmptyInit:                    break;                default:                    result.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.Fail.GetDescription();                    return result;            }            return result;        }        public SRes<int> CancelTask(CompleteTaskRequest reqDto)        {            var res = new SRes<int>            {                ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode(),                ResMsg = ResponseStatusCodeEnum.Sucess.GetDescription()            };            var task = _wcstaskoldrepository.AsQueryable().With("WITH(READPAST,ROWLOCK)")                .Where(p => p.Id == reqDto.TaskNum).SplitTable(tabs => tabs.Take(2)).First();            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.WcsTaskNotExist.GetHashCode();                res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.WcsTaskNotExist.GetDescription();                return res;            }            try            {                if (task.Type == TaskType.EnterDepot)                {                    //验证组盘状态                    if (task.BusType == FJTaskBusType.重绕满托入库.GetDescription())                    {                        //验证库存状态                        var stocklist = _billInvnowrepository.GetList(p =>                        (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&                        (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||                         p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));                        if (stocklist == null || !stocklist.Any())                        {                            res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();                            return res;                        }                        var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);                        if (wareHouse.TypeNum == FjLocationType.Pingku)                        {                            _db.BeginTran();                                                                                 _billInvnowrepository.Delete(p => p.ContGrpBarCode == task.BarCode && p.InvStateCode == InvState.InvEcecState_BuildUp.ToString());                                                       //_billInvinitrepository.Delete(p =>                            //    hWBarCode.Contains(p.HWBarCode) &&                            //    p.InvStateCode == InvState.InvEcecState_OutGoing.ToString());                            //contGrpBarCode = stocklist.Select(p => p.ContGrpBarCode).ToList();                                                      _db.CommitTran();                                                   }                    }                }                else if (task.Type == TaskType.OutDepot && (task.BusType == FJTaskBusType.车间叫料.GetDescription() || task.BusType == FJTaskBusType.芯股站台送空托.GetDescription()))                {                    //验证库存信息                    var stocklist = _billInvnowrepository.GetList(p =>                        (p.ContGrpBarCode == task.BarCode || p.HWBarCode == task.BarCode) &&                        (p.InvStateCode == InvState.InvEcecState_OutGoing.ToString() ||                         p.InvStateCode == InvState.InvEcecState_BuildUp.ToString()));                    if (stocklist == null || !stocklist.Any())                    {                        res.ResMsg = reqDto.TaskNum + ResponseStatusCodeEnum.StockNotExist.GetDescription();                        return res;                    }                    var wareHouse = _basewarehouserepository.GetSingle(x => x.Id == stocklist.First().WarehouseId);                    switch (wareHouse.TypeNum)                    {                        case FjLocationType.Storage:                            //验证                            //var stock = _billInvnowrepository.GetSingle(p => p.ContGrpBarCode == task.BarCode);                            //if (stock == null)                            //{                            //    res.ResCode = ResponseStatusCodeEnum.StockNotExist.GetHashCode();                            //    res.ResMsg = "库存信息不存在";//ResponseStatusCodeEnum.StockNotExist.GetDescription();                            //    return res;                            //}                            var cell = _basewarecellrepository.GetSingle(p =>                                p.ContGrpBarCode == task.BarCode && p.WarehouseCode == task.WarehouseCode);                            if (cell == null)                            {                                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                                res.ResMsg = task.BarCode + ResponseStatusCodeEnum.Fail.GetDescription() +                                             "堆垛机已放货完成,不允许取消";                                return res;                            }                            _db.BeginTran();                            _basewarecellrepository.UpdateSetColumnsTrue(p => new BaseWarecell                                {                                    StateNum = FjLocationState.Full,                                    EditTime = DateTime.Now                                },                                p => p.ContGrpBarCode == task.BarCode && p.WarehouseCode == task.WarehouseCode &&                                     p.Code.Contains(task.AddrFrom) && p.StateNum == FjLocationState.StockOut);                            _billInvnowrepository.UpdateSetColumnsTrue(p => new BillInvnow                            {                                InvStateCode = InvState.InvEcecState_In.ToString(),                                EditTime = DateTime.Now                            }, p => p.ContGrpBarCode == task.BarCode && p.WarehouseId == cell.WarehouseId);                            _db.CommitTran();                            break;                        case FjLocationType.RingLibrary: //环形库的库存信息变更是在SrmPickOutCompleted                            break;                        case FjLocationType.Pingku:                            break;                        default:                            throw new ArgumentOutOfRangeException();                    }                }                else                {                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                    res.ResMsg = ResponseStatusCodeEnum.Fail.GetDescription() + "该任务类型不允许取消";                    return res;                }            }            catch (Exception ex)            {                _db.RollbackTran();                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = task.Id + ResponseStatusCodeEnum.Fail.GetDescription();                _logger.LogInformation("任务取消失败,任务号:" + task.Id + ex.Message);                return res;            }            return res;        }        /// <summary>        ///     查询任务  通过条码查询任务        /// </summary>        /// <param name="barCode">条码</param>        /// <returns></returns>        public SRes<WCS_TaskOld> GetTaskInfo(FJGetTaskInfoRequest dto)        {            var res = new SRes<WCS_TaskOld>();            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();            var task = _wcstaskoldrepository.AsQueryable().With(SqlWith.NoLock).Where(x => x.BarCode == dto.BarCode)                .SplitTable(x => x.Take(2)).OrderByDescending(x => x.AddTime).First();            if (task == null)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = "当前条码不存在任务";                return res;            }            res.ResData = task;            return res;        }        /// <summary>        ///     计算最佳码垛位置        /// </summary>        /// <param name="cellInfos"></param>        /// <returns></returns>        public string FindBestStackingPosition(List<CellInfo> cellInfos)        {            //0表示1-9列任务居多,1表示10-17列任务居多            var colType = cellInfos.GroupBy(p => p.Col).OrderByDescending(p => p.Count()).First().Key > 9 ? 1 : 0;            //在cellInfos中获取一个仓库号            var warehouseCode = cellInfos.First().WarehouseCode;            return warehouseCode switch            {                "1NR" => colType == 0 ? "1666" : "1661",                "1SR" => colType == 0 ? "1681" : "1676",                "2NR" => colType == 0 ? "1696" : "1691",                "2SR" => colType == 0 ? "1711" : "1706",                "3NR" => colType == 0 ? "1726" : "1721",                "3SR" => colType == 0 ? "1741" : "1736",                _ => ""            };            //var res = new Tuple<string, string>("","");            //switch (warehouseCode)            //{            //    case "1NR":            //        res = colType==0 ? new Tuple<string, string>("1666", "1661") : new Tuple<string, string>("1661", "1666");            //        break;            //    case "1SR":            //        res = colType == 0 ? new Tuple<string, string>("1681", "1679") : new Tuple<string, string>("1679", "1681");            //        break;            //    case "2NR":            //        res = colType == 0 ? new Tuple<string, string>("1696", "1691") : new Tuple<string, string>("1691", "1696");            //        break;            //    case "2SR":            //        res = colType == 0 ? new Tuple<string, string>("1711", "1706") : new Tuple<string, string>("1706", "1711");            //        break;            //    case "3NR":            //        res = colType == 0 ? new Tuple<string, string>("1726", "1721") : new Tuple<string, string>("1721", "1726");            //        break;            //    case "3SR":            //        res = colType == 0 ? new Tuple<string, string>("1741", "1736") : new Tuple<string, string>("1736", "1741");            //        break;            //}            //return res;        }        /// <summary>        ///  获取当前设备是否直接码垛        /// </summary>        /// <param name="devCode"></param>        /// <param name="db"></param>        /// <returns></returns>        public bool GetIsDirectPalletizing(string devCode)        {            var code = $"{devCode}DirectPalletizing";            var isDP = _sysconfigrepository.AsQueryable().With(SqlWith.NoLock).Single(x => x.Code == code);            if (isDP == null)            {                return false;            }            var isDirectPalletizing = Convert.ToInt32(isDP.SContent);            if (isDirectPalletizing == 0 || isDirectPalletizing != 1)            {                return false;            }            return true;        }        #region MyRegion        /// <summary>        ///  库存流水信息数据归档        /// </summary>        /// <returns></returns>        public SRes InvFlowMoveToHistory()         {            var res = new SRes() { ResCode= ResponseStatusCodeEnum.Sucess.GetHashCode(),ResMsg= ResponseStatusCodeEnum.Sucess.GetDescription() };            //流水表            try            {                //获取当月第一天                var time = DateTime.Now.AddDays(-(DateTime.Now.Day - 1)).Date;                var flow = _billInvflow.AsQueryable().With(SqlWith.NoLock).Where(p => p.AddTime < time).OrderBy(p => p.Id).Take(1000).ToList();                if (flow.Any())                {                    var ids = flow.Select(p => p.Id).Distinct().ToList();                    var flowhty = _mapper.Map<List<Bill_InvflowHistory>>(flow);                    if (_invFlowHistoryRepository.AsQueryable().With(SqlWith.NoLock).SplitTable(p => p.Take(2)).Where(p => ids.Contains(p.Id)).Any())                    {                        _invFlowHistoryRepository.Context.Deleteable<Bill_InvflowHistory>(p => ids.Contains(p.Id)).SplitTable(x => x.Take(2)).ExecuteCommand();                    }                    _invFlowHistoryRepository.InsertableSplitTable(flowhty);                    _billInvflow.Delete(p => ids.Contains(p.Id));                }                //删除异常信息中半个月前的所有信息                _baseErrorInfoRepository.Delete(p => p.AddTime < DateTime.Now.AddDays(-15));            }            catch (Exception ex)            {                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();                res.ResMsg = ex.Message;                return res;            }            return res;        }        #endregion    }    public static class TaslEx    {        public static void UpdataErrorinfo(this BaseErrorInfo error, RepositoryTask<BaseErrorInfo> db)        {            var errorinfoWcs = db.AsQueryable().With(SqlWith.NoLock)                .Where(v => v.BusName == error.BusName && v.Message == error.Message).First();            if (errorinfoWcs != null)            {                errorinfoWcs.Count += 1;                db.Context.Updateable(errorinfoWcs).ExecuteCommand();            }            else            {                db.Context.Insertable(error).ExecuteCommand();            }        }    }    /// <summary>    ///     主线分流    /// </summary>    public class MainlineDiversion    {        /// <summary>        ///     任务号        /// </summary>        public int TaskId { get; set; }        /// <summary>        ///     仓库号        /// </summary>        public string WarehouseCode { get; set; }    }    /// <summary>    ///     申请空托盘组出库请求体    /// </summary>    public class FjApplyEmptyPalletGroupOutStorageRequest : BaseRequest    {        /// <summary>        ///     托盘类型        /// </summary>        public FJPalletType FJPalletType { get; set; }        /// <summary>        ///     巷道        /// </summary>        public int Tunnel { get; set; }        /// <summary>        ///     目标位置        /// </summary>        public string AddTo { get; set; }    }    /// <summary>    ///     创建WCS出库任务    /// </summary>    public class FJCreateStockOutWcsTaskRequest    {        /// <summary>        ///     容器条码        /// </summary>        public string ContGrpBarCode { get; set; }        /// <summary>        ///     主盘主表ID        /// </summary>        public long ContGrpId { get; set; }        /// <summary>        ///     仓库编码        /// </summary>        public string WarehouseCode { get; set; }        public decimal Qty { get; set; }        /// <summary>        ///     设备编号        /// </summary>        public string EquCode { get; set; }        /// <summary>        ///     业务类型        /// </summary>        public FJTaskBusType BusType { get; set; }        public int Floor { get; set; }        public string Tunnel { get; set; }        public string CellNo { get; set; }        public short ProdLine { get; set; }        public string WorkBench { get; set; }        public int GoodsType { get; set; }        public string Device { get; set; }        /// <summary>        ///     物料号        /// </summary>        public string MatCode { get; set; }        /// <summary>        ///     码垛托盘类型        /// </summary>        public short PalletType { get; set; }        /// <summary>        ///     满盘数量        /// </summary>        public short FullQty { get; set; }        public string LastInteractionPoint { get; set; }        /// <summary>        ///     MES任务号        /// </summary>        [SugarColumn(ColumnDescription = "MES任务号")]        public string MesNo { get; set; }        /// <summary>        ///     空盘库        /// </summary>        [SugarColumn(ColumnDescription = "空盘库")]        public string EmptyInventory { get; set; }    }    public class FJBingPalletDto : BaseRequest    {        /// <summary>        ///     仓库号        /// </summary>        public string WarehouseCode { get; set; }        /// <summary>        ///     托盘条码        /// </summary>        public string PalletCode { get; set; }        /// <summary>        ///     工字轮任务号集合        /// </summary>        public List<string> TaskCode { get; set; }        /// <summary>        ///     业务类型        /// </summary>        public FJTaskBusType BusType { get; set; }        /// <summary>        ///     任务申请设备        /// </summary>        public string loc { get; set; }        /// <summary>        ///     是否异常        /// </summary>        public bool IsFail { get; set; }        /// <summary>        ///     异常原因        /// </summary>        public string FailReason { get; set; }        /// <summary>        ///     是否结束        /// </summary>        public bool IsFinish { get; set; }        /// <summary>        ///     是否为半跺入库        /// </summary>        public bool IsItHalf { get; set; }        /// <summary>        ///  机械臂设备号,用于判断是否启用直接入库        /// </summary>        public string? RobotCode { get; set; }=null;    }    public class FJGetTwoPalletDto : BaseRequest    {        /// <summary>        ///     仓库号        /// </summary>        public string WarehouseCode { get; set; }        /// <summary>        ///     仓库号        /// </summary>        public int TaskId { get; set; }    }    public class CellInfo    {        /// <summary>        ///     货位ID        /// </summary>        public long Id { get; set; }        /// <summary>        ///     组盘条码        /// </summary>        public string ContGrpBarCode { get; set; }        /// <summary>        ///     仓库ID        /// </summary>        public long WarehouseId { get; set; }        /// <summary>        ///     仓库号        /// </summary>        public string WarehouseCode { get; set; }        /// <summary>        ///     货位号        /// </summary>        public string Code { get; set; }        /// <summary>        ///     行        /// </summary>        public int Row { get; set; }        /// <summary>        ///     列        /// </summary>        public int Col { get; set; }        /// <summary>        ///     层        /// </summary>        public int Layer { get; set; }        /// <summary>        ///     深        /// </summary>        public int Depth { get; set; }        /// <summary>        ///     物料号        /// </summary>        public string MatCode { get; set; }        /// <summary>        ///     正反面        /// </summary>        public int SideNum { get; set; }        public string CLBarCode { get; set; }        /// <summary>        ///     码垛位置        /// </summary>        public int XYNo { get; set; }        /// <summary>        ///     编辑时间        /// </summary>        public DateTime EditTime { get; set; }        /// <summary>        ///     Bom单号 关联投料单 帘线工序工单号 BillCode        /// </summary>        public string BomDocsNo { get; set; }    }    public class FjGetSetGrpListRequest    {        /// <summary>        ///     帘线产出物料编码        /// </summary>        public string OutMaterialCode { get; set; }        /// <summary>        ///     投入物料        /// </summary>        public List<string> ListmatInfo { get; set; }    }}#endregion 同WCS交互部分
 |