warhouse_service.go 257KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360
  1. package service
  2. import (
  3. "XT_New/models"
  4. "XT_New/utils"
  5. "errors"
  6. "fmt"
  7. _ "fmt"
  8. "github.com/jinzhu/gorm"
  9. "math"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // 药品出库
  15. func DrugsDelivery(orgID int64, creater int64, advice *models.DoctorAdvice) (err error) {
  16. // 1.判断药品是否来自专用字典的药品库
  17. // 2.判断当天当前机构有没有创建出库单,没有则创建
  18. // 3.创建出库流程
  19. // 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
  20. isHasWay := false
  21. record_time := int64(0)
  22. if advice.Way == 1 {
  23. isHasWay = true
  24. record_time = advice.RecordDate
  25. }
  26. if isHasWay {
  27. //判断当天当前机构有没有创建出库单,没有则创建
  28. out, err := FindDrugStockOutByIsSys(orgID, 1, record_time)
  29. if err == gorm.ErrRecordNotFound {
  30. timeStr := time.Now().Format("2006-01-02")
  31. timeArr := strings.Split(timeStr, "-")
  32. total, _ := FindAllDrugWarehouseOut(orgID)
  33. total = total + 1
  34. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  35. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  36. number = number + total
  37. warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
  38. storeConfig, _ := GetAllStoreHouseConfig(orgID)
  39. warehouseOut := models.DrugWarehouseOut{
  40. WarehouseOutOrderNumber: warehousing_out_order,
  41. OperationTime: time.Now().Unix(),
  42. OrgId: orgID,
  43. Creater: creater,
  44. Ctime: time.Now().Unix(),
  45. Status: 1,
  46. WarehouseOutTime: record_time,
  47. Dealer: 0,
  48. Manufacturer: 0,
  49. Type: 1,
  50. IsSys: 1,
  51. StorehouseId: storeConfig.DrugStorehouseOut,
  52. IsCheck: 1,
  53. }
  54. err := AddSigleDrugWarehouseOut(&warehouseOut)
  55. if err != nil {
  56. utils.TraceLog("创建出库单失败 err = %v", err)
  57. return err
  58. } else {
  59. out = warehouseOut
  60. }
  61. }
  62. // 出库流程
  63. // 1.查询该药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  64. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  65. if drup.ID > 0 {
  66. prescribingNumber := advice.PrescribingNumber
  67. DrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  68. } else {
  69. return errors.New("药品信息不存在")
  70. }
  71. }
  72. return
  73. }
  74. // 药品自动出库 递归方式
  75. func DrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) {
  76. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  77. var deliver_number int64 = 0
  78. var stock_number int64 = 0
  79. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  80. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  81. var drug_price float64
  82. if advice.PrescribingNumberUnit == drup.MaxUnit {
  83. deliver_number = count * drup.MinNumber
  84. } else {
  85. deliver_number = count
  86. }
  87. if advice.PrescribingNumberUnit == drup.MaxUnit {
  88. drug_price = drup.RetailPrice
  89. }
  90. fmt.Println(drug_price)
  91. if advice.PrescribingNumberUnit == drup.MinUnit {
  92. drug_price = drup.MinPrice
  93. }
  94. if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit {
  95. drug_price = drup.RetailPrice
  96. }
  97. // 根据先进先出原则,查询最先入库的批次,进行出库
  98. // 如果没有对应的库存,则报错
  99. storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId)
  100. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  101. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  102. var stockMax int64
  103. var stockMin int64
  104. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  105. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  106. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  107. UpdateMinNumber(lastWarehouse.ID, stockMin)
  108. }
  109. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  110. if err != nil {
  111. return err
  112. }
  113. // 将该批次的剩余库存数量转换为拆零数量
  114. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  115. //查找药品信息
  116. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  117. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  118. if stock_number >= deliver_number {
  119. var maxNumber int64 = 0
  120. var minNumber int64 = 0
  121. //var stock_max_number int64 = 0
  122. //stock_max_number = warehouse.StockMaxNumber
  123. maxNumber = deliver_number / drup.MinNumber
  124. minNumber = deliver_number % drup.MinNumber
  125. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  126. minNumber = maxNumber
  127. }
  128. if drup.MaxUnit != drup.MinUnit {
  129. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  130. return errors.New("库存数量不足")
  131. }
  132. }
  133. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  134. if warehouse.StockMaxNumber < 0 {
  135. warehouse.StockMaxNumber = 0
  136. }
  137. if warehouse.StockMinNumber < 0 {
  138. warehouse.StockMinNumber = 0
  139. }
  140. warehouse.Mtime = time.Now().Unix()
  141. if warehouse.StockMinNumber < minNumber {
  142. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  143. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  144. } else {
  145. if minNumber > 0 {
  146. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  147. }
  148. if minNumber == 0 && maxNumber != 1 && warehouse.StockMaxNumber <= 0 {
  149. if warehouse.StockMinNumber > 0 {
  150. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  151. }
  152. }
  153. }
  154. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  155. if (warehouse.StockMinNumber - deliver_number) > 0 {
  156. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  157. }
  158. }
  159. if drup.MaxUnit != drup.MinUnit {
  160. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  161. return errors.New("库存数量不足")
  162. }
  163. }
  164. if warehouse.StockMinNumber <= 0 {
  165. warehouse.StockMinNumber = 0
  166. }
  167. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  168. if errThree != nil {
  169. return errThree
  170. }
  171. //查询剩余库存
  172. stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId)
  173. var sum_count int64
  174. for _, its := range stockInfo {
  175. if its.MaxUnit == drup.MaxUnit {
  176. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  177. }
  178. sum_count += its.StockMaxNumber + its.StockMinNumber
  179. }
  180. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  181. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  182. WarehouseOutId: warehouseout.ID,
  183. Status: 1,
  184. Ctime: time.Now().Unix(),
  185. Remark: warehouse.Remark,
  186. OrgId: orgID,
  187. Type: 1,
  188. Manufacturer: warehouse.Manufacturer,
  189. Dealer: warehouse.Dealer,
  190. IsSys: 1,
  191. SysRecordTime: advice.RecordDate,
  192. DrugId: advice.DrugId,
  193. Number: warehouse.Number,
  194. BatchNumber: warehouse.BatchNumber,
  195. Price: warehouse.RetailPrice,
  196. CountUnit: drup.MinUnit,
  197. RetailPrice: warehouse.RetailPrice,
  198. ProductDate: warehouse.ProductDate,
  199. ExpiryDate: warehouse.ExpiryDate,
  200. PatientId: advice.PatientId,
  201. Count: deliver_number, //出最小单位
  202. WarehouseInfoId: warehouse.ID,
  203. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  204. StorehouseId: storeConfig.DrugStorehouseOut,
  205. IsCheck: 1,
  206. OverCount: sum_count,
  207. }
  208. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  209. fmt.Println(errOne)
  210. lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID)
  211. drugflow := models.DrugFlow{
  212. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  213. WarehouseOutId: warehouseout.ID,
  214. DrugId: advice.DrugId,
  215. Number: warehouse.Number,
  216. ProductDate: warehouse.ProductDate,
  217. ExpireDate: warehouse.ExpiryDate,
  218. Count: deliver_number, //按最小单位计算,
  219. Price: warehouse.RetailPrice,
  220. Status: 1,
  221. Ctime: time.Now().Unix(),
  222. UserOrgId: orgID,
  223. Manufacturer: warehouse.Manufacturer,
  224. Dealer: warehouse.Dealer,
  225. BatchNumber: warehouse.BatchNumber,
  226. MaxUnit: drup.MinUnit,
  227. ConsumableType: 3,
  228. IsEdit: 1,
  229. Creator: advice.ExecutionStaff,
  230. IsSys: 1,
  231. PatientId: advice.PatientId,
  232. SystemTime: advice.AdviceDate,
  233. WarehousingDetailId: warehouse.ID,
  234. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  235. StorehouseId: storeConfig.DrugStorehouseOut,
  236. WarehouseOutDetailId: lastDrugOutInfo.ID,
  237. LastPrice: warehouse.Price,
  238. OverCount: sum_count,
  239. }
  240. CreateDrugFlowOne(drugflow)
  241. //查询是否存在数据
  242. details := &models.DrugAutomaticReduceDetail{
  243. WarehouseOutId: warehouseout.ID,
  244. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  245. PatientId: advice.PatientId,
  246. Ctime: time.Now().Unix(),
  247. Mtime: time.Now().Unix(),
  248. Status: 1,
  249. RecordTime: advice.RecordDate,
  250. OrgId: orgID,
  251. DrugId: advice.DrugId,
  252. Count: deliver_number,
  253. CountUnit: drup.MinUnit,
  254. WarehouseInfoId: warehouse.ID,
  255. StorehouseId: storeConfig.DrugStorehouseOut,
  256. }
  257. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  258. if errTwo != nil {
  259. return errTwo
  260. }
  261. var out_count int64
  262. //查询出库数据
  263. infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID)
  264. for _, item := range infoCountList {
  265. out_count += item.Count
  266. }
  267. //出库数量相加
  268. AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count)
  269. return nil
  270. } else {
  271. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  272. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  273. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  274. WarehouseOutId: warehouseout.ID,
  275. Status: 1,
  276. Ctime: time.Now().Unix(),
  277. Remark: warehouse.Remark,
  278. OrgId: orgID,
  279. Type: 1,
  280. Manufacturer: warehouse.Manufacturer,
  281. Dealer: warehouse.Dealer,
  282. IsSys: 1,
  283. SysRecordTime: advice.RecordDate,
  284. DrugId: advice.DrugId,
  285. Number: warehouse.Number,
  286. BatchNumber: warehouse.BatchNumber,
  287. Price: warehouse.RetailPrice,
  288. CountUnit: drup.MinUnit,
  289. ProductDate: warehouse.ProductDate,
  290. ExpiryDate: warehouse.ExpiryDate,
  291. PatientId: advice.PatientId,
  292. Count: stock_number,
  293. WarehouseInfoId: warehouse.ID,
  294. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  295. StorehouseId: storeConfig.DrugStorehouseOut,
  296. IsCheck: 1,
  297. }
  298. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  299. if errOne != nil {
  300. return errOne
  301. }
  302. lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID)
  303. details := &models.DrugAutomaticReduceDetail{
  304. WarehouseOutId: warehouseout.ID,
  305. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  306. PatientId: advice.PatientId,
  307. Ctime: time.Now().Unix(),
  308. Mtime: time.Now().Unix(),
  309. Status: 1,
  310. RecordTime: advice.RecordDate,
  311. OrgId: orgID,
  312. DrugId: advice.DrugId,
  313. Count: stock_number,
  314. CountUnit: drup.MinUnit,
  315. WarehouseInfoId: warehouse.ID,
  316. StorehouseId: storeConfig.DrugStorehouseOut,
  317. }
  318. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  319. if errTwo != nil {
  320. return errTwo
  321. }
  322. info := models.XtDrugWarehouseInfo{
  323. ID: warehouse.ID,
  324. WarehousingId: warehouse.WarehousingId,
  325. DrugId: warehouse.DrugId,
  326. Number: warehouse.Number,
  327. ProductDate: warehouse.ProductDate,
  328. ExpiryDate: warehouse.ExpiryDate,
  329. WarehousingCount: warehouse.WarehousingCount,
  330. Price: warehouse.RetailPrice,
  331. TotalPrice: warehouse.TotalPrice,
  332. Dealer: warehouse.Dealer,
  333. Manufacturer: warehouse.Manufacturer,
  334. Remark: warehouse.Remark,
  335. Ctime: warehouse.Ctime,
  336. Mtime: warehouse.Mtime,
  337. Status: 1,
  338. OrgId: warehouse.OrgId,
  339. IsReturn: warehouse.IsReturn,
  340. WarehousingOrder: warehouse.WarehousingOrder,
  341. Type: warehouse.Type,
  342. RetailPrice: warehouse.RetailPrice,
  343. RetailTotalPrice: warehouse.RetailPrice,
  344. StockMaxNumber: 0,
  345. StockMinNumber: 0,
  346. BatchNumber: warehouse.BatchNumber,
  347. MaxUnit: warehouse.MaxUnit,
  348. WarehousingInfoId: warehouse.WarehousingInfoId,
  349. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  350. StorehouseId: storeConfig.DrugStorehouseOut,
  351. IsCheck: 1,
  352. }
  353. //扣减库存
  354. errThree := UpDateDrugWarehouseInfoByStock(&info)
  355. if errThree != nil {
  356. return errThree
  357. }
  358. //查询剩余库存
  359. stockInfo, _ := GetDrugAllStockInfo(storeConfig.DrugStorehouseOut, orgID, advice.DrugId)
  360. var sum_count int64
  361. for _, its := range stockInfo {
  362. if its.MaxUnit == drup.MaxUnit {
  363. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  364. }
  365. sum_count += its.StockMaxNumber + its.StockMinNumber
  366. }
  367. var out_count int64
  368. //查询出库数据
  369. infoCountList, _ := FindDrugWarehouseOutInfoCount(advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId, advice.ID)
  370. for _, item := range infoCountList {
  371. out_count += item.Count
  372. }
  373. drugflow := models.DrugFlow{
  374. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  375. WarehouseOutId: warehouseout.ID,
  376. DrugId: advice.DrugId,
  377. Number: warehouse.Number,
  378. ProductDate: warehouse.ProductDate,
  379. ExpireDate: warehouse.ExpiryDate,
  380. Count: stock_number,
  381. Price: warehouse.RetailPrice,
  382. Status: 1,
  383. Ctime: time.Now().Unix(),
  384. UserOrgId: orgID,
  385. Manufacturer: warehouse.Manufacturer,
  386. Dealer: warehouse.Dealer,
  387. BatchNumber: warehouse.BatchNumber,
  388. MaxUnit: drup.MinUnit,
  389. ConsumableType: 3,
  390. IsEdit: 1,
  391. Creator: advice.ExecutionStaff,
  392. IsSys: 1,
  393. PatientId: advice.PatientId,
  394. WarehousingDetailId: warehouse.ID,
  395. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  396. StorehouseId: storeConfig.DrugStorehouseOut,
  397. WarehouseOutDetailId: lastDrugOutInfo.ID,
  398. LastPrice: warehouse.Price,
  399. OverCount: sum_count,
  400. }
  401. CreateDrugFlowOne(drugflow)
  402. //出库数量相加
  403. AddDrugCount(advice.DrugId, orgID, storeConfig.DrugStorehouseOut, drugflow.Count)
  404. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  405. prescribingNumber_two_temp := deliver_number - stock_number
  406. overPlusNumber := float64(prescribingNumber_two_temp)
  407. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  408. advice.PrescribingNumberUnit = drup.MinUnit
  409. DrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  410. }
  411. return
  412. }
  413. // 药品出库
  414. func HisDrugsDelivery(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo) (err error) {
  415. // 1.判断药品是否来自专用字典的药品库
  416. // 2.判断当天当前机构有没有创建出库单,没有则创建
  417. // 3.创建出库流程
  418. // 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
  419. isHasWay := false
  420. record_time := int64(0)
  421. isHasWay = true
  422. record_time = advice.RecordDate
  423. if isHasWay {
  424. //判断当天当前机构有没有创建出库单,没有则创建
  425. out, err := FindDrugStockOutByIsSys(orgID, 1, record_time)
  426. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  427. if err == gorm.ErrRecordNotFound {
  428. timeStr := time.Now().Format("2006-01-02")
  429. timeArr := strings.Split(timeStr, "-")
  430. total, _ := FindAllDrugWarehouseOut(orgID)
  431. total = total + 1
  432. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  433. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  434. number = number + total
  435. warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
  436. warehouseOut := models.DrugWarehouseOut{
  437. WarehouseOutOrderNumber: warehousing_out_order,
  438. OperationTime: time.Now().Unix(),
  439. OrgId: orgID,
  440. Creater: creater,
  441. Ctime: time.Now().Unix(),
  442. Status: 1,
  443. WarehouseOutTime: record_time,
  444. Dealer: 0,
  445. Manufacturer: 0,
  446. Type: 1,
  447. IsSys: 1,
  448. StorehouseId: houseConfig.DrugStorehouseOut,
  449. IsCheck: 1,
  450. }
  451. err := AddSigleDrugWarehouseOut(&warehouseOut)
  452. if err != nil {
  453. utils.TraceLog("创建出库单失败 err = %v", err)
  454. return err
  455. } else {
  456. out = warehouseOut
  457. }
  458. }
  459. // 出库流程
  460. // 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  461. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  462. if drup.ID > 0 {
  463. prescribingNumber := advice.PrescribingNumber
  464. //HisDrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  465. BloodHisDrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  466. } else {
  467. return errors.New("药品信息不存在")
  468. }
  469. }
  470. return
  471. }
  472. // 药品出库 递归方式
  473. func HisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  474. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  475. var deliver_number int64 = 0
  476. var stock_number int64 = 0
  477. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  478. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  479. if advice.PrescribingNumberUnit == drup.MaxUnit {
  480. deliver_number = count * drup.MinNumber
  481. } else {
  482. deliver_number = count
  483. }
  484. var min_price float64
  485. if advice.PrescribingNumberUnit == drup.MaxUnit {
  486. min_price = drup.RetailPrice
  487. }
  488. if advice.PrescribingNumberUnit == drup.MinUnit {
  489. min_price = drup.MinPrice
  490. }
  491. if advice.PrescribingNumberUnit != drup.MaxUnit && advice.PrescribingNumberUnit != drup.MinUnit {
  492. min_price = drup.RetailPrice
  493. }
  494. fmt.Println(min_price)
  495. // 根据先进先出原则,查询最先入库的批次,进行出库
  496. // 如果没有对应的库存,则报错
  497. //查询默认仓库
  498. storeConfig, _ := GetAllStoreHouseConfig(orgID)
  499. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  500. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  501. var stockMax int64
  502. var stockMin int64
  503. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  504. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  505. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  506. UpdateMinNumber(lastWarehouse.ID, stockMin)
  507. }
  508. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  509. if err != nil {
  510. return err
  511. }
  512. // 将该批次的剩余库存数量转换为拆零数量
  513. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  514. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  515. if stock_number >= deliver_number {
  516. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  517. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  518. WarehouseOutId: warehouseout.ID,
  519. Status: 1,
  520. Ctime: time.Now().Unix(),
  521. Remark: warehouse.Remark,
  522. OrgId: orgID,
  523. Type: 1,
  524. Manufacturer: warehouse.Manufacturer,
  525. Dealer: warehouse.Dealer,
  526. IsSys: 1,
  527. SysRecordTime: advice.RecordDate,
  528. DrugId: advice.DrugId,
  529. Number: warehouse.Number,
  530. BatchNumber: warehouse.BatchNumber,
  531. Price: warehouse.RetailPrice,
  532. CountUnit: drup.MinUnit,
  533. RetailPrice: warehouse.RetailPrice,
  534. ProductDate: warehouse.ProductDate,
  535. ExpiryDate: warehouse.ExpiryDate,
  536. PatientId: advice.PatientId,
  537. WarehouseInfoId: warehouse.ID,
  538. Count: deliver_number,
  539. AdviceId: advice.ID,
  540. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  541. StorehouseId: storeConfig.DrugStorehouseOut,
  542. IsCheck: 1,
  543. LastPrice: warehouse.Price,
  544. }
  545. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  546. lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID)
  547. if errOne != nil {
  548. return errOne
  549. }
  550. drugflow := models.DrugFlow{
  551. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  552. WarehouseOutId: warehouseout.ID,
  553. DrugId: advice.DrugId,
  554. Number: warehouse.Number,
  555. ProductDate: warehouse.ProductDate,
  556. ExpireDate: warehouse.ExpiryDate,
  557. Count: deliver_number,
  558. Price: warehouse.RetailPrice,
  559. Status: 1,
  560. Ctime: time.Now().Unix(),
  561. UserOrgId: orgID,
  562. Manufacturer: warehouse.Manufacturer,
  563. Dealer: warehouse.Dealer,
  564. BatchNumber: warehouse.BatchNumber,
  565. MaxUnit: drup.MinUnit,
  566. ConsumableType: 3,
  567. IsEdit: 1,
  568. Creator: advice.ExecutionStaff,
  569. IsSys: 1,
  570. PatientId: advice.PatientId,
  571. SystemTime: advice.AdviceDate,
  572. WarehousingDetailId: warehouse.ID,
  573. AdviceId: advice.ID,
  574. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  575. StorehouseId: storeConfig.DrugStorehouseOut,
  576. WarehouseOutDetailId: lastDrugOutInfo.ID,
  577. LastPrice: warehouse.Price,
  578. }
  579. CreateDrugFlowOne(drugflow)
  580. details := &models.DrugAutomaticReduceDetail{
  581. WarehouseOutId: warehouseout.ID,
  582. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  583. PatientId: advice.PatientId,
  584. Ctime: time.Now().Unix(),
  585. Mtime: time.Now().Unix(),
  586. Status: 1,
  587. RecordTime: advice.RecordDate,
  588. OrgId: orgID,
  589. DrugId: advice.DrugId,
  590. Count: deliver_number,
  591. CountUnit: drup.MinUnit,
  592. WarehouseInfoId: warehouse.ID,
  593. AdviceId: advice.ID,
  594. StorehouseId: storeConfig.DrugStorehouseOut,
  595. }
  596. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  597. if errTwo != nil {
  598. return errTwo
  599. }
  600. // 出库完成后,要减去对应批次的库存数量
  601. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  602. var maxNumber int64 = 0
  603. var minNumber int64 = 0
  604. maxNumber = deliver_number / drup.MinNumber
  605. minNumber = deliver_number % drup.MinNumber
  606. fmt.Println("maxNumber2323233232323232323232", maxNumber)
  607. fmt.Println("minNumber2323233232323232323232", minNumber)
  608. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  609. minNumber = maxNumber
  610. }
  611. if drup.MaxUnit != drup.MinUnit {
  612. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  613. return errors.New("库存数量不足")
  614. }
  615. }
  616. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  617. if warehouse.StockMaxNumber < 0 {
  618. warehouse.StockMaxNumber = 0
  619. }
  620. if warehouse.StockMinNumber < 0 {
  621. warehouse.StockMinNumber = 0
  622. }
  623. warehouse.Mtime = time.Now().Unix()
  624. fmt.Println("warehouse.StockMinNumber", warehouse.StockMinNumber)
  625. fmt.Println("minNumber", minNumber)
  626. fmt.Println("maxNumber", maxNumber)
  627. if warehouse.StockMinNumber < minNumber {
  628. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  629. if warehouse.MaxUnit != warehouse.MinUnit {
  630. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  631. }
  632. } else {
  633. if minNumber > 0 {
  634. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  635. }
  636. }
  637. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  638. if (warehouse.StockMinNumber - deliver_number) > 0 {
  639. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  640. }
  641. }
  642. if drup.MaxUnit != drup.MinUnit {
  643. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  644. return errors.New("库存数量不足")
  645. }
  646. }
  647. if warehouse.StockMinNumber <= 0 {
  648. warehouse.StockMinNumber = 0
  649. }
  650. //扣减库存
  651. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  652. if errThree != nil {
  653. return errThree
  654. }
  655. drugInfoList, _ := FindDrugWarehouseInfoList(advice.DrugId, orgID)
  656. var drug_max_number int64
  657. var drug_min_number int64
  658. for _, item := range drugInfoList {
  659. drug_max_number += item.StockMaxNumber
  660. drug_min_number += item.StockMinNumber
  661. }
  662. drugFlushInfo := models.XtDrugWarehouseFlushInfo{
  663. DrugMaxNumber: drug_max_number,
  664. UserOrgId: orgID,
  665. WarehouseOutId: warehouseout.ID,
  666. Type: 1,
  667. SystemTime: advice.RecordDate,
  668. PatientId: advice.PatientId,
  669. Ctime: time.Now().Unix(),
  670. Mtime: 0,
  671. BatchNumberId: warehouse.ID,
  672. DrugId: advice.DrugId,
  673. Count: deliver_number,
  674. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  675. Creater: warehouseout.Creater,
  676. DrugMinNumber: drug_min_number,
  677. Unit: drup.MinUnit,
  678. AdviceId: advice.ID,
  679. Status: 1,
  680. WarehouseOutDetailId: lastDrugOutInfo.ID,
  681. }
  682. CreatedDrugFlushInfo(drugFlushInfo)
  683. return nil
  684. } else {
  685. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  686. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  687. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  688. WarehouseOutId: warehouseout.ID,
  689. Status: 1,
  690. Ctime: time.Now().Unix(),
  691. Remark: warehouse.Remark,
  692. OrgId: orgID,
  693. Type: 1,
  694. Manufacturer: warehouse.Manufacturer,
  695. Dealer: warehouse.Dealer,
  696. IsSys: 1,
  697. SysRecordTime: advice.RecordDate,
  698. DrugId: advice.DrugId,
  699. Number: warehouse.Number,
  700. BatchNumber: warehouse.BatchNumber,
  701. Price: warehouse.RetailPrice,
  702. RetailPrice: warehouse.RetailPrice,
  703. ProductDate: warehouse.ProductDate,
  704. ExpiryDate: warehouse.ExpiryDate,
  705. PatientId: advice.PatientId,
  706. WarehouseInfoId: warehouse.ID,
  707. Count: stock_number,
  708. CountUnit: drup.MinUnit,
  709. AdviceId: advice.ID,
  710. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  711. StorehouseId: storeConfig.DrugStorehouseOut,
  712. IsCheck: 1,
  713. }
  714. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  715. if errOne != nil {
  716. return errOne
  717. }
  718. lastDrugOutInfo, _ := FindLastDrugWarehouseOutInfo(orgID)
  719. drugflow := models.DrugFlow{
  720. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  721. WarehouseOutId: warehouseout.ID,
  722. DrugId: advice.DrugId,
  723. Number: warehouse.Number,
  724. ProductDate: warehouse.ProductDate,
  725. ExpireDate: warehouse.ExpiryDate,
  726. Count: stock_number,
  727. Price: warehouse.RetailPrice,
  728. Status: 1,
  729. Ctime: time.Now().Unix(),
  730. UserOrgId: orgID,
  731. Manufacturer: warehouse.Manufacturer,
  732. Dealer: warehouse.Dealer,
  733. BatchNumber: warehouse.BatchNumber,
  734. MaxUnit: drup.MinUnit,
  735. ConsumableType: 3,
  736. IsEdit: 1,
  737. Creator: advice.ExecutionStaff,
  738. IsSys: 1,
  739. PatientId: advice.PatientId,
  740. SystemTime: advice.AdviceDate,
  741. WarehousingDetailId: warehouse.ID,
  742. AdviceId: advice.ID,
  743. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  744. StorehouseId: storeConfig.DrugStorehouseOut,
  745. WarehouseOutDetailId: lastDrugOutInfo.ID,
  746. LastPrice: warehouse.Price,
  747. }
  748. CreateDrugFlowOne(drugflow)
  749. //查询是否存在数据
  750. details := &models.DrugAutomaticReduceDetail{
  751. WarehouseOutId: warehouseout.ID,
  752. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  753. PatientId: advice.PatientId,
  754. Ctime: time.Now().Unix(),
  755. Mtime: time.Now().Unix(),
  756. Status: 1,
  757. RecordTime: advice.RecordDate,
  758. OrgId: orgID,
  759. DrugId: advice.DrugId,
  760. Count: stock_number,
  761. CountUnit: drup.MinUnit,
  762. WarehouseInfoId: warehouse.ID,
  763. AdviceId: advice.ID,
  764. StorehouseId: storeConfig.DrugStorehouseOut,
  765. }
  766. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  767. if errTwo != nil {
  768. return errTwo
  769. }
  770. info := models.XtDrugWarehouseInfo{
  771. ID: warehouse.ID,
  772. WarehousingId: warehouse.WarehousingId,
  773. DrugId: warehouse.DrugId,
  774. Number: warehouse.Number,
  775. ProductDate: warehouse.ProductDate,
  776. ExpiryDate: warehouse.ExpiryDate,
  777. WarehousingCount: warehouse.WarehousingCount,
  778. Price: warehouse.Price,
  779. TotalPrice: warehouse.TotalPrice,
  780. Dealer: warehouse.Dealer,
  781. Manufacturer: warehouse.Manufacturer,
  782. Remark: warehouse.Remark,
  783. Ctime: warehouse.Ctime,
  784. Mtime: warehouse.Mtime,
  785. Status: 1,
  786. OrgId: warehouse.OrgId,
  787. IsReturn: warehouse.IsReturn,
  788. WarehousingOrder: warehouse.WarehousingOrder,
  789. Type: warehouse.Type,
  790. RetailPrice: warehouse.RetailPrice,
  791. RetailTotalPrice: warehouse.RetailPrice,
  792. StockMaxNumber: 0,
  793. StockMinNumber: 0,
  794. BatchNumber: warehouse.BatchNumber,
  795. MaxUnit: warehouse.MaxUnit,
  796. MinUnit: warehouse.MinUnit,
  797. WarehousingInfoId: warehouse.WarehousingInfoId,
  798. StorehouseId: storeConfig.DrugStorehouseOut,
  799. IsCheck: 1,
  800. }
  801. errThree := UpDateDrugWarehouseInfoByStock(&info)
  802. if errThree != nil {
  803. return errThree
  804. }
  805. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  806. prescribingNumber_two_temp := deliver_number - stock_number
  807. overPlusNumber := float64(prescribingNumber_two_temp)
  808. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  809. advice.PrescribingNumberUnit = drup.MinUnit
  810. HisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  811. }
  812. return
  813. }
  814. // 药品出库 递归方式
  815. func AutoDrugDeliverInfo(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  816. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  817. var deliver_number int64 = 0
  818. var stock_number int64 = 0
  819. if advice.CountUnit == drup.MaxUnit {
  820. deliver_number = prescribingNumber * drup.MinNumber
  821. } else {
  822. deliver_number = prescribingNumber
  823. }
  824. // 根据先进先出原则,查询最先入库的批次,进行出库
  825. // 如果没有对应的库存,则报错
  826. //开启事物
  827. storeConfig, _ := GetAllStoreHouseConfig(orgID)
  828. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  829. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  830. var stockMax int64
  831. var stockMin int64
  832. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  833. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  834. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  835. UpdateMinNumber(lastWarehouse.ID, stockMin)
  836. }
  837. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  838. if err != nil {
  839. return err
  840. }
  841. // 将该批次的剩余库存数量转换为拆零数量
  842. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  843. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  844. if stock_number >= deliver_number {
  845. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  846. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  847. WarehouseOutId: warehouseout.ID,
  848. Status: 1,
  849. Ctime: time.Now().Unix(),
  850. Remark: advice.Remark,
  851. OrgId: orgID,
  852. Type: 1,
  853. Manufacturer: advice.Manufacturer,
  854. Dealer: warehouse.Dealer,
  855. IsSys: 0,
  856. SysRecordTime: advice.Ctime,
  857. DrugId: advice.DrugId,
  858. ExpiryDate: advice.ExpiryDate,
  859. ProductDate: advice.ProductDate,
  860. Number: advice.Number,
  861. BatchNumber: warehouse.BatchNumber,
  862. Count: deliver_number,
  863. RetailPrice: advice.RetailPrice,
  864. Price: warehouse.RetailPrice,
  865. WarehouseInfoId: warehouse.ID,
  866. CountUnit: drup.MinUnit,
  867. AdviceId: advice.ID,
  868. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  869. StorehouseId: advice.StorehouseId,
  870. AdminUserId: advice.AdminUserId,
  871. IsCheck: 1,
  872. }
  873. warehouseOutInfo.Count = prescribingNumber
  874. warehouseOutInfo.CountUnit = advice.CountUnit
  875. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  876. if errOne != nil {
  877. return errOne
  878. }
  879. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  880. drugflow := models.DrugFlow{
  881. WarehouseOutId: warehouseout.ID,
  882. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  883. DrugId: advice.DrugId,
  884. Number: warehouse.Number,
  885. ProductDate: advice.ProductDate,
  886. ExpireDate: advice.ExpiryDate,
  887. Count: deliver_number,
  888. Price: warehouse.RetailPrice,
  889. Status: 1,
  890. Ctime: time.Now().Unix(),
  891. UserOrgId: advice.OrgId,
  892. Manufacturer: advice.Manufacturer,
  893. Dealer: advice.Dealer,
  894. BatchNumber: warehouse.BatchNumber,
  895. MaxUnit: drup.MinUnit,
  896. ConsumableType: 2,
  897. IsEdit: 1,
  898. Creator: 0,
  899. IsSys: 0,
  900. WarehouseOutDetailId: drugWareInfo.ID,
  901. AdviceId: advice.ID,
  902. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  903. StorehouseId: advice.StorehouseId,
  904. AdminUserId: advice.AdminUserId,
  905. }
  906. CreateDrugFlowOne(drugflow)
  907. // 出库完成后,要减去对应批次的库存数量
  908. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  909. var maxNumber int64 = 0
  910. var minNumber int64 = 0
  911. if advice.CountUnit == drup.MinUnit {
  912. maxNumber = prescribingNumber / drup.MinNumber
  913. minNumber = prescribingNumber % drup.MinNumber
  914. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  915. minNumber = maxNumber
  916. }
  917. } else {
  918. maxNumber = prescribingNumber
  919. }
  920. if warehouse.StockMaxNumber < maxNumber {
  921. return errors.New("库存数量不足")
  922. }
  923. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  924. warehouse.Mtime = time.Now().Unix()
  925. if warehouse.StockMinNumber < minNumber {
  926. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  927. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  928. } else {
  929. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  930. }
  931. if warehouse.StockMaxNumber == 1 && warehouse.StockMinNumber == 1 && drup.MaxUnit == drup.MinUnit {
  932. warehouse.StockMinNumber = 0
  933. }
  934. if warehouse.StockMaxNumber < 0 {
  935. return errors.New("库存数量不足")
  936. }
  937. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  938. if errThree != nil {
  939. return errThree
  940. }
  941. //查询默认仓库
  942. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  943. //查询默认仓库剩余多少库存
  944. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  945. var sum_count int64
  946. var sum_in_count int64
  947. for _, it := range list {
  948. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  949. if it.MaxUnit == baseDrug.MaxUnit {
  950. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  951. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  952. }
  953. sum_count += it.StockMaxNumber + it.StockMinNumber
  954. sum_in_count += it.WarehousingCount
  955. }
  956. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  957. return nil
  958. } else {
  959. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  960. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  961. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  962. WarehouseOutId: warehouseout.ID,
  963. Status: 1,
  964. Ctime: time.Now().Unix(),
  965. Remark: advice.Remark,
  966. OrgId: orgID,
  967. Type: 1,
  968. Manufacturer: advice.Manufacturer,
  969. Dealer: warehouse.Dealer,
  970. IsSys: 0,
  971. SysRecordTime: advice.Ctime,
  972. DrugId: advice.DrugId,
  973. ExpiryDate: warehouse.ExpiryDate,
  974. ProductDate: warehouse.ProductDate,
  975. Number: warehouse.Number,
  976. BatchNumber: warehouse.BatchNumber,
  977. Count: stock_number,
  978. RetailPrice: advice.RetailPrice,
  979. Price: warehouse.RetailPrice,
  980. WarehouseInfoId: warehouse.ID,
  981. CountUnit: drup.MinUnit,
  982. AdviceId: advice.ID,
  983. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  984. StorehouseId: advice.StorehouseId,
  985. AdminUserId: advice.AdminUserId,
  986. IsCheck: 1,
  987. }
  988. warehouseOutInfo.Count = stock_number
  989. //warehouseOutInfo.CountUnit = advice.CountUnit
  990. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  991. if errOne != nil {
  992. return errOne
  993. }
  994. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  995. drugflow := models.DrugFlow{
  996. WarehouseOutId: warehouseout.ID,
  997. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  998. DrugId: advice.DrugId,
  999. Number: warehouse.Number,
  1000. ProductDate: advice.ProductDate,
  1001. ExpireDate: advice.ExpiryDate,
  1002. Count: stock_number,
  1003. Price: warehouse.RetailPrice,
  1004. Status: 1,
  1005. Ctime: time.Now().Unix(),
  1006. UserOrgId: advice.OrgId,
  1007. Manufacturer: advice.Manufacturer,
  1008. Dealer: advice.Dealer,
  1009. BatchNumber: warehouse.BatchNumber,
  1010. MaxUnit: drup.MinUnit,
  1011. ConsumableType: 2,
  1012. IsEdit: 1,
  1013. Creator: 0,
  1014. IsSys: 0,
  1015. WarehouseOutDetailId: drugWareInfo.ID,
  1016. AdviceId: advice.ID,
  1017. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1018. StorehouseId: advice.StorehouseId,
  1019. AdminUserId: advice.AdminUserId,
  1020. }
  1021. CreateDrugFlowOne(drugflow)
  1022. // 出库完成后,要将该批次库存清零
  1023. //扣减库存
  1024. warehouse.StockMaxNumber = 0
  1025. warehouse.StockMinNumber = 0
  1026. warehouse.Mtime = time.Now().Unix()
  1027. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  1028. //查询默认仓库
  1029. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  1030. //查询默认仓库剩余多少库存
  1031. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  1032. var sum_count int64
  1033. var sum_in_count int64
  1034. for _, it := range list {
  1035. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  1036. if it.MaxUnit == baseDrug.MaxUnit {
  1037. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  1038. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  1039. sum_count += it.StockMaxNumber + it.StockMinNumber
  1040. sum_in_count += it.WarehousingCount
  1041. }
  1042. }
  1043. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  1044. if errThree != nil {
  1045. return errThree
  1046. }
  1047. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1048. prescribingNumber_two_temp := deliver_number - stock_number
  1049. advice.CountUnit = drup.MinUnit
  1050. AutoDrugDeliverInfo(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  1051. }
  1052. return
  1053. }
  1054. // 耗材出库
  1055. func ConsumablesDeliveryTotal(orgID int64, patient_id int64, record_time int64, goods []*models.DialysisBeforePrepareGoods, goodOne []*models.NewDialysisBeforePrepareGoods, creator int64) (err error) {
  1056. //查询该患者当天已经出库的耗材信息
  1057. goods_yc, _ := FindConsumablesByDateTwo(orgID, patient_id, record_time)
  1058. // 和新请求的出库数据进行对比,分出那些是继续出库的,那些是需要删除出库的
  1059. for i := len(goods_yc) - 1; i >= 0; i-- {
  1060. goods_yc_temp := goods_yc[i]
  1061. for j := len(goods) - 1; j >= 0; j-- {
  1062. goods_temp := goods[j]
  1063. // 已经出库和新请求出库都存在该耗材,则判断出库数量,分成是继续出库,还是删除出库
  1064. if goods_yc_temp.GoodTypeId == goods_temp.GoodTypeId && goods_yc_temp.GoodId == goods_temp.GoodId {
  1065. // 已经出库和新请求出库的出库数量一致,则清除两个结构体里的数据(既不出库,也不删除出库)
  1066. if goods_yc_temp.Count == goods_temp.Count {
  1067. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  1068. goods = append(goods[:j], goods[j+1:]...)
  1069. break
  1070. }
  1071. // 如果已经出库的数量 大于 新请求出库的数量,则代表需要删除出库
  1072. if goods_yc_temp.Count > goods_temp.Count {
  1073. temp_count := goods_yc_temp.Count - goods_temp.Count
  1074. goods_yc[i].Count = temp_count
  1075. goods = append(goods[:j], goods[j+1:]...)
  1076. break
  1077. }
  1078. // 如果已经出库的数量 小于 新请求出库的梳理,则代表需要增加出库
  1079. if goods_yc_temp.Count < goods_temp.Count {
  1080. temp_count := goods_temp.Count - goods_yc_temp.Count
  1081. goods[j].Count = temp_count
  1082. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  1083. break
  1084. }
  1085. }
  1086. }
  1087. }
  1088. // goods_yc 这个数据就是需要已经出库了,但是现在需要删除出库的耗材数据
  1089. // goods 这个数据就是需要出库的耗材的数据(新增的数据)
  1090. if len(goods) > 0 {
  1091. out, err := FindStockOutByIsSys(orgID, 1, record_time)
  1092. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  1093. if err == gorm.ErrRecordNotFound {
  1094. //没有记录,则创建出库单
  1095. timeStr := time.Now().Format("2006-01-02")
  1096. timeArr := strings.Split(timeStr, "-")
  1097. total, _ := FindAllWarehouseOut(orgID)
  1098. total = total + 1
  1099. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  1100. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  1101. number = number + total
  1102. warehousing_out_order = "CKD" + strconv.FormatInt(number, 10)
  1103. warehouseOut := models.WarehouseOut{
  1104. WarehouseOutOrderNumber: warehousing_out_order,
  1105. OperationTime: time.Now().Unix(),
  1106. OrgId: orgID,
  1107. Creater: creator,
  1108. Ctime: time.Now().Unix(),
  1109. Status: 1,
  1110. WarehouseOutTime: record_time,
  1111. Dealer: 0,
  1112. Manufacturer: 0,
  1113. Type: 1,
  1114. IsSys: 1,
  1115. StorehouseId: houseConfig.StorehouseOutInfo,
  1116. IsCheck: 1,
  1117. }
  1118. err := AddSigleWarehouseOut(&warehouseOut)
  1119. if err != nil {
  1120. utils.TraceLog("创建出库单失败 err = %v", err)
  1121. return err
  1122. } else {
  1123. out = warehouseOut
  1124. }
  1125. }
  1126. for _, item := range goods {
  1127. var newCount int64 = 0
  1128. for _, it := range goodOne {
  1129. if item.GoodTypeId == it.GoodTypeId && item.GoodId == it.GoodId {
  1130. newCount = it.Count
  1131. }
  1132. }
  1133. var cha_count int64
  1134. var cha_count_two int64
  1135. flowGood, _ := GetStockFlowIsBatchNumberTwo(patient_id, record_time, item.GoodId)
  1136. var out_count int64
  1137. for _, item := range flowGood {
  1138. out_count += item.Count
  1139. }
  1140. cha_count = item.Count - out_count
  1141. //fmt.Println("item.Count", item.Count)
  1142. //fmt.Println("item.Count", out_count)
  1143. //fmt.Println("cha_count2323223232323223", cha_count)
  1144. cha_count_two = out_count - item.Count
  1145. prepare := models.DialysisBeforePrepare{
  1146. GoodTypeId: item.GoodTypeId,
  1147. GoodId: item.GoodId,
  1148. Count: cha_count,
  1149. ProjectId: item.ProjectId,
  1150. StorehouseId: houseConfig.StorehouseOutInfo,
  1151. }
  1152. ConsumablesGoodDelivery(orgID, patient_id, record_time, &prepare, &out, newCount)
  1153. //数量增加
  1154. if cha_count > 0 {
  1155. //出库数量累加
  1156. ModifyGoodSumCount(houseConfig.StorehouseOutInfo, cha_count, orgID, item.GoodId)
  1157. }
  1158. //数量减少
  1159. if cha_count_two > 0 {
  1160. ModifyAddGoodSumCount(houseConfig.StorehouseOutInfo, cha_count_two, orgID, item.GoodId)
  1161. //退库数量增加
  1162. UpdateSumAddCancelCount(orgID, item.GoodId, houseConfig.StorehouseOutInfo, cha_count_two)
  1163. }
  1164. //更新剩余库存
  1165. goodListSix, _ := GetSumGoodList(orgID, houseConfig.StorehouseOutInfo, item.GoodId)
  1166. var flush_count int64
  1167. for _, it := range goodListSix {
  1168. flush_count += it.StockCount
  1169. }
  1170. UpdateSumGood(orgID, houseConfig.StorehouseOutInfo, item.GoodId, flush_count)
  1171. }
  1172. }
  1173. if len(goods_yc) > 0 {
  1174. for _, good_yc := range goods_yc {
  1175. out, _ := FindStockOutByIsSys(orgID, 1, record_time)
  1176. ConsumablesDeliveryDelete(orgID, patient_id, record_time, good_yc, &out)
  1177. }
  1178. }
  1179. return nil
  1180. }
  1181. // 耗材出库
  1182. func ConsumablesDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, count int64) (err error) {
  1183. //开事务
  1184. var deliver_number int64 = 0
  1185. var stock_number int64 = 0
  1186. var maxNumber int64 = 0
  1187. deliver_number = goods.Count
  1188. // 根据先进先出原则,查询最先入库的批次,进行出库
  1189. // 如果没有对应的库存,则报错
  1190. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  1191. if err != nil {
  1192. return errors.New("库存数量不足")
  1193. }
  1194. stock_number = warehouse.StockCount
  1195. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1196. if stock_number >= deliver_number {
  1197. maxNumber = goods.Count
  1198. //出库
  1199. warehouse.StockCount = warehouse.StockCount - maxNumber
  1200. warehouse.Mtime = time.Now().Unix()
  1201. if warehouse.StockCount < 0 {
  1202. return errors.New("库存数量不足")
  1203. }
  1204. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1205. if errThree != nil {
  1206. return errThree
  1207. }
  1208. //查询剩余库存
  1209. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  1210. var sum_count int64
  1211. for _, item := range goodList {
  1212. sum_count += item.StockCount
  1213. }
  1214. warehouseOutInfo := &models.WarehouseOutInfo{
  1215. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1216. WarehouseOutId: warehouseOut.ID,
  1217. WarehouseInfotId: warehouse.ID,
  1218. Status: 1,
  1219. Ctime: time.Now().Unix(),
  1220. Remark: warehouse.Remark,
  1221. OrgId: orgID,
  1222. Type: 1,
  1223. Manufacturer: warehouse.Manufacturer,
  1224. Dealer: warehouse.Dealer,
  1225. IsSys: 1,
  1226. SysRecordTime: record_time,
  1227. GoodTypeId: goods.GoodTypeId,
  1228. GoodId: goods.GoodId,
  1229. PatientId: patient_id,
  1230. Number: warehouse.Number,
  1231. LicenseNumber: warehouse.LicenseNumber,
  1232. Price: warehouse.PackingPrice,
  1233. ExpiryDate: warehouse.ExpiryDate,
  1234. ProductDate: warehouse.ProductDate,
  1235. ProjectId: goods.ProjectId,
  1236. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1237. StorehouseId: goods.StorehouseId,
  1238. IsCheck: 1,
  1239. }
  1240. warehouseOutInfo.Count = count
  1241. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, patient_id, record_time, goods.ProjectId)
  1242. if errcodes == gorm.ErrRecordNotFound {
  1243. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1244. if errOne != nil {
  1245. return errOne
  1246. }
  1247. } else if errcodes == nil {
  1248. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, patient_id, record_time, goods.ProjectId)
  1249. }
  1250. details := models.BloodAutomaticReduceDetail{
  1251. WarehouseOutId: warehouseOutInfo.ID,
  1252. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1253. PatientId: patient_id,
  1254. Ctime: time.Now().Unix(),
  1255. Mtime: time.Now().Unix(),
  1256. Status: 1,
  1257. RecordTime: record_time,
  1258. OrgId: orgID,
  1259. GoodId: goods.GoodId,
  1260. GoodTypeId: goods.GoodTypeId,
  1261. Count: count,
  1262. ProjectId: goods.ProjectId,
  1263. StorehouseId: goods.StorehouseId,
  1264. }
  1265. //查询当天耗材是否已经存在数据
  1266. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1267. if errcode == gorm.ErrRecordNotFound {
  1268. errTwo := CreateAutoReduceRecord(&details)
  1269. if errTwo != nil {
  1270. return errTwo
  1271. }
  1272. //插入库存流水表
  1273. flow := models.VmStockFlow{
  1274. WarehouseOutId: warehouseOut.ID,
  1275. WarehousingId: warehouse.ID,
  1276. GoodId: goods.GoodId,
  1277. Number: warehouse.Number,
  1278. ProductDate: warehouse.ProductDate,
  1279. ExpireDate: warehouse.ExpiryDate,
  1280. Count: deliver_number,
  1281. Price: warehouse.PackingPrice,
  1282. Status: 1,
  1283. Ctime: time.Now().Unix(),
  1284. UserOrgId: orgID,
  1285. Manufacturer: warehouse.Manufacturer,
  1286. Dealer: warehouse.Dealer,
  1287. LicenseNumber: warehouse.LicenseNumber,
  1288. IsEdit: 2,
  1289. Creator: warehouseOut.Creater,
  1290. SystemTime: record_time,
  1291. ConsumableType: 3,
  1292. WarehouseOutDetailId: warehouseOutInfo.ID,
  1293. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1294. IsSys: 1,
  1295. PatientId: patient_id,
  1296. ProjectId: goods.ProjectId,
  1297. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1298. StorehouseId: goods.StorehouseId,
  1299. OverCount: sum_count,
  1300. }
  1301. //查询流水是否存在
  1302. exsit, errflow := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1303. if errflow == gorm.ErrRecordNotFound {
  1304. //创建数据
  1305. errThre := CreateStockFlowOne(flow)
  1306. if errThre != nil {
  1307. return errThre
  1308. }
  1309. } else if errflow == nil {
  1310. flow := models.VmStockFlow{
  1311. ID: exsit.ID,
  1312. WarehouseOutId: warehouseOut.ID,
  1313. WarehousingId: warehouse.ID,
  1314. GoodId: goods.GoodId,
  1315. Number: warehouse.Number,
  1316. ProductDate: warehouse.ProductDate,
  1317. ExpireDate: warehouse.ExpiryDate,
  1318. Count: exsit.Count + goods.Count,
  1319. Price: warehouse.PackingPrice,
  1320. Status: 1,
  1321. Ctime: time.Now().Unix(),
  1322. UserOrgId: orgID,
  1323. Manufacturer: warehouse.Manufacturer,
  1324. Dealer: warehouse.Dealer,
  1325. LicenseNumber: warehouse.LicenseNumber,
  1326. IsEdit: 2,
  1327. Creator: warehouseOut.Creater,
  1328. SystemTime: record_time,
  1329. ConsumableType: 3,
  1330. WarehouseOutDetailId: warehouseOutInfo.ID,
  1331. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1332. IsSys: 1,
  1333. PatientId: patient_id,
  1334. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1335. ProjectId: goods.ProjectId,
  1336. StorehouseId: goods.StorehouseId,
  1337. OverCount: sum_count,
  1338. }
  1339. errFour := UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1340. if errFour != nil {
  1341. return errFour
  1342. }
  1343. }
  1344. } else if errcode == nil {
  1345. flow := models.VmStockFlow{
  1346. WarehouseOutId: warehouseOut.ID,
  1347. WarehousingId: warehouse.ID,
  1348. GoodId: goods.GoodId,
  1349. Number: warehouse.Number,
  1350. ProductDate: warehouse.ProductDate,
  1351. ExpireDate: warehouse.ExpiryDate,
  1352. Count: deliver_number,
  1353. Price: warehouse.PackingPrice,
  1354. Status: 1,
  1355. Ctime: time.Now().Unix(),
  1356. UserOrgId: orgID,
  1357. Manufacturer: warehouse.Manufacturer,
  1358. Dealer: warehouse.Dealer,
  1359. LicenseNumber: warehouse.LicenseNumber,
  1360. IsEdit: 2,
  1361. Creator: warehouseOut.Creater,
  1362. SystemTime: record_time,
  1363. ConsumableType: 3,
  1364. WarehouseOutDetailId: warehouseOutInfo.ID,
  1365. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1366. IsSys: 1,
  1367. PatientId: patient_id,
  1368. ProjectId: goods.ProjectId,
  1369. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1370. StorehouseId: goods.StorehouseId,
  1371. OverCount: sum_count,
  1372. }
  1373. //查询流水是否存在
  1374. exsit, errflow := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1375. if errflow == gorm.ErrRecordNotFound {
  1376. CreateStockFlowOne(flow)
  1377. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1378. CreateAutoReduceRecord(&details)
  1379. } else if errflow == nil {
  1380. flow := models.VmStockFlow{
  1381. ID: exsit.ID,
  1382. WarehouseOutId: warehouseOut.ID,
  1383. WarehousingId: warehouse.ID,
  1384. GoodId: goods.GoodId,
  1385. Number: warehouse.Number,
  1386. ProductDate: warehouse.ProductDate,
  1387. ExpireDate: warehouse.ExpiryDate,
  1388. Count: exsit.Count + goods.Count,
  1389. Price: warehouse.PackingPrice,
  1390. Status: 1,
  1391. Ctime: time.Now().Unix(),
  1392. UserOrgId: orgID,
  1393. Manufacturer: warehouse.Manufacturer,
  1394. Dealer: warehouse.Dealer,
  1395. LicenseNumber: warehouse.LicenseNumber,
  1396. IsEdit: 2,
  1397. Creator: warehouseOut.Creater,
  1398. SystemTime: record_time,
  1399. ConsumableType: 3,
  1400. WarehouseOutDetailId: warehouseOutInfo.ID,
  1401. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1402. IsSys: 1,
  1403. PatientId: patient_id,
  1404. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1405. ProjectId: goods.ProjectId,
  1406. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1407. StorehouseId: goods.StorehouseId,
  1408. OverCount: sum_count,
  1409. }
  1410. UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1411. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1412. CreateAutoReduceRecord(&details)
  1413. }
  1414. }
  1415. return nil
  1416. } else {
  1417. // 当刚批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1418. warehouse.StockCount = 0
  1419. warehouse.Mtime = time.Now().Unix()
  1420. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1421. if errThree != nil {
  1422. return errThree
  1423. }
  1424. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  1425. var sum_count int64
  1426. for _, item := range goodList {
  1427. sum_count += item.StockCount
  1428. }
  1429. warehouseOutInfo := &models.WarehouseOutInfo{
  1430. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1431. WarehouseOutId: warehouseOut.ID,
  1432. WarehouseInfotId: warehouse.ID,
  1433. Status: 1,
  1434. Ctime: time.Now().Unix(),
  1435. Remark: warehouse.Remark,
  1436. OrgId: orgID,
  1437. Type: 1,
  1438. Manufacturer: warehouse.Manufacturer,
  1439. Dealer: warehouse.Dealer,
  1440. IsSys: 1,
  1441. SysRecordTime: record_time,
  1442. GoodTypeId: goods.GoodTypeId,
  1443. GoodId: goods.GoodId,
  1444. PatientId: patient_id,
  1445. Number: warehouse.Number,
  1446. LicenseNumber: warehouse.LicenseNumber,
  1447. Price: warehouse.PackingPrice,
  1448. ExpiryDate: warehouse.ExpiryDate,
  1449. ProductDate: warehouse.ProductDate,
  1450. ProjectId: goods.ProjectId,
  1451. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1452. StorehouseId: goods.StorehouseId,
  1453. IsCheck: 1,
  1454. }
  1455. warehouseOutInfo.Count = stock_number
  1456. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, goods.PatientId, record_time, goods.ProjectId)
  1457. if errcodes == gorm.ErrRecordNotFound {
  1458. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1459. if errOne != nil {
  1460. return errOne
  1461. }
  1462. //插入库存流水表
  1463. flow := models.VmStockFlow{
  1464. WarehouseOutId: warehouseOut.ID,
  1465. WarehousingId: warehouse.ID,
  1466. GoodId: goods.GoodId,
  1467. Number: warehouse.Number,
  1468. ProductDate: warehouse.ProductDate,
  1469. ExpireDate: warehouse.ExpiryDate,
  1470. Count: stock_number,
  1471. Price: warehouse.PackingPrice,
  1472. Status: 1,
  1473. Ctime: time.Now().Unix(),
  1474. UserOrgId: orgID,
  1475. Manufacturer: warehouse.Manufacturer,
  1476. Dealer: warehouse.Dealer,
  1477. LicenseNumber: warehouse.LicenseNumber,
  1478. IsEdit: 2,
  1479. Creator: warehouseOut.Creater,
  1480. SystemTime: record_time,
  1481. ConsumableType: 3,
  1482. WarehouseOutDetailId: warehouseOutInfo.ID,
  1483. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1484. IsSys: 1,
  1485. PatientId: patient_id,
  1486. ProjectId: goods.ProjectId,
  1487. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1488. StorehouseId: goods.StorehouseId,
  1489. OverCount: sum_count,
  1490. }
  1491. //查询流水是否存在
  1492. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1493. if errflows == gorm.ErrRecordNotFound {
  1494. CreateStockFlowOne(flow)
  1495. } else if errflows == nil {
  1496. flow := models.VmStockFlow{
  1497. ID: exsit.ID,
  1498. WarehouseOutId: warehouseOut.ID,
  1499. WarehousingId: warehouse.ID,
  1500. GoodId: goods.GoodId,
  1501. Number: warehouse.Number,
  1502. ProductDate: warehouse.ProductDate,
  1503. ExpireDate: warehouse.ExpiryDate,
  1504. Count: exsit.Count + goods.Count,
  1505. Price: warehouse.PackingPrice,
  1506. Status: 1,
  1507. Ctime: time.Now().Unix(),
  1508. UserOrgId: orgID,
  1509. Manufacturer: warehouse.Manufacturer,
  1510. Dealer: warehouse.Dealer,
  1511. LicenseNumber: warehouse.LicenseNumber,
  1512. IsEdit: 2,
  1513. Creator: warehouseOut.Creater,
  1514. SystemTime: record_time,
  1515. ConsumableType: 3,
  1516. WarehouseOutDetailId: warehouseOutInfo.ID,
  1517. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1518. IsSys: 1,
  1519. PatientId: patient_id,
  1520. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1521. ProjectId: goods.ProjectId,
  1522. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1523. StorehouseId: goods.StorehouseId,
  1524. OverCount: sum_count,
  1525. }
  1526. errOne := UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1527. if errOne == nil {
  1528. }
  1529. }
  1530. } else if errcodes == nil {
  1531. goods.Count = deliver_number - stock_number
  1532. //更新数量为 该批次剩余数量 + 还有未出的数量
  1533. warehouseOutInfo.Count = stock_number
  1534. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, goods.PatientId, record_time, goods.ProjectId)
  1535. //插入库存流水表
  1536. flow := models.VmStockFlow{
  1537. WarehouseOutId: warehouseOut.ID,
  1538. WarehousingId: warehouse.ID,
  1539. GoodId: goods.GoodId,
  1540. Number: warehouse.Number,
  1541. ProductDate: warehouse.ProductDate,
  1542. ExpireDate: warehouse.ExpiryDate,
  1543. Count: stock_number,
  1544. Price: warehouse.PackingPrice,
  1545. Status: 1,
  1546. Ctime: time.Now().Unix(),
  1547. UserOrgId: orgID,
  1548. Manufacturer: warehouse.Manufacturer,
  1549. Dealer: warehouse.Dealer,
  1550. LicenseNumber: warehouse.LicenseNumber,
  1551. IsEdit: 2,
  1552. Creator: warehouseOut.Creater,
  1553. SystemTime: record_time,
  1554. ConsumableType: 3,
  1555. WarehouseOutDetailId: warehouseOutInfo.ID,
  1556. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1557. IsSys: 1,
  1558. PatientId: patient_id,
  1559. ProjectId: goods.ProjectId,
  1560. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1561. StorehouseId: goods.StorehouseId,
  1562. OverCount: sum_count,
  1563. }
  1564. //查询流水是否存在
  1565. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1566. if errflows == gorm.ErrRecordNotFound {
  1567. CreateStockFlowOne(flow)
  1568. } else if errflows == nil {
  1569. flow := models.VmStockFlow{
  1570. ID: exsit.ID,
  1571. WarehouseOutId: warehouseOut.ID,
  1572. WarehousingId: warehouse.ID,
  1573. GoodId: goods.GoodId,
  1574. Number: warehouse.Number,
  1575. ProductDate: warehouse.ProductDate,
  1576. ExpireDate: warehouse.ExpiryDate,
  1577. Count: exsit.Count + goods.Count,
  1578. Price: warehouse.PackingPrice,
  1579. Status: 1,
  1580. Ctime: time.Now().Unix(),
  1581. UserOrgId: orgID,
  1582. Manufacturer: warehouse.Manufacturer,
  1583. Dealer: warehouse.Dealer,
  1584. LicenseNumber: warehouse.LicenseNumber,
  1585. IsEdit: 2,
  1586. Creator: warehouseOut.Creater,
  1587. SystemTime: record_time,
  1588. ConsumableType: 3,
  1589. WarehouseOutDetailId: warehouseOutInfo.ID,
  1590. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1591. IsSys: 1,
  1592. PatientId: patient_id,
  1593. ProjectId: goods.ProjectId,
  1594. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1595. StorehouseId: goods.StorehouseId,
  1596. OverCount: sum_count,
  1597. }
  1598. UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1599. }
  1600. }
  1601. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1602. goods.Count = deliver_number - stock_number
  1603. ConsumablesDelivery(orgID, patient_id, record_time, goods, warehouseOut, count)
  1604. }
  1605. return nil
  1606. }
  1607. // 耗材出库删除
  1608. func ConsumablesDeliveryDelete(orgID int64, patient_id int64, record_time int64, good_yc *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut) (err error) {
  1609. // 先根据相关信息查询当天该耗材的出库信息
  1610. warehouseOutInfos, err := FindStockOutInfoByStock(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time, patient_id)
  1611. if err != nil {
  1612. return err
  1613. }
  1614. var delete_count int64 = 0
  1615. for _, ware := range warehouseOutInfos {
  1616. // 删除出库完成后,要增加对应批次的库存数量
  1617. errThree := UpDateWarehouseInfoByStockDelete(ware.WarehouseInfotId, delete_count, patient_id, record_time, good_yc.GoodId)
  1618. if errThree != nil {
  1619. return errThree
  1620. }
  1621. //查询剩余库存
  1622. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  1623. goodList, _ := GetAllGoodSumCount(good_yc.GoodId, orgID, houseConfig.StorehouseOutInfo)
  1624. var sum_count int64
  1625. for _, item := range goodList {
  1626. sum_count += item.StockCount
  1627. }
  1628. // 判断当前出库的数据和删除出库数量
  1629. if good_yc.Count <= ware.Count {
  1630. delete_count = good_yc.Count
  1631. } else {
  1632. delete_count = ware.Count
  1633. }
  1634. // 在出库记录表里记录退库详情
  1635. warehouseOutInfo := &models.WarehouseOutInfo{
  1636. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1637. WarehouseOutId: warehouseOut.ID,
  1638. //WarehouseInfoId: warehouse.ID,
  1639. Status: 1,
  1640. Ctime: time.Now().Unix(),
  1641. Remark: "",
  1642. OrgId: orgID,
  1643. Type: 1,
  1644. Manufacturer: 0,
  1645. Dealer: 0,
  1646. IsSys: 2,
  1647. SysRecordTime: record_time,
  1648. GoodTypeId: good_yc.GoodTypeId,
  1649. GoodId: good_yc.GoodId,
  1650. PatientId: patient_id,
  1651. StorehouseId: houseConfig.StorehouseOutInfo,
  1652. OverCount: sum_count,
  1653. }
  1654. warehouseOutInfo.Count = ware.Count - delete_count
  1655. stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1656. warehouseOutInfo.Price = stockInInfo.Price
  1657. errOne := UpdateAutoMaticReduceDetail(good_yc.GoodId, good_yc.GoodTypeId, record_time, patient_id, orgID, warehouseOutInfo)
  1658. if errOne != nil {
  1659. return errOne
  1660. } else {
  1661. details := &models.AutomaticReduceDetail{
  1662. WarehouseOutId: warehouseOutInfo.ID,
  1663. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1664. PatientId: patient_id,
  1665. Ctime: time.Now().Unix(),
  1666. Mtime: time.Now().Unix(),
  1667. Status: 1,
  1668. RecordTime: record_time,
  1669. OrgId: orgID,
  1670. GoodId: good_yc.GoodId,
  1671. GoodTypeId: good_yc.GoodTypeId,
  1672. Count: warehouseOutInfo.Count,
  1673. Type: 2,
  1674. StorehouseId: houseConfig.StorehouseOutInfo,
  1675. }
  1676. //查询是否当天已经存在数据
  1677. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1678. if errcode == gorm.ErrRecordNotFound {
  1679. errTwo := AddSigleAutoReduceRecordInfo(details)
  1680. if errTwo != nil {
  1681. return errTwo
  1682. }
  1683. } else if errcode == nil {
  1684. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1685. AddSigleAutoReduceRecordInfo(details)
  1686. }
  1687. }
  1688. //扣减数量相加
  1689. ModifyAddGoodSumCount(houseConfig.StorehouseOutInfo, delete_count, good_yc.UserOrgId, good_yc.GoodId)
  1690. //退库数量相加
  1691. UpdateSumAddCancelCount(good_yc.UserOrgId, good_yc.GoodId, houseConfig.StorehouseOutInfo, delete_count)
  1692. // 增加了对应的库存后,看看还有多少需要退库的
  1693. good_yc.Count = good_yc.Count - delete_count
  1694. if good_yc.Count == 0 {
  1695. return nil
  1696. }
  1697. }
  1698. if good_yc.Count == 0 {
  1699. return nil
  1700. } else {
  1701. return errors.New("退库和出库数据不匹配")
  1702. }
  1703. }
  1704. func GetAutoReduceRecordInfoByPatientId(orgid int64, patient_id int64, recordTime int64) (autoReduce []*models.AutomaticReduceDetail, err error) {
  1705. err = XTReadDB().Model(&autoReduce).Where("org_id = ? and patient_id = ? and record_time = ? and status = 1", orgid, patient_id, recordTime).Find(&autoReduce).Error
  1706. return autoReduce, err
  1707. }
  1708. func DeleteDialysisBefor(orgid int64, patient_id int64, record_date int64, goodid int64, goodtypeid int64) error {
  1709. prepare := models.DialysisBeforePrepare{}
  1710. err := XTWriteDB().Model(&prepare).Where("user_org_id = ? and patient_id = ? and record_date = ? and status = 1 and good_id = ? and good_type_id = ?", orgid, patient_id, record_date, goodid, goodtypeid).Updates(map[string]interface{}{"status": 0, "count": 0, "mtime": time.Now().Unix()}).Error
  1711. return err
  1712. }
  1713. func DeleteDialysisBeforThree(orgid int64, patient_id int64, record_date int64) error {
  1714. prepare := models.DialysisBeforePrepare{}
  1715. err := XTWriteDB().Model(&prepare).Where("user_org_id = ? and patient_id = ? and record_date = ? and status = 1", orgid, patient_id, record_date).Updates(map[string]interface{}{"status": 0, "count": 0, "mtime": time.Now().Unix()}).Error
  1716. return err
  1717. }
  1718. func GetWarehouseById(id int64) (models.WarehouseOut, error) {
  1719. out := models.WarehouseOut{}
  1720. err := XTReadDB().Where("id=? and status = 1", id).Find(&out).Error
  1721. return out, err
  1722. }
  1723. // 耗材出库
  1724. func ConsumablesDeliveryOne(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64) (err error) {
  1725. ////开事务
  1726. //tx := XTWriteDB().Begin()
  1727. var deliver_number int64 = 0
  1728. var stock_number int64 = 0
  1729. var maxNumber int64 = 0
  1730. deliver_number = goods.Count
  1731. // 根据先进先出原则,查询最先入库的批次,进行出库
  1732. // 如果没有对应的库存,则报错
  1733. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  1734. if err != nil {
  1735. return err
  1736. }
  1737. stock_number = warehouse.StockCount
  1738. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1739. if stock_number >= deliver_number {
  1740. warehouseOutInfo := &models.WarehouseOutInfo{
  1741. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1742. WarehouseOutId: warehouseOut.ID,
  1743. WarehouseInfotId: warehouse.ID,
  1744. Status: 1,
  1745. Ctime: time.Now().Unix(),
  1746. Remark: goods.Remark,
  1747. OrgId: orgID,
  1748. Type: 1,
  1749. Manufacturer: goods.Manufacturer,
  1750. Dealer: goods.Dealer,
  1751. IsSys: 0,
  1752. SysRecordTime: record_time,
  1753. GoodTypeId: goods.GoodTypeId,
  1754. GoodId: goods.GoodId,
  1755. ExpiryDate: goods.ExpiryDate,
  1756. ProductDate: goods.ProductDate,
  1757. Number: warehouse.Number,
  1758. Price: goods.Price,
  1759. LicenseNumber: goods.LicenseNumber,
  1760. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1761. StorehouseId: goods.StorehouseId,
  1762. AdminUserId: goods.AdminUserId,
  1763. BuyPrice: warehouse.Price,
  1764. StockCount: goods.StockCount,
  1765. }
  1766. warehouseOutInfo.Count = goods.Count
  1767. //添加出库单详情
  1768. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1769. if errOne != nil {
  1770. return errOne
  1771. }
  1772. stockFlow := models.VmStockFlow{
  1773. WarehousingId: warehouse.ID,
  1774. GoodId: goods.GoodId,
  1775. Number: warehouse.Number,
  1776. LicenseNumber: goods.LicenseNumber,
  1777. Count: goods.Count,
  1778. UserOrgId: goods.OrgId,
  1779. PatientId: goods.PatientId,
  1780. SystemTime: record_time,
  1781. ConsumableType: 2,
  1782. IsSys: goods.IsSys,
  1783. WarehousingOrder: "",
  1784. WarehouseOutId: warehouseOut.ID,
  1785. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1786. IsEdit: 1,
  1787. CancelStockId: 0,
  1788. CancelOrderNumber: "",
  1789. Manufacturer: goods.Manufacturer,
  1790. Dealer: goods.Dealer,
  1791. Creator: creator,
  1792. UpdateCreator: 0,
  1793. Status: 1,
  1794. Ctime: time.Now().Unix(),
  1795. Mtime: 0,
  1796. Price: warehouse.PackingPrice,
  1797. WarehousingDetailId: 0,
  1798. WarehouseOutDetailId: warehouseOutInfo.ID,
  1799. CancelOutDetailId: 0,
  1800. ProductDate: goods.ProductDate,
  1801. ExpireDate: goods.ExpiryDate,
  1802. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1803. StorehouseId: warehouse.StorehouseId,
  1804. AdminUserId: goods.AdminUserId,
  1805. BuyPrice: warehouse.Price,
  1806. StockCount: goods.StockCount,
  1807. }
  1808. //创建出库流水
  1809. CreateStockFlowOne(stockFlow)
  1810. maxNumber = goods.Count
  1811. if warehouse.StockCount < maxNumber {
  1812. return errors.New("库存数量不足")
  1813. }
  1814. warehouse.StockCount = warehouse.StockCount - maxNumber
  1815. warehouse.Mtime = time.Now().Unix()
  1816. //扣减库存
  1817. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1818. fmt.Println(errThree)
  1819. //if errThree != nil {
  1820. // utils.ErrorLog("事务失败,原因为: %v", errThree.Error())
  1821. // tx.Rollback()
  1822. //} else {
  1823. // tx.Commit()
  1824. //}
  1825. //查询该机构默认仓库
  1826. storeConfig, _ := GetAllStoreHouseConfig(goods.OrgId)
  1827. //查询剩余库存
  1828. goodList, _ := GetGoodSumCountByStoreId(storeConfig.StorehouseOutInfo, goods.GoodId, goods.OrgId)
  1829. var sum_count int64
  1830. var sum_in_count int64
  1831. for _, item := range goodList {
  1832. sum_count += item.StockCount
  1833. sum_in_count += item.WarehousingCount
  1834. }
  1835. UpdateGoodByGoodId(goods.GoodId, sum_count, sum_in_count, goods.OrgId)
  1836. if errThree != nil {
  1837. return errThree
  1838. }
  1839. } else {
  1840. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1841. warehouseOutInfo := &models.WarehouseOutInfo{
  1842. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1843. WarehouseOutId: warehouseOut.ID,
  1844. WarehouseInfotId: warehouse.ID,
  1845. Status: 1,
  1846. Ctime: time.Now().Unix(),
  1847. Remark: goods.Remark,
  1848. OrgId: orgID,
  1849. Type: 1,
  1850. Manufacturer: goods.Manufacturer,
  1851. Dealer: goods.Dealer,
  1852. IsSys: 0,
  1853. SysRecordTime: record_time,
  1854. GoodTypeId: goods.GoodTypeId,
  1855. GoodId: goods.GoodId,
  1856. ExpiryDate: goods.ExpiryDate,
  1857. ProductDate: goods.ProductDate,
  1858. Number: warehouse.Number,
  1859. Price: warehouse.PackingPrice,
  1860. LicenseNumber: goods.LicenseNumber,
  1861. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1862. StorehouseId: warehouse.StorehouseId,
  1863. AdminUserId: goods.AdminUserId,
  1864. BuyPrice: warehouse.Price,
  1865. StockCount: goods.StockCount,
  1866. IsCheck: 1,
  1867. }
  1868. warehouseOutInfo.Count = stock_number
  1869. //查询是否已经生成出库单
  1870. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  1871. if errcodes == gorm.ErrRecordNotFound {
  1872. //创建出库单
  1873. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1874. if errOne != nil {
  1875. return errOne
  1876. }
  1877. } else {
  1878. warehouseOutInfo.Count = info.Count + stock_number
  1879. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  1880. }
  1881. stockFlow := models.VmStockFlow{
  1882. WarehousingId: warehouse.ID,
  1883. GoodId: goods.GoodId,
  1884. Number: warehouse.Number,
  1885. LicenseNumber: goods.LicenseNumber,
  1886. Count: stock_number,
  1887. UserOrgId: goods.OrgId,
  1888. PatientId: 0,
  1889. SystemTime: record_time,
  1890. ConsumableType: 2,
  1891. IsSys: 0,
  1892. WarehousingOrder: "",
  1893. WarehouseOutId: warehouseOut.ID,
  1894. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1895. IsEdit: 1,
  1896. CancelStockId: 0,
  1897. CancelOrderNumber: "",
  1898. Manufacturer: goods.Manufacturer,
  1899. Dealer: goods.Dealer,
  1900. Creator: creator,
  1901. UpdateCreator: 0,
  1902. Status: 1,
  1903. Ctime: time.Now().Unix(),
  1904. Mtime: 0,
  1905. Price: warehouse.PackingPrice,
  1906. WarehousingDetailId: 0,
  1907. WarehouseOutDetailId: warehouseOutInfo.ID,
  1908. CancelOutDetailId: 0,
  1909. ProductDate: goods.ProductDate,
  1910. ExpireDate: goods.ExpiryDate,
  1911. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  1912. StorehouseId: goods.StorehouseId,
  1913. AdminUserId: goods.AdminUserId,
  1914. BuyPrice: warehouse.Price,
  1915. StockCount: goods.StockCount,
  1916. }
  1917. //创建出库明细
  1918. CreateStockFlowOne(stockFlow)
  1919. //查询该机构默认仓库
  1920. storeConfig, _ := GetAllStoreHouseConfig(goods.OrgId)
  1921. //查询剩余库存
  1922. goodList, _ := GetGoodSumCountByStoreId(storeConfig.StorehouseOutInfo, goods.GoodId, goods.OrgId)
  1923. var sum_count int64
  1924. var sum_in_count int64
  1925. for _, item := range goodList {
  1926. sum_count += item.StockCount
  1927. sum_in_count += item.WarehousingCount
  1928. }
  1929. UpdateGoodByGoodId(goods.GoodId, sum_count, sum_in_count, goods.OrgId)
  1930. // 出库完成后,要将该批次库存清零
  1931. warehouse.StockCount = 0
  1932. warehouse.Mtime = time.Now().Unix()
  1933. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1934. fmt.Println(errThree)
  1935. //if errThree != nil {
  1936. // utils.ErrorLog("事务失败,原因为: %v", errThree.Error())
  1937. // tx.Rollback()
  1938. //} else {
  1939. // tx.Commit()
  1940. //}
  1941. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1942. goods.Count = deliver_number - stock_number
  1943. ConsumablesDeliveryOne(orgID, record_time, goods, warehouseOut, count, creator)
  1944. }
  1945. return nil
  1946. }
  1947. // 退库逻辑
  1948. func ConsumablesDeliveryTwo(orgID int64, goods *models.WarehouseOutInfo, count int64) (err error) {
  1949. ////开事务
  1950. //tx := XTWriteDB().Begin()
  1951. var deliver_number int64 = 0
  1952. var stock_number int64 = 0
  1953. var maxNumber int64 = 0
  1954. deliver_number = goods.Count
  1955. // 根据先进先出原则,查询最先入库的批次,进行出库
  1956. warehouse, err := FindFirstWarehousingInfoByGoodId(goods.GoodId, goods.ID, goods.StorehouseId)
  1957. if err != nil {
  1958. return err
  1959. }
  1960. stock_number = warehouse.StockCount
  1961. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1962. if stock_number >= deliver_number {
  1963. warehouseOutInfo := &models.WarehouseOutInfo{
  1964. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  1965. WarehouseOutId: goods.ID,
  1966. WarehouseInfotId: warehouse.ID,
  1967. Status: 1,
  1968. Ctime: time.Now().Unix(),
  1969. Remark: goods.Remark,
  1970. OrgId: orgID,
  1971. Type: 1,
  1972. Manufacturer: goods.Manufacturer,
  1973. Dealer: goods.Dealer,
  1974. IsSys: 0,
  1975. GoodTypeId: goods.GoodTypeId,
  1976. GoodId: goods.GoodId,
  1977. ExpiryDate: goods.ExpiryDate,
  1978. ProductDate: goods.ProductDate,
  1979. Number: goods.Number,
  1980. Price: warehouse.PackingPrice,
  1981. LicenseNumber: goods.LicenseNumber,
  1982. ConsumableType: 2,
  1983. }
  1984. warehouseOutInfo.Count = goods.Count
  1985. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1986. if errOne != nil {
  1987. return errOne
  1988. }
  1989. maxNumber = goods.Count
  1990. if warehouse.StockCount < maxNumber { //这段逻辑根本不会执行,因为当库存数量大于或等于出库数量才会进入这个分支
  1991. return errors.New("库存数量不足")
  1992. }
  1993. warehouse.StockCount = warehouse.StockCount - maxNumber
  1994. warehouse.Mtime = time.Now().Unix()
  1995. if warehouse.StockCount <= 0 {
  1996. return errors.New("库存数量不足")
  1997. }
  1998. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1999. fmt.Println(errThree)
  2000. //if errThree != nil {
  2001. // utils.ErrorLog("事务失败,原因为: %v", err.Error())
  2002. // tx.Rollback()
  2003. //} else {
  2004. // tx.Commit()
  2005. //}
  2006. return
  2007. } else {
  2008. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2009. warehouseOutInfo := &models.WarehouseOutInfo{
  2010. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  2011. WarehouseOutId: goods.ID,
  2012. WarehouseInfotId: warehouse.ID,
  2013. Status: 1,
  2014. Ctime: time.Now().Unix(),
  2015. Remark: goods.Remark,
  2016. OrgId: orgID,
  2017. Type: 1,
  2018. Manufacturer: goods.Manufacturer,
  2019. Dealer: goods.Dealer,
  2020. IsSys: 0,
  2021. GoodTypeId: goods.GoodTypeId,
  2022. GoodId: goods.GoodId,
  2023. ExpiryDate: goods.ExpiryDate,
  2024. ProductDate: goods.ProductDate,
  2025. Number: goods.Number,
  2026. Price: warehouse.PackingPrice,
  2027. LicenseNumber: goods.LicenseNumber,
  2028. ConsumableType: 2,
  2029. IsCheck: 1,
  2030. StorehouseId: goods.StorehouseId,
  2031. }
  2032. warehouseOutInfo.Count = stock_number
  2033. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2034. if errOne != nil {
  2035. return errOne
  2036. }
  2037. // 出库完成后,要将该批次库存清零
  2038. warehouse.StockCount = 0
  2039. warehouse.Mtime = time.Now().Unix()
  2040. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2041. //if errThree != nil {
  2042. // utils.ErrorLog("事务失败,原因为: %v", err.Error())
  2043. // tx.Rollback()
  2044. //} else {
  2045. // tx.Commit()
  2046. //}
  2047. fmt.Println(errThree)
  2048. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2049. goods.Count = deliver_number - stock_number
  2050. ConsumablesDeliveryTwo(orgID, goods, count)
  2051. }
  2052. return nil
  2053. }
  2054. func DeleteWarehouseInfo(id int64) error {
  2055. err := XTWriteDB().Model(models.WarehousingInfo{}).Where("id = ? and status = 1", id).Updates(map[string]interface{}{"stock_count": 0}).Error
  2056. return err
  2057. }
  2058. // 药品出库 递归方式
  2059. func NewDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) {
  2060. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  2061. var deliver_number int64 = 0
  2062. var stock_number int64 = 0
  2063. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  2064. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  2065. var drug_price float64
  2066. //按最小单位数据计算
  2067. deliver_number = count
  2068. if advice.PrescribingNumberUnit == drup.MaxUnit {
  2069. drug_price = drup.RetailPrice
  2070. }
  2071. if advice.PrescribingNumberUnit == drup.MinUnit {
  2072. drug_price = drup.MinPrice
  2073. }
  2074. if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit {
  2075. drug_price = drup.RetailPrice
  2076. }
  2077. // 根据先进先出原则,查询最先入库的批次,进行出库
  2078. // 如果没有对应的库存,则报错
  2079. //查询默认仓库
  2080. storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId)
  2081. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2082. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  2083. var stockMax int64
  2084. var stockMin int64
  2085. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  2086. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  2087. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  2088. UpdateMinNumber(lastWarehouse.ID, stockMin)
  2089. }
  2090. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2091. if err != nil {
  2092. return err
  2093. }
  2094. // 将该批次的剩余库存数量转换为拆零数量
  2095. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2096. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2097. if stock_number >= deliver_number {
  2098. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2099. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2100. WarehouseOutId: warehouseout.ID,
  2101. Status: 1,
  2102. Ctime: time.Now().Unix(),
  2103. Remark: warehouse.Remark,
  2104. OrgId: orgID,
  2105. Type: 1,
  2106. Manufacturer: warehouse.Manufacturer,
  2107. Dealer: warehouse.Dealer,
  2108. IsSys: 1,
  2109. SysRecordTime: advice.RecordDate,
  2110. DrugId: advice.DrugId,
  2111. Number: warehouse.Number,
  2112. BatchNumber: warehouse.BatchNumber,
  2113. Price: warehouse.RetailPrice,
  2114. CountUnit: drup.MinUnit,
  2115. RetailPrice: drug_price,
  2116. ProductDate: warehouse.ProductDate,
  2117. ExpiryDate: warehouse.ExpiryDate,
  2118. PatientId: advice.PatientId,
  2119. Count: deliver_number, //出最小单位
  2120. WarehouseInfoId: warehouse.ID,
  2121. AdviceId: advice.ID,
  2122. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2123. StorehouseId: storeConfig.DrugStorehouseOut,
  2124. IsCheck: 1,
  2125. }
  2126. drugflow := models.DrugFlow{
  2127. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2128. WarehouseOutId: warehouseout.ID,
  2129. DrugId: advice.DrugId,
  2130. Number: warehouse.Number,
  2131. ProductDate: warehouse.ProductDate,
  2132. ExpireDate: warehouse.ExpiryDate,
  2133. Count: deliver_number, //按最小单位计算,
  2134. Price: warehouse.RetailPrice,
  2135. Status: 1,
  2136. Ctime: time.Now().Unix(),
  2137. UserOrgId: orgID,
  2138. Manufacturer: warehouse.Manufacturer,
  2139. Dealer: warehouse.Dealer,
  2140. BatchNumber: warehouse.BatchNumber,
  2141. MaxUnit: drup.MinUnit,
  2142. ConsumableType: 3,
  2143. IsEdit: 1,
  2144. Creator: advice.ExecutionStaff,
  2145. IsSys: 1,
  2146. PatientId: advice.PatientId,
  2147. WarehousingDetailId: warehouse.ID,
  2148. AdviceId: advice.ID,
  2149. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2150. StorehouseId: storeConfig.DrugStorehouseOut,
  2151. }
  2152. CreateDrugFlowOne(drugflow)
  2153. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2154. if errOne != nil {
  2155. return errOne
  2156. }
  2157. //查询是否存在数据
  2158. details := &models.DrugAutomaticReduceDetail{
  2159. WarehouseOutId: warehouseout.ID,
  2160. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2161. PatientId: advice.PatientId,
  2162. Ctime: time.Now().Unix(),
  2163. Mtime: time.Now().Unix(),
  2164. Status: 1,
  2165. RecordTime: advice.RecordDate,
  2166. OrgId: orgID,
  2167. DrugId: advice.DrugId,
  2168. Count: deliver_number,
  2169. CountUnit: drup.MinUnit,
  2170. WarehouseInfoId: warehouse.ID,
  2171. StorehouseId: storeConfig.DrugStorehouseOut,
  2172. }
  2173. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2174. if errTwo != nil {
  2175. return errTwo
  2176. }
  2177. // 出库完成后,要减去对应批次的库存数量
  2178. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  2179. var maxNumber int64 = 0
  2180. var minNumber int64 = 0
  2181. //var stock_max_number int64 = 0
  2182. //stock_max_number = warehouse.StockMaxNumber
  2183. maxNumber = deliver_number / drup.MinNumber
  2184. minNumber = deliver_number % drup.MinNumber
  2185. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  2186. minNumber = maxNumber
  2187. }
  2188. if drup.MaxUnit != drup.MinUnit {
  2189. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  2190. return errors.New("库存数量不足")
  2191. }
  2192. }
  2193. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2194. if warehouse.StockMaxNumber < 0 {
  2195. warehouse.StockMaxNumber = 0
  2196. }
  2197. if warehouse.StockMinNumber < 0 {
  2198. warehouse.StockMinNumber = 0
  2199. }
  2200. warehouse.Mtime = time.Now().Unix()
  2201. if warehouse.StockMinNumber < minNumber {
  2202. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2203. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2204. } else {
  2205. if minNumber > 0 {
  2206. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2207. }
  2208. if minNumber == 0 && maxNumber != 1 {
  2209. if warehouse.StockMinNumber > 0 {
  2210. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  2211. }
  2212. }
  2213. }
  2214. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  2215. if (warehouse.StockMinNumber - deliver_number) > 0 {
  2216. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  2217. //if warehouse.StockMinNumber == 0 {
  2218. // warehouse.StockMaxNumber = stock_max_number
  2219. //}
  2220. }
  2221. }
  2222. if drup.MaxUnit != drup.MinUnit {
  2223. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  2224. return errors.New("库存数量不足")
  2225. }
  2226. }
  2227. if warehouse.StockMinNumber <= 0 {
  2228. warehouse.StockMinNumber = 0
  2229. }
  2230. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2231. if errThree != nil {
  2232. return errThree
  2233. }
  2234. return nil
  2235. } else {
  2236. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2237. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2238. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2239. WarehouseOutId: warehouseout.ID,
  2240. Status: 1,
  2241. Ctime: time.Now().Unix(),
  2242. Remark: warehouse.Remark,
  2243. OrgId: orgID,
  2244. Type: 1,
  2245. Manufacturer: warehouse.Manufacturer,
  2246. Dealer: warehouse.Dealer,
  2247. IsSys: 1,
  2248. SysRecordTime: advice.RecordDate,
  2249. DrugId: advice.DrugId,
  2250. Number: warehouse.Number,
  2251. BatchNumber: warehouse.BatchNumber,
  2252. Price: warehouse.RetailPrice,
  2253. CountUnit: drup.MinUnit,
  2254. ProductDate: warehouse.ProductDate,
  2255. ExpiryDate: warehouse.ExpiryDate,
  2256. PatientId: advice.PatientId,
  2257. Count: deliver_number,
  2258. WarehouseInfoId: warehouse.ID,
  2259. AdviceId: advice.ID,
  2260. StorehouseId: storeConfig.DrugStorehouseOut,
  2261. IsCheck: 1,
  2262. }
  2263. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2264. if errOne != nil {
  2265. return errOne
  2266. }
  2267. details := &models.DrugAutomaticReduceDetail{
  2268. WarehouseOutId: warehouseout.ID,
  2269. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  2270. PatientId: advice.PatientId,
  2271. Ctime: time.Now().Unix(),
  2272. Mtime: time.Now().Unix(),
  2273. Status: 1,
  2274. RecordTime: advice.RecordDate,
  2275. OrgId: orgID,
  2276. DrugId: advice.DrugId,
  2277. Count: deliver_number,
  2278. CountUnit: drup.MinUnit,
  2279. WarehouseInfoId: warehouse.ID,
  2280. StorehouseId: storeConfig.DrugStorehouseOut,
  2281. }
  2282. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2283. if errTwo != nil {
  2284. return errTwo
  2285. }
  2286. // 出库完成后,要将该批次库存清零
  2287. warehouse.StockMaxNumber = 0
  2288. warehouse.StockMinNumber = 0
  2289. warehouse.Mtime = time.Now().Unix()
  2290. info := models.XtDrugWarehouseInfo{
  2291. ID: warehouse.ID,
  2292. WarehousingId: warehouse.WarehousingId,
  2293. DrugId: warehouse.DrugId,
  2294. Number: warehouse.Number,
  2295. ProductDate: warehouse.ProductDate,
  2296. ExpiryDate: warehouse.ExpiryDate,
  2297. WarehousingCount: warehouse.WarehousingCount,
  2298. Price: warehouse.Price,
  2299. TotalPrice: warehouse.TotalPrice,
  2300. Dealer: warehouse.Dealer,
  2301. Manufacturer: warehouse.Manufacturer,
  2302. Remark: warehouse.Remark,
  2303. Ctime: warehouse.Ctime,
  2304. Mtime: warehouse.Mtime,
  2305. Status: 1,
  2306. OrgId: warehouse.OrgId,
  2307. IsReturn: warehouse.IsReturn,
  2308. WarehousingOrder: warehouse.WarehousingOrder,
  2309. Type: warehouse.Type,
  2310. RetailPrice: warehouse.RetailPrice,
  2311. RetailTotalPrice: warehouse.RetailPrice,
  2312. StockMaxNumber: 0,
  2313. StockMinNumber: 0,
  2314. BatchNumber: warehouse.BatchNumber,
  2315. MaxUnit: warehouse.MaxUnit,
  2316. WarehousingInfoId: warehouse.WarehousingInfoId,
  2317. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2318. StorehouseId: storeConfig.DrugStorehouseOut,
  2319. IsCheck: 1,
  2320. }
  2321. //扣减库存
  2322. errThree := UpDateDrugWarehouseInfoByStock(&info)
  2323. if errThree != nil {
  2324. return errThree
  2325. }
  2326. drugflow := models.DrugFlow{
  2327. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2328. WarehouseOutId: warehouseout.ID,
  2329. DrugId: advice.DrugId,
  2330. Number: warehouse.Number,
  2331. ProductDate: warehouse.ProductDate,
  2332. ExpireDate: warehouse.ExpiryDate,
  2333. Count: deliver_number,
  2334. Price: warehouse.RetailPrice,
  2335. Status: 1,
  2336. Ctime: time.Now().Unix(),
  2337. UserOrgId: orgID,
  2338. Manufacturer: warehouse.Manufacturer,
  2339. Dealer: warehouse.Dealer,
  2340. BatchNumber: warehouse.BatchNumber,
  2341. MaxUnit: drup.MinUnit,
  2342. ConsumableType: 3,
  2343. IsEdit: 1,
  2344. Creator: advice.ExecutionStaff,
  2345. IsSys: 1,
  2346. PatientId: advice.PatientId,
  2347. WarehousingDetailId: warehouse.ID,
  2348. AdviceId: advice.ID,
  2349. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2350. StorehouseId: storeConfig.DrugStorehouseOut,
  2351. }
  2352. CreateDrugFlowOne(drugflow)
  2353. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2354. prescribingNumber_two_temp := deliver_number - stock_number
  2355. overPlusNumber := float64(prescribingNumber_two_temp)
  2356. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  2357. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  2358. NewDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  2359. }
  2360. return
  2361. }
  2362. // 药品出库 递归方式
  2363. func NewHisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  2364. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  2365. var deliver_number int64 = 0
  2366. var stock_number int64 = 0
  2367. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  2368. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  2369. deliver_number = count
  2370. var min_price float64
  2371. if advice.PrescribingNumberUnit == drup.MaxUnit {
  2372. min_price = drup.RetailPrice
  2373. }
  2374. if advice.PrescribingNumberUnit == drup.MinUnit {
  2375. min_price = drup.MinPrice
  2376. }
  2377. if advice.PrescribingNumberUnit != drup.MaxUnit && advice.PrescribingNumberUnit != drup.MinUnit {
  2378. min_price = drup.RetailPrice
  2379. }
  2380. fmt.Println(min_price)
  2381. // 根据先进先出原则,查询最先入库的批次,进行出库
  2382. // 如果没有对应的库存,则报错
  2383. //开启事物
  2384. storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId)
  2385. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2386. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  2387. var stockMax int64
  2388. var stockMin int64
  2389. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  2390. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  2391. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  2392. UpdateMinNumber(lastWarehouse.ID, stockMin)
  2393. }
  2394. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2395. //查找药品信息
  2396. if err != nil {
  2397. return err
  2398. }
  2399. // 将该批次的剩余库存数量转换为拆零数量
  2400. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2401. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2402. if stock_number >= deliver_number {
  2403. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2404. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2405. WarehouseOutId: warehouseout.ID,
  2406. Status: 1,
  2407. Ctime: time.Now().Unix(),
  2408. Remark: warehouse.Remark,
  2409. OrgId: orgID,
  2410. Type: 1,
  2411. Manufacturer: warehouse.Manufacturer,
  2412. Dealer: warehouse.Dealer,
  2413. IsSys: 1,
  2414. SysRecordTime: advice.RecordDate,
  2415. DrugId: advice.DrugId,
  2416. Number: warehouse.Number,
  2417. BatchNumber: warehouse.BatchNumber,
  2418. Price: warehouse.RetailPrice,
  2419. CountUnit: drup.MinUnit,
  2420. RetailPrice: warehouse.RetailPrice,
  2421. ProductDate: warehouse.ProductDate,
  2422. ExpiryDate: warehouse.ExpiryDate,
  2423. PatientId: advice.PatientId,
  2424. WarehouseInfoId: warehouse.ID,
  2425. Count: deliver_number,
  2426. AdviceId: advice.ID,
  2427. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2428. StorehouseId: storeConfig.DrugStorehouseOut,
  2429. IsCheck: 1,
  2430. }
  2431. drugflow := models.DrugFlow{
  2432. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2433. WarehouseOutId: warehouseout.ID,
  2434. DrugId: advice.DrugId,
  2435. Number: warehouse.Number,
  2436. ProductDate: warehouse.ProductDate,
  2437. ExpireDate: warehouse.ExpiryDate,
  2438. Count: deliver_number,
  2439. Price: warehouse.RetailPrice,
  2440. Status: 1,
  2441. Ctime: time.Now().Unix(),
  2442. UserOrgId: orgID,
  2443. Manufacturer: warehouse.Manufacturer,
  2444. Dealer: warehouse.Dealer,
  2445. BatchNumber: warehouse.BatchNumber,
  2446. MaxUnit: drup.MinUnit,
  2447. ConsumableType: 3,
  2448. IsEdit: 1,
  2449. Creator: advice.ExecutionStaff,
  2450. IsSys: 1,
  2451. PatientId: advice.PatientId,
  2452. SystemTime: advice.RecordDate,
  2453. WarehousingDetailId: warehouse.ID,
  2454. AdviceId: advice.ID,
  2455. StorehouseId: storeConfig.DrugStorehouseOut,
  2456. }
  2457. CreateDrugFlowOne(drugflow)
  2458. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2459. if errOne != nil {
  2460. return errOne
  2461. }
  2462. details := &models.DrugAutomaticReduceDetail{
  2463. WarehouseOutId: warehouseout.ID,
  2464. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2465. PatientId: advice.PatientId,
  2466. Ctime: time.Now().Unix(),
  2467. Mtime: time.Now().Unix(),
  2468. Status: 1,
  2469. RecordTime: advice.RecordDate,
  2470. OrgId: orgID,
  2471. DrugId: advice.DrugId,
  2472. Count: deliver_number,
  2473. CountUnit: drup.MinUnit,
  2474. WarehouseInfoId: warehouse.ID,
  2475. AdviceId: advice.ID,
  2476. StorehouseId: storeConfig.DrugStorehouseOut,
  2477. }
  2478. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2479. if errTwo != nil {
  2480. return errTwo
  2481. }
  2482. // 出库完成后,要减去对应批次的库存数量
  2483. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  2484. var maxNumber int64 = 0
  2485. var minNumber int64 = 0
  2486. //var stock_max_number int64 = 0
  2487. //stock_max_number = warehouse.StockMaxNumber
  2488. maxNumber = deliver_number / drup.MinNumber
  2489. minNumber = deliver_number % drup.MinNumber
  2490. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  2491. minNumber = maxNumber
  2492. }
  2493. if drup.MaxUnit != drup.MinUnit {
  2494. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  2495. return errors.New("库存数量不足")
  2496. }
  2497. }
  2498. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2499. if warehouse.StockMaxNumber < 0 {
  2500. warehouse.StockMaxNumber = 0
  2501. }
  2502. if warehouse.StockMinNumber < 0 {
  2503. warehouse.StockMinNumber = 0
  2504. }
  2505. warehouse.Mtime = time.Now().Unix()
  2506. if warehouse.StockMinNumber < minNumber {
  2507. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2508. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2509. } else {
  2510. if minNumber > 0 {
  2511. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2512. }
  2513. if minNumber == 0 && maxNumber != 1 {
  2514. if warehouse.StockMinNumber > 0 {
  2515. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  2516. }
  2517. }
  2518. }
  2519. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  2520. if (warehouse.StockMinNumber - deliver_number) > 0 {
  2521. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  2522. //if warehouse.StockMinNumber == 0 {
  2523. // warehouse.StockMaxNumber = stock_max_number
  2524. //}
  2525. }
  2526. }
  2527. if drup.MaxUnit != drup.MinUnit {
  2528. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  2529. return errors.New("库存数量不足")
  2530. }
  2531. }
  2532. if warehouse.StockMinNumber <= 0 {
  2533. warehouse.StockMinNumber = 0
  2534. }
  2535. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2536. if errThree != nil {
  2537. return errThree
  2538. }
  2539. return nil
  2540. } else {
  2541. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2542. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2543. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2544. WarehouseOutId: warehouseout.ID,
  2545. Status: 1,
  2546. Ctime: time.Now().Unix(),
  2547. Remark: warehouse.Remark,
  2548. OrgId: orgID,
  2549. Type: 1,
  2550. Manufacturer: warehouse.Manufacturer,
  2551. Dealer: warehouse.Dealer,
  2552. IsSys: 1,
  2553. SysRecordTime: advice.RecordDate,
  2554. DrugId: advice.DrugId,
  2555. Number: warehouse.Number,
  2556. BatchNumber: warehouse.BatchNumber,
  2557. Price: warehouse.RetailPrice,
  2558. RetailPrice: warehouse.RetailPrice,
  2559. ProductDate: warehouse.ProductDate,
  2560. ExpiryDate: warehouse.ExpiryDate,
  2561. PatientId: advice.PatientId,
  2562. WarehouseInfoId: warehouse.ID,
  2563. Count: stock_number,
  2564. CountUnit: drup.MinUnit,
  2565. AdviceId: advice.ID,
  2566. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2567. StorehouseId: storeConfig.DrugStorehouseOut,
  2568. IsCheck: 1,
  2569. }
  2570. drugflow := models.DrugFlow{
  2571. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2572. WarehouseOutId: warehouseout.ID,
  2573. DrugId: advice.DrugId,
  2574. Number: warehouse.Number,
  2575. ProductDate: warehouse.ProductDate,
  2576. ExpireDate: warehouse.ExpiryDate,
  2577. Count: stock_number,
  2578. Price: warehouse.RetailPrice,
  2579. Status: 1,
  2580. Ctime: time.Now().Unix(),
  2581. UserOrgId: orgID,
  2582. Manufacturer: warehouse.Manufacturer,
  2583. Dealer: warehouse.Dealer,
  2584. BatchNumber: warehouse.BatchNumber,
  2585. MaxUnit: drup.MinUnit,
  2586. ConsumableType: 3,
  2587. IsEdit: 1,
  2588. Creator: advice.ExecutionStaff,
  2589. IsSys: 1,
  2590. PatientId: advice.PatientId,
  2591. SystemTime: advice.RecordDate,
  2592. WarehousingDetailId: warehouse.ID,
  2593. AdviceId: advice.ID,
  2594. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2595. StorehouseId: storeConfig.DrugStorehouseOut,
  2596. }
  2597. CreateDrugFlowOne(drugflow)
  2598. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2599. if errOne != nil {
  2600. return errOne
  2601. }
  2602. details := &models.DrugAutomaticReduceDetail{
  2603. WarehouseOutId: warehouseout.ID,
  2604. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2605. PatientId: advice.PatientId,
  2606. Ctime: time.Now().Unix(),
  2607. Mtime: time.Now().Unix(),
  2608. Status: 1,
  2609. RecordTime: advice.RecordDate,
  2610. OrgId: orgID,
  2611. DrugId: advice.DrugId,
  2612. Count: stock_number,
  2613. CountUnit: drup.MinUnit,
  2614. WarehouseInfoId: warehouse.ID,
  2615. AdviceId: advice.ID,
  2616. StorehouseId: storeConfig.DrugStorehouseOut,
  2617. }
  2618. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2619. if errTwo != nil {
  2620. return errTwo
  2621. }
  2622. info := models.XtDrugWarehouseInfo{
  2623. ID: warehouse.ID,
  2624. WarehousingId: warehouse.WarehousingId,
  2625. DrugId: warehouse.DrugId,
  2626. Number: warehouse.Number,
  2627. ProductDate: warehouse.ProductDate,
  2628. ExpiryDate: warehouse.ExpiryDate,
  2629. WarehousingCount: warehouse.WarehousingCount,
  2630. Price: warehouse.RetailPrice,
  2631. TotalPrice: warehouse.TotalPrice,
  2632. Dealer: warehouse.Dealer,
  2633. Manufacturer: warehouse.Manufacturer,
  2634. Remark: warehouse.Remark,
  2635. Ctime: warehouse.Ctime,
  2636. Mtime: warehouse.Mtime,
  2637. Status: 1,
  2638. OrgId: warehouse.OrgId,
  2639. IsReturn: warehouse.IsReturn,
  2640. WarehousingOrder: warehouse.WarehousingOrder,
  2641. Type: warehouse.Type,
  2642. RetailPrice: warehouse.RetailPrice,
  2643. RetailTotalPrice: warehouse.RetailPrice,
  2644. StockMaxNumber: 0,
  2645. StockMinNumber: 0,
  2646. BatchNumber: warehouse.BatchNumber,
  2647. MaxUnit: warehouse.MaxUnit,
  2648. WarehousingInfoId: warehouse.WarehousingInfoId,
  2649. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  2650. StorehouseId: storeConfig.DrugStorehouseOut,
  2651. IsCheck: 1,
  2652. }
  2653. errThree := UpDateDrugWarehouseInfoByStock(&info)
  2654. if errThree != nil {
  2655. return errThree
  2656. }
  2657. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2658. prescribingNumber_two_temp := deliver_number - stock_number
  2659. overPlusNumber := float64(prescribingNumber_two_temp)
  2660. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  2661. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  2662. NewHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  2663. }
  2664. return
  2665. }
  2666. // 药品出库 递归方式
  2667. func HisAuToReduce(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  2668. //查询最后一次出库数据
  2669. drugInfo, _ := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  2670. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  2671. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  2672. var count_number int64
  2673. var device_number int64
  2674. if advice.PrescribingNumberUnit == drup.MaxUnit {
  2675. device_number = count * drup.MinNumber
  2676. }
  2677. if advice.PrescribingNumberUnit == drup.MinUnit {
  2678. device_number = count
  2679. }
  2680. if drugInfo.CountUnit == drup.MaxUnit {
  2681. count_number = drugInfo.Count * drup.MinNumber
  2682. }
  2683. if drugInfo.CountUnit == drup.MinUnit {
  2684. count_number = drugInfo.Count
  2685. }
  2686. // 比较数据大小
  2687. //如果当期医嘱数量小于最后一次出库则退库
  2688. if device_number < count_number {
  2689. var cha_number int64
  2690. var maxNumber int64
  2691. var minNumber int64
  2692. cha_number = count_number - device_number
  2693. maxNumber = cha_number / drup.MinNumber
  2694. minNumber = cha_number % drup.MinNumber
  2695. //更改库存
  2696. ModifyDrugWarehouse(drugInfo.WarehouseInfoId, maxNumber, minNumber)
  2697. //修改出库表
  2698. info := models.DrugWarehouseOutInfo{
  2699. Count: device_number,
  2700. CountUnit: advice.PrescribingNumberUnit,
  2701. }
  2702. ModifyDrugWarehouseOutInfo(info, advice.DrugId, advice.PatientId, advice.RecordDate)
  2703. //修改自动出库表
  2704. detail := models.DrugAutomaticReduceDetail{
  2705. Count: device_number,
  2706. CountUnit: advice.PrescribingNumberUnit,
  2707. }
  2708. ModifyAutoMaticReduce(detail, advice.PatientId, advice.RecordDate, advice.DrugId)
  2709. //修改流水
  2710. flow := models.DrugFlow{
  2711. Count: device_number,
  2712. MaxUnit: drup.MinUnit,
  2713. }
  2714. ModifyDrugFlow(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId)
  2715. }
  2716. //如果当期医嘱数量大于最后一次出库则需要出库
  2717. if device_number > count_number {
  2718. var cha_number int64
  2719. cha_number = device_number - count_number
  2720. // 根据先进先出原则,查询最先入库的批次,进行出库
  2721. storeConfig, _ := GetAllStoreHouseConfig(advice.UserOrgId)
  2722. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2723. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  2724. var stockMax int64
  2725. var stockMin int64
  2726. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  2727. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  2728. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  2729. UpdateMinNumber(lastWarehouse.ID, stockMin)
  2730. }
  2731. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  2732. //查找药品信息
  2733. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  2734. if err != nil {
  2735. return err
  2736. }
  2737. // 将该批次的剩余库存数量转换为拆零数量
  2738. var stock_number int64
  2739. var maxNumber int64
  2740. var minNumber int64
  2741. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2742. //如果库存数量大于出库数据,正常出库
  2743. if stock_number >= cha_number {
  2744. //扣减库存
  2745. maxNumber = cha_number / drup.MinNumber
  2746. minNumber = cha_number % drup.MinNumber
  2747. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  2748. minNumber = maxNumber
  2749. }
  2750. if drup.MaxUnit != drup.MinUnit {
  2751. if warehouse.StockMaxNumber < maxNumber {
  2752. return errors.New("库存数量不足")
  2753. }
  2754. }
  2755. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2756. if warehouse.StockMaxNumber < 0 {
  2757. warehouse.StockMaxNumber = 0
  2758. }
  2759. warehouse.Mtime = time.Now().Unix()
  2760. if warehouse.StockMinNumber < minNumber {
  2761. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2762. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2763. } else {
  2764. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2765. }
  2766. if drup.MaxUnit != drup.MinUnit {
  2767. if warehouse.StockMaxNumber < 0 {
  2768. return errors.New("库存数量不足")
  2769. }
  2770. }
  2771. //扣减库存232332332332
  2772. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2773. if errThree != nil {
  2774. return errThree
  2775. }
  2776. //修改出库表
  2777. info := models.DrugWarehouseOutInfo{
  2778. Count: device_number,
  2779. CountUnit: advice.PrescribingNumberUnit,
  2780. }
  2781. ModifyDrugWarehouseOutInfoOne(info, advice.DrugId, advice.PatientId, advice.RecordDate, warehouse.ID)
  2782. //修改自动出库表
  2783. detail := models.DrugAutomaticReduceDetail{
  2784. Count: device_number,
  2785. CountUnit: advice.PrescribingNumberUnit,
  2786. }
  2787. ModifyAutoMaticReduceOne(detail, advice.PatientId, advice.RecordDate, advice.DrugId, warehouse.ID)
  2788. //修改流水
  2789. flow := models.DrugFlow{
  2790. Count: device_number,
  2791. MaxUnit: advice.PrescribingNumberUnit,
  2792. }
  2793. ModifyDrugFlowOne(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId, warehouse.ID)
  2794. }
  2795. //如果库存数量小于出库数据,则需要出库到下一个批次
  2796. if stock_number < cha_number {
  2797. //修改出库表
  2798. info := models.DrugWarehouseOutInfo{
  2799. Count: cha_number,
  2800. CountUnit: advice.PrescribingNumberUnit,
  2801. }
  2802. ModifyDrugWarehouseOutInfoOne(info, advice.DrugId, advice.PatientId, advice.RecordDate, warehouse.ID)
  2803. //修改自动出库表
  2804. detail := models.DrugAutomaticReduceDetail{
  2805. Count: cha_number,
  2806. CountUnit: advice.PrescribingNumberUnit,
  2807. }
  2808. ModifyAutoMaticReduceOne(detail, advice.PatientId, advice.RecordDate, advice.DrugId, warehouse.ID)
  2809. //修改流水
  2810. flow := models.DrugFlow{
  2811. Count: cha_number,
  2812. MaxUnit: advice.PrescribingNumberUnit,
  2813. }
  2814. ModifyDrugFlowOne(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId, warehouse.ID)
  2815. druginfo := &models.XtDrugWarehouseInfo{
  2816. ID: warehouse.ID,
  2817. WarehousingId: warehouse.WarehousingId,
  2818. DrugId: warehouse.DrugId,
  2819. Number: warehouse.Number,
  2820. ProductDate: warehouse.ProductDate,
  2821. ExpiryDate: warehouse.ExpiryDate,
  2822. WarehousingCount: warehouse.WarehousingCount,
  2823. Price: warehouse.Price,
  2824. TotalPrice: warehouse.TotalPrice,
  2825. Dealer: warehouse.Dealer,
  2826. Manufacturer: warehouse.Manufacturer,
  2827. Remark: warehouse.Remark,
  2828. Ctime: warehouse.Ctime,
  2829. Mtime: warehouse.Mtime,
  2830. Status: 1,
  2831. OrgId: warehouse.OrgId,
  2832. IsReturn: warehouse.IsReturn,
  2833. WarehousingOrder: warehouse.WarehousingOrder,
  2834. Type: warehouse.Type,
  2835. RetailPrice: warehouse.RetailPrice,
  2836. RetailTotalPrice: warehouse.RetailPrice,
  2837. StockMaxNumber: 0,
  2838. StockMinNumber: 0,
  2839. BatchNumber: warehouse.BatchNumber,
  2840. MaxUnit: warehouse.MaxUnit,
  2841. WarehousingInfoId: warehouse.WarehousingInfoId,
  2842. StorehouseId: storeConfig.DrugStorehouseOut,
  2843. IsCheck: 1,
  2844. }
  2845. errThree := UpDateDrugWarehouseInfoByStock(druginfo)
  2846. if errThree != nil {
  2847. return errThree
  2848. }
  2849. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2850. prescribingNumber_two_temp := cha_number - stock_number
  2851. overPlusNumber := float64(prescribingNumber_two_temp)
  2852. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  2853. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  2854. NewHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  2855. }
  2856. }
  2857. return
  2858. }
  2859. // 采购管理耗材出库逻辑
  2860. func ConsumablesDeliveryNight(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64, warehouse_out_id int64, cancel_out_id int64) (err error) {
  2861. var deliver_number int64 = 0
  2862. var stock_number int64 = 0
  2863. var maxNumber int64 = 0
  2864. deliver_number = goods.Count
  2865. // 根据先进先出原则,查询最先入库的批次,进行出库
  2866. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  2867. // 如果没有对应的库存,则报错
  2868. warehouse, err := FindFirstWarehousingInfoByStockNight(goods.GoodId, goods.GoodTypeId, warehouse_out_id, goods.IsSource, houseConfig.StorehouseOutInfo)
  2869. if err != nil {
  2870. return err
  2871. }
  2872. stock_number = warehouse.StockCount
  2873. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2874. if stock_number >= deliver_number {
  2875. warehouseOutInfo := &models.WarehouseOutInfo{
  2876. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2877. WarehouseOutId: goods.WarehouseOutId,
  2878. WarehouseInfotId: warehouse.ID,
  2879. Status: 1,
  2880. Ctime: time.Now().Unix(),
  2881. Remark: goods.Remark,
  2882. OrgId: orgID,
  2883. Type: 1,
  2884. Manufacturer: goods.Manufacturer,
  2885. Dealer: goods.Dealer,
  2886. IsSys: 0,
  2887. SysRecordTime: record_time,
  2888. GoodTypeId: goods.GoodTypeId,
  2889. GoodId: goods.GoodId,
  2890. ExpiryDate: goods.ExpiryDate,
  2891. ProductDate: goods.ProductDate,
  2892. Number: warehouse.Number,
  2893. Price: goods.Price,
  2894. LicenseNumber: goods.LicenseNumber,
  2895. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2896. StorehouseId: warehouse.StorehouseId,
  2897. IsCheck: 1,
  2898. }
  2899. warehouseOutInfo.Count = goods.Count
  2900. //添加出库单详情
  2901. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2902. if errOne != nil {
  2903. return errOne
  2904. }
  2905. stockFlow := models.VmStockFlow{
  2906. WarehousingId: warehouse.ID,
  2907. GoodId: goods.GoodId,
  2908. Number: warehouse.Number,
  2909. LicenseNumber: goods.LicenseNumber,
  2910. Count: goods.Count,
  2911. UserOrgId: goods.OrgId,
  2912. PatientId: goods.PatientId,
  2913. SystemTime: record_time,
  2914. ConsumableType: 2,
  2915. IsSys: goods.IsSys,
  2916. WarehousingOrder: "",
  2917. WarehouseOutId: goods.WarehouseOutId,
  2918. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2919. IsEdit: 1,
  2920. CancelStockId: 0,
  2921. CancelOrderNumber: "",
  2922. Manufacturer: goods.Manufacturer,
  2923. Dealer: goods.Dealer,
  2924. Creator: creator,
  2925. UpdateCreator: 0,
  2926. Status: 1,
  2927. Ctime: time.Now().Unix(),
  2928. Mtime: 0,
  2929. Price: warehouse.PackingPrice,
  2930. WarehousingDetailId: 0,
  2931. WarehouseOutDetailId: warehouseOutInfo.ID,
  2932. CancelOutDetailId: 0,
  2933. ProductDate: goods.ProductDate,
  2934. ExpireDate: goods.ExpiryDate,
  2935. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2936. SupplyWarehouseId: warehouseOut.SupplyWarehouseId,
  2937. StorehouseId: warehouse.StorehouseId,
  2938. }
  2939. //创建出库流水
  2940. CreateStockFlowOne(stockFlow)
  2941. maxNumber = goods.Count
  2942. if warehouse.StockCount < maxNumber {
  2943. return errors.New("库存数量不足")
  2944. }
  2945. warehouse.StockCount = warehouse.StockCount - maxNumber
  2946. warehouse.Mtime = time.Now().Unix()
  2947. //扣减库存
  2948. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2949. //出库数量增加
  2950. AddGoodSumOutCount(houseConfig.StorehouseOutInfo, warehouse.GoodId, warehouse.OrgId, goods.Count)
  2951. ModifyGoodReduceInformationSix(warehouse.GoodId, maxNumber, warehouse.OrgId, warehouse.PackingPrice)
  2952. if errThree != nil {
  2953. return errThree
  2954. }
  2955. } else {
  2956. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2957. warehouseOutInfo := &models.WarehouseOutInfo{
  2958. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2959. WarehouseOutId: goods.WarehouseOutId,
  2960. WarehouseInfotId: warehouse.ID,
  2961. Status: 1,
  2962. Ctime: time.Now().Unix(),
  2963. Remark: goods.Remark,
  2964. OrgId: orgID,
  2965. Type: 1,
  2966. Manufacturer: goods.Manufacturer,
  2967. Dealer: goods.Dealer,
  2968. IsSys: 0,
  2969. SysRecordTime: record_time,
  2970. GoodTypeId: goods.GoodTypeId,
  2971. GoodId: goods.GoodId,
  2972. ExpiryDate: goods.ExpiryDate,
  2973. ProductDate: goods.ProductDate,
  2974. Number: warehouse.Number,
  2975. Price: warehouse.PackingPrice,
  2976. LicenseNumber: goods.LicenseNumber,
  2977. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2978. StorehouseId: warehouse.StorehouseId,
  2979. IsCheck: 1,
  2980. }
  2981. warehouseOutInfo.Count = stock_number
  2982. //查询是否已经生成出库单
  2983. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  2984. if errcodes == gorm.ErrRecordNotFound {
  2985. //创建出库单
  2986. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2987. if errOne != nil {
  2988. return errOne
  2989. }
  2990. } else {
  2991. warehouseOutInfo.Count = info.Count + stock_number
  2992. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  2993. }
  2994. stockFlow := models.VmStockFlow{
  2995. WarehousingId: warehouse.ID,
  2996. GoodId: goods.GoodId,
  2997. Number: warehouse.Number,
  2998. LicenseNumber: goods.LicenseNumber,
  2999. Count: stock_number,
  3000. UserOrgId: goods.OrgId,
  3001. PatientId: 0,
  3002. SystemTime: record_time,
  3003. ConsumableType: 2,
  3004. IsSys: 0,
  3005. WarehousingOrder: "",
  3006. WarehouseOutId: goods.WarehouseOutId,
  3007. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  3008. IsEdit: 1,
  3009. CancelStockId: 0,
  3010. CancelOrderNumber: "",
  3011. Manufacturer: goods.Manufacturer,
  3012. Dealer: goods.Dealer,
  3013. Creator: creator,
  3014. UpdateCreator: 0,
  3015. Status: 1,
  3016. Ctime: time.Now().Unix(),
  3017. Mtime: 0,
  3018. Price: warehouse.PackingPrice,
  3019. WarehousingDetailId: 0,
  3020. WarehouseOutDetailId: warehouseOutInfo.ID,
  3021. CancelOutDetailId: 0,
  3022. ProductDate: goods.ProductDate,
  3023. ExpireDate: goods.ExpiryDate,
  3024. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  3025. SupplyWarehouseId: warehouseOut.SupplyWarehouseId,
  3026. StorehouseId: warehouse.StorehouseId,
  3027. }
  3028. //创建出库明细
  3029. CreateStockFlowOne(stockFlow)
  3030. // 出库完成后,要将该批次库存清零
  3031. ModifyGoodReduceInformationSix(warehouse.GoodId, warehouse.StockCount, warehouse.OrgId, warehouse.PackingPrice)
  3032. warehouse.StockCount = 0
  3033. warehouse.Mtime = time.Now().Unix()
  3034. errThree := UpDateWarehouseInfoByStock(&warehouse)
  3035. if errThree != nil {
  3036. return errThree
  3037. }
  3038. //出库数量增加
  3039. AddGoodSumOutCount(houseConfig.StorehouseOutInfo, warehouse.GoodId, warehouse.OrgId, warehouse.StockCount)
  3040. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  3041. goods.Count = deliver_number - stock_number
  3042. ConsumablesDeliveryNight(orgID, record_time, goods, warehouseOut, count, creator, warehouse_out_id, cancel_out_id)
  3043. }
  3044. return nil
  3045. }
  3046. func FindFirstWarehousingInfoByStockNight(good_id int64, good_type_id int64, warehouse_out_id int64, is_source int64, storehouse_id int64) (info models.WarehousingInfo, err error) {
  3047. if is_source == 1 {
  3048. err = readDb.Model(&models.WarehousingInfo{}).Where("good_id = ? AND good_type_id = ? AND status = 1 and stock_count > 0 and supply_warehouse_id = ? and storehouse_id = ?", good_id, good_type_id, warehouse_out_id, storehouse_id).Order("ctime").First(&info).Error
  3049. }
  3050. if is_source == 2 || is_source == 0 {
  3051. err = readDb.Model(&models.WarehousingInfo{}).Where("good_id = ? AND good_type_id = ? AND status = 1 and stock_count > 0 and storehouse_id = ?", good_id, good_type_id, storehouse_id).Order("ctime").First(&info).Error
  3052. }
  3053. return info, err
  3054. }
  3055. // 药品出库 递归方式
  3056. func AutoDrugDeliverInfoNight(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo, warehouse_out_id int64, cancel_out_id int64) (err error) {
  3057. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  3058. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  3059. var deliver_number int64 = 0
  3060. var stock_number int64 = 0
  3061. var retail_price float64
  3062. if advice.CountUnit == drup.MaxUnit {
  3063. deliver_number = prescribingNumber * drup.MinNumber
  3064. formatInt := strconv.FormatInt(prescribingNumber, 10)
  3065. floatcount, _ := strconv.ParseFloat(formatInt, 64)
  3066. retail_price = floatcount * advice.Price
  3067. } else {
  3068. deliver_number = prescribingNumber
  3069. formatInt := strconv.FormatInt(prescribingNumber, 10)
  3070. floatcount, _ := strconv.ParseFloat(formatInt, 64)
  3071. retail_price = floatcount * advice.Price
  3072. }
  3073. // 根据先进先出原则,查询最先入库的批次,进行出库
  3074. // 如果没有对应的库存,则报错
  3075. //开启事物
  3076. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, houseConfig.DrugStorehouseOut)
  3077. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  3078. var stockMax int64
  3079. var stockMin int64
  3080. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  3081. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  3082. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  3083. UpdateMinNumber(lastWarehouse.ID, stockMin)
  3084. }
  3085. warehouse, err := FindLastDrugWarehousingInfoByIDSix(advice.DrugId, warehouse_out_id, advice.IsSource, houseConfig.DrugStorehouseOut)
  3086. if err != nil {
  3087. return err
  3088. }
  3089. // 将该批次的剩余库存数量转换为拆零数量
  3090. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  3091. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  3092. if stock_number >= deliver_number {
  3093. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  3094. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  3095. WarehouseOutId: advice.WarehouseOutId,
  3096. Status: 1,
  3097. Ctime: time.Now().Unix(),
  3098. Remark: advice.Remark,
  3099. OrgId: orgID,
  3100. Type: 1,
  3101. Manufacturer: advice.Manufacturer,
  3102. Dealer: warehouse.Dealer,
  3103. IsSys: 0,
  3104. SysRecordTime: advice.SysRecordTime,
  3105. DrugId: advice.DrugId,
  3106. ExpiryDate: advice.ExpiryDate,
  3107. ProductDate: advice.ProductDate,
  3108. Number: advice.Number,
  3109. BatchNumber: warehouse.BatchNumber,
  3110. Count: deliver_number,
  3111. RetailPrice: advice.RetailPrice,
  3112. Price: advice.Price,
  3113. WarehouseInfoId: warehouse.ID,
  3114. CountUnit: drup.MinUnit,
  3115. AdviceId: advice.ID,
  3116. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  3117. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  3118. StorehouseId: warehouse.StorehouseId,
  3119. IsCheck: 1,
  3120. }
  3121. warehouseOutInfo.Count = prescribingNumber
  3122. warehouseOutInfo.CountUnit = advice.CountUnit
  3123. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  3124. if errOne != nil {
  3125. return errOne
  3126. }
  3127. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  3128. drugflow := models.DrugFlow{
  3129. WarehouseOutId: advice.WarehouseOutId,
  3130. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  3131. DrugId: advice.DrugId,
  3132. Number: warehouse.Number,
  3133. ProductDate: advice.ProductDate,
  3134. ExpireDate: advice.ExpiryDate,
  3135. Count: deliver_number,
  3136. Price: warehouse.RetailPrice,
  3137. Status: 1,
  3138. Ctime: time.Now().Unix(),
  3139. UserOrgId: advice.OrgId,
  3140. Manufacturer: advice.Manufacturer,
  3141. Dealer: advice.Dealer,
  3142. BatchNumber: warehouse.BatchNumber,
  3143. MaxUnit: drup.MinUnit,
  3144. ConsumableType: 2,
  3145. IsEdit: 1,
  3146. Creator: 0,
  3147. IsSys: 0,
  3148. WarehouseOutDetailId: drugWareInfo.ID,
  3149. AdviceId: advice.ID,
  3150. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  3151. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  3152. SystemTime: advice.SysRecordTime,
  3153. StorehouseId: warehouse.StorehouseId,
  3154. WarehousingDetailId: warehouse.ID,
  3155. WarehousingId: warehouse.ID,
  3156. RetailPrice: retail_price,
  3157. LastPrice: warehouse.Price,
  3158. }
  3159. CreateDrugFlowOne(drugflow)
  3160. // 出库完成后,要减去对应批次的库存数量
  3161. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  3162. var maxNumber int64 = 0
  3163. var minNumber int64 = 0
  3164. if advice.CountUnit == drup.MinUnit {
  3165. maxNumber = prescribingNumber / drup.MinNumber
  3166. minNumber = prescribingNumber % drup.MinNumber
  3167. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  3168. minNumber = maxNumber
  3169. }
  3170. } else {
  3171. maxNumber = prescribingNumber
  3172. }
  3173. if warehouse.StockMaxNumber < maxNumber {
  3174. return errors.New("库存数量不足")
  3175. }
  3176. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  3177. if warehouse.StockMaxNumber < 0 {
  3178. warehouse.StockMaxNumber = 0
  3179. }
  3180. warehouse.Mtime = time.Now().Unix()
  3181. if warehouse.StockMinNumber < minNumber {
  3182. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  3183. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  3184. } else {
  3185. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  3186. }
  3187. if warehouse.StockMaxNumber < 0 {
  3188. return errors.New("库存数量不足")
  3189. }
  3190. if warehouse.StockMaxNumber == 1 && warehouse.StockMinNumber == 1 && drup.MaxUnit == drup.MinUnit {
  3191. warehouse.StockMinNumber = 0
  3192. }
  3193. if warehouse.StockMaxNumber > 0 {
  3194. var sum_count int64
  3195. sum_count = maxNumber * drup.MinNumber
  3196. ModifyDrugReduceInformationSix(warehouse.DrugId, sum_count, warehouse.OrgId, warehouse.RetailPrice)
  3197. //出库数量增加
  3198. AddDrugSumOutCount(houseConfig.DrugStorehouseOut, sum_count, warehouse.OrgId, warehouse.DrugId)
  3199. }
  3200. if warehouse.StockMinNumber > 0 {
  3201. ModifyDrugReduceInformationSix(warehouse.DrugId, minNumber, warehouse.OrgId, warehouse.RetailPrice)
  3202. //出库数量增加
  3203. AddDrugSumOutCount(houseConfig.DrugStorehouseOut, minNumber, warehouse.OrgId, warehouse.DrugId)
  3204. }
  3205. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  3206. if errThree != nil {
  3207. return errThree
  3208. }
  3209. return nil
  3210. } else {
  3211. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  3212. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  3213. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  3214. WarehouseOutId: advice.WarehouseOutId,
  3215. Status: 1,
  3216. Ctime: time.Now().Unix(),
  3217. Remark: advice.Remark,
  3218. OrgId: orgID,
  3219. Type: 1,
  3220. Manufacturer: advice.Manufacturer,
  3221. Dealer: warehouse.Dealer,
  3222. IsSys: 0,
  3223. SysRecordTime: advice.SysRecordTime,
  3224. DrugId: advice.DrugId,
  3225. ExpiryDate: warehouse.ExpiryDate,
  3226. ProductDate: warehouse.ProductDate,
  3227. Number: warehouse.Number,
  3228. BatchNumber: warehouse.BatchNumber,
  3229. Count: stock_number,
  3230. RetailPrice: advice.RetailPrice,
  3231. Price: advice.Price,
  3232. WarehouseInfoId: warehouse.ID,
  3233. CountUnit: drup.MinUnit,
  3234. AdviceId: advice.ID,
  3235. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  3236. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  3237. StorehouseId: warehouse.StorehouseId,
  3238. IsCheck: 1,
  3239. }
  3240. warehouseOutInfo.Count = stock_number
  3241. //warehouseOutInfo.CountUnit = advice.CountUnit
  3242. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  3243. if errOne != nil {
  3244. return errOne
  3245. }
  3246. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  3247. drugflow := models.DrugFlow{
  3248. WarehouseOutId: advice.WarehouseOutId,
  3249. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  3250. DrugId: advice.DrugId,
  3251. Number: warehouse.Number,
  3252. ProductDate: advice.ProductDate,
  3253. ExpireDate: advice.ExpiryDate,
  3254. Count: stock_number,
  3255. Price: warehouse.RetailPrice,
  3256. Status: 1,
  3257. Ctime: time.Now().Unix(),
  3258. UserOrgId: advice.OrgId,
  3259. Manufacturer: advice.Manufacturer,
  3260. Dealer: advice.Dealer,
  3261. BatchNumber: warehouse.BatchNumber,
  3262. MaxUnit: drup.MinUnit,
  3263. ConsumableType: 2,
  3264. IsEdit: 1,
  3265. Creator: 0,
  3266. IsSys: 0,
  3267. WarehouseOutDetailId: drugWareInfo.ID,
  3268. AdviceId: advice.ID,
  3269. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  3270. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  3271. SystemTime: advice.SysRecordTime,
  3272. StorehouseId: warehouse.StorehouseId,
  3273. WarehousingDetailId: warehouse.ID,
  3274. WarehousingId: warehouse.ID,
  3275. RetailPrice: retail_price,
  3276. LastPrice: warehouse.Price,
  3277. }
  3278. CreateDrugFlowOne(drugflow)
  3279. if warehouse.StockMaxNumber > 0 {
  3280. var sum_count int64
  3281. sum_count = warehouse.StockMaxNumber * drup.MinNumber
  3282. ModifyDrugReduceInformationSix(warehouse.DrugId, sum_count, warehouse.OrgId, warehouse.RetailPrice)
  3283. AddDrugSumOutCount(houseConfig.DrugStorehouseOut, sum_count, warehouse.OrgId, warehouse.DrugId)
  3284. }
  3285. if warehouse.StockMinNumber > 0 {
  3286. ModifyDrugReduceInformationSix(warehouse.DrugId, warehouse.StockMinNumber, warehouse.OrgId, warehouse.RetailPrice)
  3287. AddDrugSumOutCount(houseConfig.DrugStorehouseOut, warehouse.StockMinNumber, warehouse.OrgId, warehouse.DrugId)
  3288. }
  3289. // 出库完成后,要将该批次库存清零
  3290. warehouse.StockMaxNumber = 0
  3291. warehouse.StockMinNumber = 0
  3292. warehouse.Mtime = time.Now().Unix()
  3293. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  3294. if errThree != nil {
  3295. return errThree
  3296. }
  3297. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  3298. prescribingNumber_two_temp := deliver_number - stock_number
  3299. advice.CountUnit = drup.MinUnit
  3300. AutoDrugDeliverInfoNight(orgID, prescribingNumber_two_temp, warehouseout, drup, advice, warehouse_out_id, cancel_out_id)
  3301. }
  3302. return
  3303. }
  3304. // 调拨出库逻辑
  3305. func ConsumablesDeliveryTwelve(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64, warehouseInfo *models.WarehousingInfo) (err error) {
  3306. var deliver_number int64 = 0
  3307. var stock_number int64 = 0
  3308. var maxNumber int64 = 0
  3309. deliver_number = goods.Count
  3310. // 根据先进先出原则,查询最先入库的批次,进行出库
  3311. // 如果没有对应的库存,则报错
  3312. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  3313. if err != nil {
  3314. return err
  3315. }
  3316. stock_number = warehouse.StockCount
  3317. maxNumber = goods.Count
  3318. //if warehouse.StockCount < maxNumber {
  3319. // return errors.New("库存数量不足")
  3320. //}
  3321. if warehouse.StockCount-maxNumber >= 0 {
  3322. warehouse.StockCount = warehouse.StockCount - maxNumber
  3323. } else {
  3324. warehouse.StockCount = warehouse.StockCount
  3325. }
  3326. warehouse.Mtime = time.Now().Unix()
  3327. //扣减库存
  3328. errThree := UpDateWarehouseInfoByStock(&warehouse)
  3329. //查询剩余库存
  3330. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  3331. var sum_count int64
  3332. for _, item := range goodList {
  3333. sum_count += item.StockCount
  3334. }
  3335. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  3336. if stock_number >= deliver_number {
  3337. warehouseOutInfo := &models.WarehouseOutInfo{
  3338. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  3339. WarehouseOutId: goods.WarehouseOutId,
  3340. WarehouseInfotId: warehouse.ID,
  3341. Status: 1,
  3342. Ctime: time.Now().Unix(),
  3343. Remark: goods.Remark,
  3344. OrgId: orgID,
  3345. Type: 1,
  3346. Manufacturer: warehouse.Manufacturer,
  3347. Dealer: warehouse.Dealer,
  3348. IsSys: 0,
  3349. SysRecordTime: record_time,
  3350. GoodTypeId: warehouse.GoodTypeId,
  3351. GoodId: warehouse.GoodId,
  3352. ExpiryDate: warehouse.ExpiryDate,
  3353. ProductDate: warehouse.ProductDate,
  3354. Number: warehouse.Number,
  3355. Price: warehouse.PackingPrice,
  3356. LicenseNumber: warehouse.LicenseNumber,
  3357. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3358. StorehouseId: goods.StorehouseId,
  3359. SecondWarehouseInfoId: goods.SecondWarehouseInfoId,
  3360. IsCheck: 1,
  3361. OverCount: sum_count,
  3362. }
  3363. warehouseOutInfo.Count = goods.Count
  3364. //添加出库单详情
  3365. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  3366. if errOne != nil {
  3367. return errOne
  3368. }
  3369. stockFlow := models.VmStockFlow{
  3370. WarehousingId: warehouse.ID,
  3371. GoodId: goods.GoodId,
  3372. Number: warehouse.Number,
  3373. LicenseNumber: goods.LicenseNumber,
  3374. Count: goods.Count,
  3375. UserOrgId: goods.OrgId,
  3376. PatientId: goods.PatientId,
  3377. SystemTime: record_time,
  3378. ConsumableType: 12,
  3379. IsSys: goods.IsSys,
  3380. WarehousingOrder: "",
  3381. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  3382. WarehouseOutId: goods.WarehouseOutId,
  3383. IsEdit: 1,
  3384. CancelStockId: 0,
  3385. CancelOrderNumber: "",
  3386. Manufacturer: warehouse.Manufacturer,
  3387. Dealer: warehouse.Dealer,
  3388. Creator: creator,
  3389. UpdateCreator: 0,
  3390. Status: 1,
  3391. Ctime: time.Now().Unix(),
  3392. Mtime: 0,
  3393. Price: warehouse.PackingPrice,
  3394. WarehousingDetailId: 0,
  3395. WarehouseOutDetailId: warehouseOutInfo.ID,
  3396. CancelOutDetailId: 0,
  3397. ProductDate: warehouse.ProductDate,
  3398. ExpireDate: warehouse.ExpiryDate,
  3399. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3400. StorehouseId: warehouse.StorehouseId,
  3401. SecondWarehouseInfoId: goods.SecondWarehouseInfoId,
  3402. OverCount: sum_count,
  3403. }
  3404. //创建出库流水
  3405. CreateStockFlowOne(stockFlow)
  3406. //入库
  3407. warehouseInfo := &models.WarehousingInfo{
  3408. WarehousingOrder: warehouseInfo.WarehousingOrder,
  3409. WarehousingId: warehouseInfo.WarehousingId,
  3410. GoodId: warehouse.GoodId,
  3411. Number: warehouse.Number,
  3412. GoodTypeId: warehouse.GoodTypeId,
  3413. ProductDate: warehouse.ProductDate,
  3414. ExpiryDate: warehouse.ExpiryDate,
  3415. WarehousingCount: goods.Count,
  3416. Price: warehouse.Price,
  3417. TotalPrice: 0,
  3418. Status: 1,
  3419. Ctime: warehouse.Ctime,
  3420. Remark: goods.Remark,
  3421. OrgId: warehouse.OrgId,
  3422. Type: 1,
  3423. Manufacturer: warehouse.Manufacturer,
  3424. StockCount: goods.Count,
  3425. Dealer: warehouse.Dealer,
  3426. LicenseNumber: "",
  3427. PackingPrice: warehouse.PackingPrice,
  3428. StorehouseId: warehouseInfo.StorehouseId,
  3429. SecondWarehouseInfoId: warehouseInfo.SecondWarehouseInfoId,
  3430. IsCheck: 1,
  3431. }
  3432. AddWarehosingInfo(warehouseInfo)
  3433. stockInfoFlow := models.VmStockFlow{
  3434. WarehousingId: warehouseInfo.WarehousingId,
  3435. GoodId: goods.GoodId,
  3436. Number: warehouse.Number,
  3437. LicenseNumber: goods.LicenseNumber,
  3438. Count: goods.Count,
  3439. UserOrgId: goods.OrgId,
  3440. PatientId: goods.PatientId,
  3441. SystemTime: record_time,
  3442. ConsumableType: 13,
  3443. IsSys: goods.IsSys,
  3444. WarehousingOrder: warehouseInfo.WarehousingOrder,
  3445. WarehouseOutId: 0,
  3446. WarehouseOutOrderNumber: "",
  3447. IsEdit: 1,
  3448. CancelStockId: 0,
  3449. CancelOrderNumber: "",
  3450. Manufacturer: warehouse.Manufacturer,
  3451. Dealer: warehouse.Dealer,
  3452. Creator: creator,
  3453. UpdateCreator: 0,
  3454. Status: 1,
  3455. Ctime: time.Now().Unix(),
  3456. Mtime: 0,
  3457. Price: warehouse.Price,
  3458. WarehousingDetailId: 0,
  3459. WarehouseOutDetailId: warehouseOutInfo.ID,
  3460. CancelOutDetailId: 0,
  3461. ProductDate: warehouse.ProductDate,
  3462. ExpireDate: warehouse.ExpiryDate,
  3463. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3464. StorehouseId: warehouseInfo.StorehouseId,
  3465. SecondWarehouseInfoId: warehouseInfo.SecondWarehouseInfoId,
  3466. }
  3467. //创建入库流水
  3468. CreateStockFlowOne(stockInfoFlow)
  3469. if errThree != nil {
  3470. return errThree
  3471. }
  3472. } else {
  3473. // 出库完成后,要将该批次库存清零
  3474. warehouse.StockCount = 0
  3475. warehouse.Mtime = time.Now().Unix()
  3476. errThree := UpDateWarehouseInfoByStock(&warehouse)
  3477. if errThree != nil {
  3478. return errThree
  3479. }
  3480. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  3481. goods.Count = deliver_number - stock_number
  3482. //查询剩余库存
  3483. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  3484. var sum_count int64
  3485. for _, item := range goodList {
  3486. sum_count += item.StockCount
  3487. }
  3488. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  3489. warehouseOutInfo := &models.WarehouseOutInfo{
  3490. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  3491. WarehouseOutId: goods.WarehouseOutId,
  3492. WarehouseInfotId: warehouse.ID,
  3493. Status: 1,
  3494. Ctime: time.Now().Unix(),
  3495. Remark: goods.Remark,
  3496. OrgId: orgID,
  3497. Type: 1,
  3498. Manufacturer: warehouse.Manufacturer,
  3499. Dealer: warehouse.Dealer,
  3500. IsSys: 0,
  3501. SysRecordTime: record_time,
  3502. GoodTypeId: warehouse.GoodTypeId,
  3503. GoodId: warehouse.GoodId,
  3504. ExpiryDate: warehouse.ExpiryDate,
  3505. ProductDate: warehouse.ProductDate,
  3506. Number: warehouse.Number,
  3507. Price: warehouse.PackingPrice,
  3508. LicenseNumber: warehouse.LicenseNumber,
  3509. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3510. StorehouseId: warehouse.StorehouseId,
  3511. SecondWarehouseInfoId: goods.SecondWarehouseInfoId,
  3512. IsCheck: 1,
  3513. OverCount: sum_count,
  3514. }
  3515. warehouseOutInfo.Count = stock_number
  3516. //查询是否已经生成出库单
  3517. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  3518. if errcodes == gorm.ErrRecordNotFound {
  3519. //创建出库单
  3520. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  3521. if errOne != nil {
  3522. return errOne
  3523. }
  3524. } else {
  3525. warehouseOutInfo.Count = info.Count + stock_number
  3526. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  3527. }
  3528. stockFlow := models.VmStockFlow{
  3529. WarehousingId: warehouse.ID,
  3530. GoodId: goods.GoodId,
  3531. Number: warehouse.Number,
  3532. LicenseNumber: goods.LicenseNumber,
  3533. Count: stock_number,
  3534. UserOrgId: goods.OrgId,
  3535. PatientId: 0,
  3536. SystemTime: record_time,
  3537. ConsumableType: 12,
  3538. IsSys: 0,
  3539. WarehousingOrder: "",
  3540. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  3541. WarehouseOutId: goods.WarehouseOutId,
  3542. IsEdit: 1,
  3543. CancelStockId: 0,
  3544. CancelOrderNumber: "",
  3545. Manufacturer: warehouse.Manufacturer,
  3546. Dealer: warehouse.Dealer,
  3547. Creator: creator,
  3548. UpdateCreator: 0,
  3549. Status: 1,
  3550. Ctime: time.Now().Unix(),
  3551. Mtime: 0,
  3552. Price: warehouse.PackingPrice,
  3553. WarehousingDetailId: 0,
  3554. WarehouseOutDetailId: warehouseOutInfo.ID,
  3555. CancelOutDetailId: 0,
  3556. ProductDate: warehouse.ProductDate,
  3557. ExpireDate: warehouse.ExpiryDate,
  3558. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3559. StorehouseId: goods.StorehouseId,
  3560. SecondWarehouseInfoId: goods.SecondWarehouseInfoId,
  3561. OverCount: sum_count,
  3562. }
  3563. //创建出库明细
  3564. CreateStockFlowOne(stockFlow)
  3565. //入库
  3566. warehouseInfo := &models.WarehousingInfo{
  3567. WarehousingOrder: warehouseInfo.WarehousingOrder,
  3568. WarehousingId: warehouseInfo.WarehousingId,
  3569. GoodId: warehouse.GoodId,
  3570. Number: warehouse.Number,
  3571. GoodTypeId: warehouse.GoodTypeId,
  3572. ProductDate: warehouse.ProductDate,
  3573. ExpiryDate: warehouse.ExpiryDate,
  3574. WarehousingCount: stock_number,
  3575. Price: warehouse.Price,
  3576. TotalPrice: 0,
  3577. Status: 1,
  3578. Ctime: warehouse.Ctime,
  3579. Remark: goods.Remark,
  3580. OrgId: warehouse.OrgId,
  3581. Type: 1,
  3582. Manufacturer: warehouse.Manufacturer,
  3583. StockCount: stock_number,
  3584. Dealer: warehouse.Dealer,
  3585. LicenseNumber: "",
  3586. PackingPrice: warehouse.PackingPrice,
  3587. StorehouseId: warehouseInfo.StorehouseId,
  3588. SecondWarehouseInfoId: warehouseInfo.SecondWarehouseInfoId,
  3589. IsCheck: 1,
  3590. }
  3591. AddWarehosingInfo(warehouseInfo)
  3592. stockInfoFlow := models.VmStockFlow{
  3593. WarehousingId: warehouseInfo.WarehousingId,
  3594. GoodId: goods.GoodId,
  3595. Number: warehouse.Number,
  3596. LicenseNumber: goods.LicenseNumber,
  3597. Count: stock_number,
  3598. UserOrgId: goods.OrgId,
  3599. PatientId: goods.PatientId,
  3600. SystemTime: record_time,
  3601. ConsumableType: 13,
  3602. IsSys: goods.IsSys,
  3603. WarehousingOrder: warehouseInfo.WarehousingOrder,
  3604. WarehouseOutId: warehouseOut.ID,
  3605. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  3606. IsEdit: 1,
  3607. CancelStockId: 0,
  3608. CancelOrderNumber: "",
  3609. Manufacturer: warehouse.Manufacturer,
  3610. Dealer: warehouse.Dealer,
  3611. Creator: creator,
  3612. UpdateCreator: 0,
  3613. Status: 1,
  3614. Ctime: time.Now().Unix(),
  3615. Mtime: 0,
  3616. Price: warehouse.Price,
  3617. WarehousingDetailId: 0,
  3618. WarehouseOutDetailId: warehouseOutInfo.ID,
  3619. CancelOutDetailId: 0,
  3620. ProductDate: warehouse.ProductDate,
  3621. ExpireDate: warehouse.ExpiryDate,
  3622. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3623. StorehouseId: warehouseInfo.StorehouseId,
  3624. SecondWarehouseInfoId: warehouseInfo.SecondWarehouseInfoId,
  3625. }
  3626. //创建出库流水
  3627. CreateStockFlowOne(stockInfoFlow)
  3628. ConsumablesDeliveryTwelve(orgID, record_time, goods, warehouseOut, count, creator, warehouseInfo)
  3629. }
  3630. return nil
  3631. }
  3632. func AddWarehosingInfo(info *models.WarehousingInfo) error {
  3633. err = XTWriteDB().Create(&info).Error
  3634. return err
  3635. }
  3636. // 药品出库 递归方式
  3637. func AutoDrugDeliverInfoTwelve(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo, drugWarehouse *models.DrugWarehouseInfo) (err error) {
  3638. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  3639. var deliver_number int64 = 0
  3640. var stock_number int64 = 0
  3641. if advice.CountUnit == drup.MaxUnit {
  3642. deliver_number = prescribingNumber * drup.MinNumber
  3643. } else {
  3644. deliver_number = prescribingNumber
  3645. }
  3646. // 根据先进先出原则,查询最先入库的批次,进行出库
  3647. // 如果没有对应的库存,则报错
  3648. //开启事物
  3649. //storeConfig, _ := GetAllStoreHouseConfig(orgID)
  3650. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  3651. fmt.Println("lastWarehouse.StockMinNumber", lastWarehouse.StockMinNumber)
  3652. fmt.Println("drup.MinNumber", drup.MinNumber)
  3653. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  3654. var stockMax int64
  3655. var stockMin int64
  3656. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  3657. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  3658. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  3659. UpdateMinNumber(lastWarehouse.ID, stockMin)
  3660. }
  3661. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  3662. if err != nil {
  3663. return err
  3664. }
  3665. // 将该批次的剩余库存数量转换为拆零数量
  3666. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  3667. fmt.Println("stock23233233232", stock_number)
  3668. fmt.Println("deliver_number", deliver_number)
  3669. // 出库完成后,要减去对应批次的库存数量
  3670. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  3671. var maxNumber int64 = 0
  3672. var minNumber int64 = 0
  3673. if advice.CountUnit == drup.MinUnit {
  3674. maxNumber = prescribingNumber / drup.MinNumber
  3675. minNumber = prescribingNumber % drup.MinNumber
  3676. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  3677. minNumber = maxNumber
  3678. }
  3679. } else {
  3680. maxNumber = prescribingNumber
  3681. }
  3682. //fmt.Println("warehouse.StockMaxNumber",warehouse.StockMaxNumber)
  3683. //fmt.Println("maxNumber9899923323232wo",maxNumber)
  3684. //if warehouse.StockMaxNumber < maxNumber {
  3685. //
  3686. // return errors.New("库存数量不足")
  3687. //}
  3688. if warehouse.StockMaxNumber-maxNumber > 0 {
  3689. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  3690. }
  3691. warehouse.Mtime = time.Now().Unix()
  3692. if warehouse.StockMinNumber < minNumber {
  3693. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  3694. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  3695. } else {
  3696. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  3697. }
  3698. if warehouse.StockMaxNumber == 1 && warehouse.StockMinNumber == 1 && drup.MaxUnit == drup.MinUnit {
  3699. warehouse.StockMinNumber = 0
  3700. }
  3701. if warehouse.StockMaxNumber < 0 {
  3702. return errors.New("库存数量不足")
  3703. }
  3704. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  3705. if errThree != nil {
  3706. return errThree
  3707. }
  3708. //查询剩余库存
  3709. stockInfo, _ := GetDrugAllStockInfo(advice.StorehouseId, orgID, advice.DrugId)
  3710. var sum_count int64
  3711. for _, its := range stockInfo {
  3712. if its.MaxUnit == drup.MaxUnit {
  3713. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  3714. }
  3715. sum_count += its.StockMaxNumber + its.StockMinNumber
  3716. }
  3717. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  3718. if stock_number >= deliver_number {
  3719. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  3720. WarehouseOutOrderNumber: advice.WarehouseOutOrderNumber,
  3721. WarehouseOutId: advice.WarehouseOutId,
  3722. Status: 1,
  3723. Ctime: time.Now().Unix(),
  3724. Remark: advice.Remark,
  3725. OrgId: orgID,
  3726. Type: 1,
  3727. Manufacturer: warehouse.Manufacturer,
  3728. Dealer: warehouse.Dealer,
  3729. IsSys: 12,
  3730. SysRecordTime: advice.Ctime,
  3731. DrugId: advice.DrugId,
  3732. ExpiryDate: warehouse.ExpiryDate,
  3733. ProductDate: warehouse.ProductDate,
  3734. Number: warehouse.Number,
  3735. BatchNumber: warehouse.BatchNumber,
  3736. Count: deliver_number,
  3737. RetailPrice: warehouse.RetailPrice,
  3738. Price: warehouse.RetailPrice,
  3739. WarehouseInfoId: warehouse.ID,
  3740. CountUnit: drup.MinUnit,
  3741. AdviceId: advice.ID,
  3742. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3743. StorehouseId: advice.StorehouseId,
  3744. SecondWarehouseInfoId: advice.SecondWarehouseInfoId,
  3745. IsCheck: 1,
  3746. OverCount: sum_count,
  3747. }
  3748. warehouseOutInfo.Count = prescribingNumber
  3749. warehouseOutInfo.CountUnit = advice.CountUnit
  3750. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  3751. if errOne != nil {
  3752. return errOne
  3753. }
  3754. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  3755. drugflow := models.DrugFlow{
  3756. WarehouseOutOrderNumber: advice.WarehouseOutOrderNumber,
  3757. WarehouseOutId: advice.WarehouseOutId,
  3758. DrugId: advice.DrugId,
  3759. Number: warehouse.Number,
  3760. ProductDate: warehouse.ProductDate,
  3761. ExpireDate: warehouse.ExpiryDate,
  3762. Count: deliver_number,
  3763. Price: warehouse.RetailPrice,
  3764. Status: 1,
  3765. Ctime: time.Now().Unix(),
  3766. UserOrgId: advice.OrgId,
  3767. Manufacturer: warehouse.Manufacturer,
  3768. Dealer: warehouse.Dealer,
  3769. BatchNumber: warehouse.BatchNumber,
  3770. MaxUnit: drup.MinUnit,
  3771. ConsumableType: 12,
  3772. IsEdit: 1,
  3773. Creator: 0,
  3774. IsSys: 12,
  3775. WarehouseOutDetailId: drugWareInfo.ID,
  3776. AdviceId: advice.ID,
  3777. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3778. StorehouseId: advice.StorehouseId,
  3779. SecondWarehouseInfoId: advice.SecondWarehouseInfoId,
  3780. WarehousingDetailId: warehouse.ID,
  3781. OverCount: sum_count,
  3782. }
  3783. CreateDrugFlowOne(drugflow)
  3784. //入库
  3785. drugInfo := models.DrugWarehouseInfo{
  3786. WarehousingOrder: drugWarehouse.WarehousingOrder,
  3787. WarehousingId: drugWarehouse.WarehousingId,
  3788. DrugId: warehouse.DrugId,
  3789. Number: warehouse.Number,
  3790. ProductDate: warehouse.ProductDate,
  3791. ExpiryDate: warehouse.ExpiryDate,
  3792. WarehousingCount: deliver_number,
  3793. Price: warehouse.RetailPrice,
  3794. TotalPrice: warehouse.TotalPrice,
  3795. Status: 1,
  3796. Ctime: warehouse.Ctime,
  3797. Remark: "",
  3798. OrgId: warehouse.OrgId,
  3799. Type: 13,
  3800. Manufacturer: warehouse.Manufacturer,
  3801. Dealer: warehouse.Dealer,
  3802. StockMaxNumber: 0,
  3803. StockMinNumber: deliver_number,
  3804. BatchNumber: warehouse.BatchNumber,
  3805. MaxUnit: drup.MinUnit,
  3806. MinUnit: drup.MinUnit,
  3807. RetailPrice: warehouse.RetailPrice,
  3808. StorehouseId: drugWarehouse.StorehouseId,
  3809. SecondWarehouseInfoId: drugWarehouse.SecondWarehouseInfoId,
  3810. IsCheck: 1,
  3811. }
  3812. CreateDrugWarehouseInfo(drugInfo)
  3813. flow := models.DrugFlow{
  3814. WarehousingId: drugWarehouse.WarehousingId,
  3815. DrugId: warehouse.DrugId,
  3816. Number: warehouse.Number,
  3817. BatchNumber: warehouse.BatchNumber,
  3818. Count: deliver_number,
  3819. UserOrgId: warehouse.OrgId,
  3820. PatientId: 0,
  3821. SystemTime: 0,
  3822. ConsumableType: 13,
  3823. IsSys: 13,
  3824. WarehousingOrder: drugWarehouse.WarehousingOrder,
  3825. WarehouseOutId: 0,
  3826. WarehouseOutOrderNumber: "",
  3827. IsEdit: 0,
  3828. CancelStockId: 0,
  3829. CancelOrderNumber: "",
  3830. Manufacturer: warehouse.Manufacturer,
  3831. Dealer: warehouse.Dealer,
  3832. Creator: 0,
  3833. UpdateCreator: 0,
  3834. Status: 1,
  3835. Ctime: time.Now().Unix(),
  3836. Mtime: 0,
  3837. Price: warehouse.RetailPrice,
  3838. WarehousingDetailId: warehouse.ID,
  3839. WarehouseOutDetailId: 0,
  3840. CancelOutDetailId: 0,
  3841. ExpireDate: warehouse.ExpiryDate,
  3842. ProductDate: warehouse.ProductDate,
  3843. MaxUnit: drup.MinUnit,
  3844. MinUnit: drup.MinUnit,
  3845. StockMaxNumber: 0,
  3846. StockMinNumber: deliver_number,
  3847. StorehouseId: drugWarehouse.StorehouseId,
  3848. SecondWarehouseInfoId: drugWarehouse.SecondWarehouseInfoId,
  3849. }
  3850. CreateDrugFlowOne(flow)
  3851. return nil
  3852. } else {
  3853. warehouse.StockMaxNumber = 0
  3854. warehouse.StockMinNumber = 0
  3855. warehouse.Mtime = time.Now().Unix()
  3856. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  3857. if errThree != nil {
  3858. return errThree
  3859. }
  3860. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  3861. prescribingNumber_two_temp := deliver_number - stock_number
  3862. advice.CountUnit = drup.MinUnit
  3863. //查询剩余库存
  3864. stockInfo, _ := GetDrugAllStockInfo(advice.StorehouseId, orgID, advice.DrugId)
  3865. var sum_count int64
  3866. for _, its := range stockInfo {
  3867. if its.MaxUnit == drup.MaxUnit {
  3868. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  3869. }
  3870. sum_count += its.StockMaxNumber + its.StockMinNumber
  3871. }
  3872. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  3873. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  3874. WarehouseOutOrderNumber: advice.WarehouseOutOrderNumber,
  3875. WarehouseOutId: advice.WarehouseOutId,
  3876. Status: 1,
  3877. Ctime: time.Now().Unix(),
  3878. Remark: advice.Remark,
  3879. OrgId: orgID,
  3880. Type: 1,
  3881. Manufacturer: advice.Manufacturer,
  3882. Dealer: warehouse.Dealer,
  3883. IsSys: 12,
  3884. SysRecordTime: advice.Ctime,
  3885. DrugId: advice.DrugId,
  3886. ExpiryDate: warehouse.ExpiryDate,
  3887. ProductDate: warehouse.ProductDate,
  3888. Number: warehouse.Number,
  3889. BatchNumber: warehouse.BatchNumber,
  3890. Count: stock_number,
  3891. RetailPrice: advice.RetailPrice,
  3892. Price: warehouse.RetailPrice,
  3893. WarehouseInfoId: warehouse.ID,
  3894. CountUnit: drup.MinUnit,
  3895. AdviceId: advice.ID,
  3896. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3897. StorehouseId: advice.StorehouseId,
  3898. SecondWarehouseInfoId: advice.SecondWarehouseInfoId,
  3899. IsCheck: 1,
  3900. OverCount: sum_count,
  3901. }
  3902. warehouseOutInfo.Count = stock_number
  3903. //warehouseOutInfo.CountUnit = advice.CountUnit
  3904. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  3905. if errOne != nil {
  3906. return errOne
  3907. }
  3908. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  3909. drugflow := models.DrugFlow{
  3910. WarehouseOutOrderNumber: advice.WarehouseOutOrderNumber,
  3911. WarehouseOutId: advice.WarehouseOutId,
  3912. DrugId: advice.DrugId,
  3913. Number: warehouse.Number,
  3914. ProductDate: warehouse.ProductDate,
  3915. ExpireDate: warehouse.ExpiryDate,
  3916. Count: stock_number,
  3917. Price: warehouse.RetailPrice,
  3918. Status: 1,
  3919. Ctime: time.Now().Unix(),
  3920. UserOrgId: advice.OrgId,
  3921. Manufacturer: warehouse.Manufacturer,
  3922. Dealer: warehouse.Dealer,
  3923. BatchNumber: warehouse.BatchNumber,
  3924. MaxUnit: drup.MinUnit,
  3925. ConsumableType: 12,
  3926. IsEdit: 1,
  3927. Creator: 0,
  3928. IsSys: 12,
  3929. WarehouseOutDetailId: drugWareInfo.ID,
  3930. AdviceId: advice.ID,
  3931. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  3932. StorehouseId: advice.StorehouseId,
  3933. SecondWarehouseInfoId: advice.SecondWarehouseInfoId,
  3934. WarehousingDetailId: warehouse.ID,
  3935. OverCount: sum_count,
  3936. }
  3937. CreateDrugFlowOne(drugflow)
  3938. // 出库完成后,要将该批次库存清零
  3939. //入库
  3940. drugInfo := models.DrugWarehouseInfo{
  3941. WarehousingOrder: drugWarehouse.WarehousingOrder,
  3942. WarehousingId: drugWarehouse.WarehousingId,
  3943. DrugId: warehouse.DrugId,
  3944. Number: warehouse.Number,
  3945. ProductDate: warehouse.ProductDate,
  3946. ExpiryDate: warehouse.ExpiryDate,
  3947. WarehousingCount: stock_number,
  3948. Price: warehouse.RetailPrice,
  3949. TotalPrice: warehouse.TotalPrice,
  3950. Status: 1,
  3951. Ctime: warehouse.Ctime,
  3952. Remark: "",
  3953. OrgId: warehouse.OrgId,
  3954. Type: 13,
  3955. Manufacturer: warehouse.Manufacturer,
  3956. Dealer: warehouse.Dealer,
  3957. StockMaxNumber: 0,
  3958. StockMinNumber: stock_number,
  3959. RetailTotalPrice: 0,
  3960. BatchNumber: warehouse.BatchNumber,
  3961. MaxUnit: drup.MinUnit,
  3962. MinUnit: drup.MinUnit,
  3963. RetailPrice: warehouse.RetailPrice,
  3964. StorehouseId: drugWarehouse.StorehouseId,
  3965. SecondWarehouseInfoId: drugWarehouse.SecondWarehouseInfoId,
  3966. }
  3967. CreateDrugWarehouseInfo(drugInfo)
  3968. flow := models.DrugFlow{
  3969. WarehousingId: drugWarehouse.WarehousingId,
  3970. DrugId: warehouse.DrugId,
  3971. Number: warehouse.Number,
  3972. BatchNumber: warehouse.BatchNumber,
  3973. Count: stock_number,
  3974. UserOrgId: warehouse.OrgId,
  3975. PatientId: 0,
  3976. SystemTime: 0,
  3977. ConsumableType: 13,
  3978. IsSys: 13,
  3979. WarehousingOrder: drugWarehouse.WarehousingOrder,
  3980. WarehouseOutId: 0,
  3981. WarehouseOutOrderNumber: "",
  3982. IsEdit: 0,
  3983. CancelStockId: 0,
  3984. CancelOrderNumber: "",
  3985. Manufacturer: warehouse.Manufacturer,
  3986. Dealer: warehouse.Dealer,
  3987. Creator: 0,
  3988. UpdateCreator: 0,
  3989. Status: 1,
  3990. Ctime: time.Now().Unix(),
  3991. Mtime: 0,
  3992. Price: warehouse.RetailPrice,
  3993. WarehousingDetailId: warehouse.ID,
  3994. WarehouseOutDetailId: 0,
  3995. CancelOutDetailId: 0,
  3996. ExpireDate: warehouse.ExpiryDate,
  3997. ProductDate: warehouse.ProductDate,
  3998. MaxUnit: drup.MinUnit,
  3999. MinUnit: drup.MinUnit,
  4000. StockMaxNumber: 0,
  4001. StockMinNumber: stock_number,
  4002. StorehouseId: drugWarehouse.StorehouseId,
  4003. SecondWarehouseInfoId: drugWarehouse.SecondWarehouseInfoId,
  4004. OverCount: sum_count,
  4005. }
  4006. CreateDrugFlowOne(flow)
  4007. AutoDrugDeliverInfoTwelve(orgID, prescribingNumber_two_temp, warehouseout, drup, advice, drugWarehouse)
  4008. }
  4009. return
  4010. }
  4011. // 药品手动出库 递归方式
  4012. func AutoDrugDeliverInfoTwenty(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  4013. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  4014. var deliver_number int64 = 0
  4015. var stock_number int64 = 0
  4016. if advice.CountUnit == drup.MaxUnit {
  4017. deliver_number = prescribingNumber * drup.MinNumber
  4018. } else {
  4019. deliver_number = prescribingNumber
  4020. }
  4021. // 根据先进先出原则,查询最先入库的批次,进行出库
  4022. // 如果没有对应的库存,则报错
  4023. //开启事物
  4024. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  4025. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  4026. var stockMax int64
  4027. var stockMin int64
  4028. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  4029. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  4030. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  4031. UpdateMinNumber(lastWarehouse.ID, stockMin)
  4032. }
  4033. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  4034. if err != nil {
  4035. return err
  4036. }
  4037. // 将该批次的剩余库存数量转换为拆零数量
  4038. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  4039. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  4040. if stock_number >= deliver_number {
  4041. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  4042. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4043. WarehouseOutId: warehouseout.ID,
  4044. Status: 1,
  4045. Ctime: time.Now().Unix(),
  4046. Remark: advice.Remark,
  4047. OrgId: orgID,
  4048. Type: 1,
  4049. Manufacturer: advice.Manufacturer,
  4050. Dealer: warehouse.Dealer,
  4051. IsSys: 0,
  4052. SysRecordTime: advice.Ctime,
  4053. DrugId: advice.DrugId,
  4054. ExpiryDate: advice.ExpiryDate,
  4055. ProductDate: advice.ProductDate,
  4056. Number: advice.Number,
  4057. BatchNumber: warehouse.BatchNumber,
  4058. Count: deliver_number,
  4059. RetailPrice: advice.RetailPrice,
  4060. Price: warehouse.RetailPrice,
  4061. WarehouseInfoId: warehouse.ID,
  4062. CountUnit: drup.MinUnit,
  4063. AdviceId: advice.ID,
  4064. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4065. StorehouseId: advice.StorehouseId,
  4066. AdminUserId: advice.AdminUserId,
  4067. IsCheck: 1,
  4068. }
  4069. if warehouse.RetailPrice == 0 {
  4070. warehouseOutInfo.Price = advice.Price
  4071. }
  4072. warehouseOutInfo.Count = prescribingNumber
  4073. warehouseOutInfo.CountUnit = advice.CountUnit
  4074. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  4075. if errOne != nil {
  4076. return errOne
  4077. }
  4078. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  4079. drugflow := models.DrugFlow{
  4080. WarehouseOutId: warehouseout.ID,
  4081. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4082. DrugId: advice.DrugId,
  4083. Number: warehouse.Number,
  4084. ProductDate: advice.ProductDate,
  4085. ExpireDate: advice.ExpiryDate,
  4086. Count: deliver_number,
  4087. Price: warehouse.RetailPrice,
  4088. Status: 1,
  4089. Ctime: time.Now().Unix(),
  4090. UserOrgId: advice.OrgId,
  4091. Manufacturer: advice.Manufacturer,
  4092. Dealer: advice.Dealer,
  4093. BatchNumber: warehouse.BatchNumber,
  4094. MaxUnit: drup.MinUnit,
  4095. ConsumableType: 2,
  4096. IsEdit: 1,
  4097. Creator: 0,
  4098. IsSys: 0,
  4099. WarehouseOutDetailId: drugWareInfo.ID,
  4100. AdviceId: advice.ID,
  4101. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4102. StorehouseId: advice.StorehouseId,
  4103. AdminUserId: advice.AdminUserId,
  4104. }
  4105. if warehouse.RetailPrice == 0 {
  4106. drugflow.Price = advice.Price
  4107. }
  4108. CreateDrugFlowOne(drugflow)
  4109. // 出库完成后,要减去对应批次的库存数量
  4110. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  4111. var maxNumber int64 = 0
  4112. var minNumber int64 = 0
  4113. //var stock_max_number int64 = 0
  4114. //stock_max_number = warehouse.StockMaxNumber
  4115. maxNumber = deliver_number / drup.MinNumber
  4116. minNumber = deliver_number % drup.MinNumber
  4117. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  4118. minNumber = maxNumber
  4119. }
  4120. if drup.MaxUnit != drup.MinUnit {
  4121. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  4122. return errors.New("库存数量不足")
  4123. }
  4124. }
  4125. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  4126. if warehouse.StockMaxNumber < 0 {
  4127. warehouse.StockMaxNumber = 0
  4128. }
  4129. if warehouse.StockMinNumber < 0 {
  4130. warehouse.StockMinNumber = 0
  4131. }
  4132. warehouse.Mtime = time.Now().Unix()
  4133. if warehouse.StockMinNumber < minNumber {
  4134. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  4135. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  4136. } else {
  4137. if minNumber > 0 {
  4138. if minNumber == 1 && maxNumber == 1 && drup.MaxUnit != drup.MinUnit {
  4139. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4140. } else {
  4141. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  4142. }
  4143. }
  4144. if minNumber == 0 && maxNumber != 1 {
  4145. if warehouse.StockMinNumber > 0 {
  4146. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4147. }
  4148. }
  4149. }
  4150. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  4151. if (warehouse.StockMinNumber - deliver_number) > 0 {
  4152. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4153. //if warehouse.StockMinNumber == 0 {
  4154. // warehouse.StockMaxNumber = stock_max_number
  4155. //}
  4156. }
  4157. }
  4158. if drup.MaxUnit != drup.MinUnit {
  4159. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  4160. return errors.New("库存数量不足")
  4161. }
  4162. }
  4163. if warehouse.StockMinNumber <= 0 {
  4164. warehouse.StockMinNumber = 0
  4165. }
  4166. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  4167. if errThree != nil {
  4168. return errThree
  4169. }
  4170. //查询默认仓库
  4171. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  4172. //查询默认仓库剩余多少库存
  4173. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  4174. var sum_count int64
  4175. var sum_in_count int64
  4176. for _, it := range list {
  4177. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  4178. if it.MaxUnit == baseDrug.MaxUnit {
  4179. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  4180. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  4181. sum_count += it.StockMaxNumber + it.StockMinNumber
  4182. sum_in_count += it.WarehousingCount
  4183. }
  4184. }
  4185. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  4186. return nil
  4187. } else {
  4188. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  4189. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  4190. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4191. WarehouseOutId: warehouseout.ID,
  4192. Status: 1,
  4193. Ctime: time.Now().Unix(),
  4194. Remark: advice.Remark,
  4195. OrgId: orgID,
  4196. Type: 1,
  4197. Manufacturer: advice.Manufacturer,
  4198. Dealer: warehouse.Dealer,
  4199. IsSys: 0,
  4200. SysRecordTime: advice.Ctime,
  4201. DrugId: advice.DrugId,
  4202. ExpiryDate: warehouse.ExpiryDate,
  4203. ProductDate: warehouse.ProductDate,
  4204. Number: warehouse.Number,
  4205. BatchNumber: warehouse.BatchNumber,
  4206. Count: stock_number,
  4207. RetailPrice: advice.RetailPrice,
  4208. Price: warehouse.RetailPrice,
  4209. WarehouseInfoId: warehouse.ID,
  4210. CountUnit: drup.MinUnit,
  4211. AdviceId: advice.ID,
  4212. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4213. StorehouseId: advice.StorehouseId,
  4214. AdminUserId: advice.AdminUserId,
  4215. IsCheck: 1,
  4216. }
  4217. if warehouse.RetailPrice == 0 {
  4218. warehouseOutInfo.Price = advice.Price
  4219. }
  4220. warehouseOutInfo.Count = stock_number
  4221. //warehouseOutInfo.CountUnit = advice.CountUnit
  4222. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  4223. if errOne != nil {
  4224. return errOne
  4225. }
  4226. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  4227. drugflow := models.DrugFlow{
  4228. WarehouseOutId: warehouseout.ID,
  4229. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4230. DrugId: advice.DrugId,
  4231. Number: warehouse.Number,
  4232. ProductDate: advice.ProductDate,
  4233. ExpireDate: advice.ExpiryDate,
  4234. Count: stock_number,
  4235. Price: warehouse.RetailPrice,
  4236. Status: 1,
  4237. Ctime: time.Now().Unix(),
  4238. UserOrgId: advice.OrgId,
  4239. Manufacturer: advice.Manufacturer,
  4240. Dealer: advice.Dealer,
  4241. BatchNumber: warehouse.BatchNumber,
  4242. MaxUnit: drup.MinUnit,
  4243. ConsumableType: 2,
  4244. IsEdit: 1,
  4245. Creator: 0,
  4246. IsSys: 0,
  4247. WarehouseOutDetailId: drugWareInfo.ID,
  4248. AdviceId: advice.ID,
  4249. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4250. StorehouseId: advice.StorehouseId,
  4251. AdminUserId: advice.AdminUserId,
  4252. }
  4253. if warehouse.RetailPrice == 0 {
  4254. drugflow.Price = advice.Price
  4255. }
  4256. CreateDrugFlowOne(drugflow)
  4257. // 出库完成后,要将该批次库存清零
  4258. //扣减库存
  4259. warehouse.StockMaxNumber = 0
  4260. warehouse.StockMinNumber = 0
  4261. warehouse.Mtime = time.Now().Unix()
  4262. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  4263. //查询默认仓库
  4264. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  4265. //查询默认仓库剩余多少库存
  4266. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  4267. var sum_count int64
  4268. var sum_in_count int64
  4269. for _, it := range list {
  4270. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  4271. if it.MaxUnit == baseDrug.MaxUnit {
  4272. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  4273. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  4274. sum_count += it.StockMaxNumber + it.StockMinNumber
  4275. sum_in_count += it.WarehousingCount
  4276. }
  4277. }
  4278. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  4279. if errThree != nil {
  4280. return errThree
  4281. }
  4282. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  4283. prescribingNumber_two_temp := deliver_number - stock_number
  4284. advice.CountUnit = drup.MinUnit
  4285. AutoDrugDeliverInfoTwenty(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  4286. }
  4287. return
  4288. }
  4289. // 药品手动出库 递归方式
  4290. func AutoDrugDeliverInfoTwentyOne(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  4291. //开事务
  4292. //tx := XTWriteDB().Begin()
  4293. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  4294. var deliver_number int64 = 0
  4295. var stock_number int64 = 0
  4296. if advice.CountUnit == drup.MaxUnit {
  4297. deliver_number = prescribingNumber * drup.MinNumber
  4298. } else {
  4299. deliver_number = prescribingNumber
  4300. }
  4301. // 根据先进先出原则,查询最先入库的批次,进行出库
  4302. // 如果没有对应的库存,则报错
  4303. //开启事物
  4304. storeConfig, _ := GetAllStoreHouseConfig(orgID)
  4305. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, storeConfig.DrugStorehouseOut)
  4306. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  4307. var stockMax int64
  4308. var stockMin int64
  4309. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  4310. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  4311. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  4312. UpdateMinNumber(lastWarehouse.ID, stockMin)
  4313. }
  4314. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  4315. if err != nil {
  4316. return err
  4317. }
  4318. // 将该批次的剩余库存数量转换为拆零数量
  4319. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  4320. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  4321. if stock_number >= deliver_number {
  4322. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  4323. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4324. WarehouseOutId: warehouseout.ID,
  4325. Status: 1,
  4326. Ctime: time.Now().Unix(),
  4327. Remark: advice.Remark,
  4328. OrgId: orgID,
  4329. Type: 1,
  4330. Manufacturer: advice.Manufacturer,
  4331. Dealer: warehouse.Dealer,
  4332. IsSys: 0,
  4333. SysRecordTime: advice.Ctime,
  4334. DrugId: advice.DrugId,
  4335. ExpiryDate: advice.ExpiryDate,
  4336. ProductDate: advice.ProductDate,
  4337. Number: advice.Number,
  4338. BatchNumber: warehouse.BatchNumber,
  4339. Count: deliver_number,
  4340. RetailPrice: advice.RetailPrice,
  4341. Price: advice.Price,
  4342. WarehouseInfoId: warehouse.ID,
  4343. CountUnit: drup.MinUnit,
  4344. AdviceId: advice.ID,
  4345. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4346. StorehouseId: advice.StorehouseId,
  4347. AdminUserId: advice.AdminUserId,
  4348. LastPrice: warehouse.Price,
  4349. StockCount: advice.StockCount,
  4350. IsCheck: 1,
  4351. }
  4352. warehouseOutInfo.Count = prescribingNumber
  4353. warehouseOutInfo.CountUnit = advice.CountUnit
  4354. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  4355. drugflow := models.DrugFlow{
  4356. WarehouseOutId: warehouseout.ID,
  4357. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4358. DrugId: advice.DrugId,
  4359. Number: warehouse.Number,
  4360. ProductDate: advice.ProductDate,
  4361. ExpireDate: advice.ExpiryDate,
  4362. Count: deliver_number,
  4363. Price: advice.Price,
  4364. Status: 1,
  4365. Ctime: time.Now().Unix(),
  4366. UserOrgId: advice.OrgId,
  4367. Manufacturer: advice.Manufacturer,
  4368. Dealer: advice.Dealer,
  4369. BatchNumber: warehouse.BatchNumber,
  4370. MaxUnit: drup.MinUnit,
  4371. ConsumableType: 2,
  4372. IsEdit: 1,
  4373. Creator: 0,
  4374. IsSys: 0,
  4375. WarehouseOutDetailId: drugWareInfo.ID,
  4376. AdviceId: advice.ID,
  4377. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4378. StorehouseId: advice.StorehouseId,
  4379. AdminUserId: advice.AdminUserId,
  4380. LastPrice: warehouse.Price,
  4381. StockCount: advice.StockCount,
  4382. }
  4383. if warehouse.RetailPrice == 0 {
  4384. drugflow.Price = advice.Price
  4385. }
  4386. CreateDrugFlowOne(drugflow)
  4387. // 出库完成后,要减去对应批次的库存数量
  4388. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  4389. var maxNumber int64 = 0
  4390. var minNumber int64 = 0
  4391. //var stock_max_number int64 = 0
  4392. //stock_max_number = warehouse.StockMaxNumber
  4393. maxNumber = deliver_number / drup.MinNumber
  4394. minNumber = deliver_number % drup.MinNumber
  4395. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  4396. minNumber = maxNumber
  4397. }
  4398. if drup.MaxUnit != drup.MinUnit {
  4399. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  4400. return errors.New("库存数量不足")
  4401. }
  4402. }
  4403. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  4404. if warehouse.StockMaxNumber < 0 {
  4405. warehouse.StockMaxNumber = 0
  4406. }
  4407. if warehouse.StockMinNumber < 0 {
  4408. warehouse.StockMinNumber = 0
  4409. }
  4410. warehouse.Mtime = time.Now().Unix()
  4411. if warehouse.StockMinNumber < minNumber {
  4412. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  4413. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  4414. } else {
  4415. if minNumber > 0 {
  4416. if minNumber == 1 && maxNumber == 1 && drup.MaxUnit != drup.MinUnit {
  4417. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4418. } else {
  4419. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  4420. }
  4421. }
  4422. if minNumber == 0 && maxNumber != 1 {
  4423. if warehouse.StockMinNumber > 0 {
  4424. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4425. }
  4426. }
  4427. }
  4428. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  4429. if (warehouse.StockMinNumber - deliver_number) > 0 {
  4430. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4431. //if warehouse.StockMinNumber == 0 {
  4432. // warehouse.StockMaxNumber = stock_max_number
  4433. //}
  4434. }
  4435. }
  4436. if drup.MaxUnit != drup.MinUnit {
  4437. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  4438. return errors.New("库存数量不足")
  4439. }
  4440. }
  4441. if warehouse.StockMinNumber <= 0 {
  4442. warehouse.StockMinNumber = 0
  4443. }
  4444. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  4445. fmt.Println(errThree)
  4446. //if errThree != nil {
  4447. // utils.ErrorLog("事务失败,原因为: %v", err.Error())
  4448. // tx.Rollback()
  4449. //} else {
  4450. // tx.Commit()
  4451. //}
  4452. //查询默认仓库
  4453. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  4454. //查询默认仓库剩余多少库存
  4455. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  4456. var sum_count int64
  4457. var sum_in_count int64
  4458. for _, it := range list {
  4459. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  4460. if it.MaxUnit == baseDrug.MaxUnit {
  4461. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  4462. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  4463. sum_count += it.StockMaxNumber + it.StockMinNumber
  4464. sum_in_count += it.WarehousingCount
  4465. }
  4466. }
  4467. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  4468. return nil
  4469. } else {
  4470. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  4471. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  4472. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4473. WarehouseOutId: warehouseout.ID,
  4474. Status: 1,
  4475. Ctime: time.Now().Unix(),
  4476. Remark: advice.Remark,
  4477. OrgId: orgID,
  4478. Type: 1,
  4479. Manufacturer: advice.Manufacturer,
  4480. Dealer: warehouse.Dealer,
  4481. IsSys: 0,
  4482. SysRecordTime: advice.Ctime,
  4483. DrugId: advice.DrugId,
  4484. ExpiryDate: warehouse.ExpiryDate,
  4485. ProductDate: warehouse.ProductDate,
  4486. Number: warehouse.Number,
  4487. BatchNumber: warehouse.BatchNumber,
  4488. Count: stock_number,
  4489. RetailPrice: advice.RetailPrice,
  4490. Price: advice.Price,
  4491. WarehouseInfoId: warehouse.ID,
  4492. CountUnit: drup.MinUnit,
  4493. AdviceId: advice.ID,
  4494. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4495. StorehouseId: advice.StorehouseId,
  4496. AdminUserId: advice.AdminUserId,
  4497. LastPrice: warehouse.Price,
  4498. StockCount: advice.StockCount,
  4499. IsCheck: 1,
  4500. }
  4501. warehouseOutInfo.Count = stock_number
  4502. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  4503. drugflow := models.DrugFlow{
  4504. WarehouseOutId: warehouseout.ID,
  4505. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  4506. DrugId: advice.DrugId,
  4507. Number: warehouse.Number,
  4508. ProductDate: advice.ProductDate,
  4509. ExpireDate: advice.ExpiryDate,
  4510. Count: stock_number,
  4511. Price: advice.Price,
  4512. Status: 1,
  4513. Ctime: time.Now().Unix(),
  4514. UserOrgId: advice.OrgId,
  4515. Manufacturer: advice.Manufacturer,
  4516. Dealer: advice.Dealer,
  4517. BatchNumber: warehouse.BatchNumber,
  4518. MaxUnit: drup.MinUnit,
  4519. ConsumableType: 2,
  4520. IsEdit: 1,
  4521. Creator: 0,
  4522. IsSys: 0,
  4523. WarehouseOutDetailId: drugWareInfo.ID,
  4524. AdviceId: advice.ID,
  4525. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4526. StorehouseId: advice.StorehouseId,
  4527. AdminUserId: advice.AdminUserId,
  4528. LastPrice: warehouse.Price,
  4529. StockCount: advice.StockCount,
  4530. }
  4531. CreateDrugFlowOne(drugflow)
  4532. // 出库完成后,要将该批次库存清零
  4533. //扣减库存
  4534. warehouse.StockMaxNumber = 0
  4535. warehouse.StockMinNumber = 0
  4536. warehouse.Mtime = time.Now().Unix()
  4537. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  4538. fmt.Println(errThree)
  4539. //if errThree != nil {
  4540. // utils.ErrorLog("事务失败,原因为: %v", err.Error())
  4541. // tx.Rollback()
  4542. //} else {
  4543. // tx.Commit()
  4544. //}
  4545. //查询默认仓库
  4546. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  4547. //查询默认仓库剩余多少库存
  4548. list, _ := GetDrugSumCountByStorehouseId(houseConfig.DrugStorehouseOut, orgID, warehouse.DrugId)
  4549. var sum_count int64
  4550. var sum_in_count int64
  4551. for _, it := range list {
  4552. baseDrug, _ := GetBaseDrugMedical(it.DrugId)
  4553. if it.MaxUnit == baseDrug.MaxUnit {
  4554. it.StockMaxNumber = it.StockMaxNumber * baseDrug.MinNumber
  4555. it.WarehousingCount = it.WarehousingCount * baseDrug.MinNumber
  4556. sum_count += it.StockMaxNumber + it.StockMinNumber
  4557. sum_in_count += it.WarehousingCount
  4558. }
  4559. }
  4560. UpdateMedicalSumCount(warehouse.DrugId, sum_count, sum_in_count, orgID)
  4561. if errThree != nil {
  4562. return errThree
  4563. }
  4564. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  4565. prescribingNumber_two_temp := deliver_number - stock_number
  4566. advice.CountUnit = drup.MinUnit
  4567. AutoDrugDeliverInfoTwentyOne(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  4568. }
  4569. return
  4570. }
  4571. // 耗材手动出库
  4572. func ConsumablesDeliveryThirty(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64) (err error) {
  4573. var deliver_number int64 = 0
  4574. var stock_number int64 = 0
  4575. var maxNumber int64 = 0
  4576. deliver_number = goods.Count
  4577. // 根据先进先出原则,查询最先入库的批次,进行出库
  4578. // 如果没有对应的库存,则报错
  4579. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  4580. if err != nil {
  4581. goodErrcode := models.XtGoodErrcode{
  4582. UserOrgId: goods.OrgId,
  4583. Errcode: "查询库存信息报错",
  4584. GoodId: goods.GoodId,
  4585. Status: 1,
  4586. Ctime: time.Now().Unix(),
  4587. Mtime: 0,
  4588. Count: 0,
  4589. StockCount: 0,
  4590. Creater: creator,
  4591. BatchNumberId: warehouse.ID,
  4592. WarehouseOutId: 0,
  4593. }
  4594. CreateGoodErrcode(goodErrcode)
  4595. return err
  4596. }
  4597. stock_number = warehouse.StockCount
  4598. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  4599. if stock_number >= deliver_number {
  4600. maxNumber = goods.Count
  4601. warehouse.StockCount = warehouse.StockCount - maxNumber
  4602. warehouse.Mtime = time.Now().Unix()
  4603. //扣减库存
  4604. errThree := UpDateWarehouseInfoByStock(&warehouse)
  4605. if errThree != nil {
  4606. goodErrcode := models.XtGoodErrcode{
  4607. UserOrgId: goods.OrgId,
  4608. Errcode: "扣减库存失败",
  4609. GoodId: goods.GoodId,
  4610. Status: 1,
  4611. Ctime: time.Now().Unix(),
  4612. Mtime: 0,
  4613. Count: 0,
  4614. StockCount: 0,
  4615. Creater: creator,
  4616. BatchNumberId: warehouse.ID,
  4617. WarehouseOutId: 0,
  4618. }
  4619. CreateGoodErrcode(goodErrcode)
  4620. return errThree
  4621. }
  4622. //查询剩余库存
  4623. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  4624. var sum_count int64
  4625. for _, item := range goodList {
  4626. sum_count += item.StockCount
  4627. }
  4628. warehouseOutInfo := &models.WarehouseOutInfo{
  4629. WarehouseInfotId: warehouse.ID,
  4630. }
  4631. //添加入库单详情ID
  4632. errOne := UpdatedSigleWarehouseOutInfo(goods.ID, warehouseOutInfo)
  4633. if errOne != nil {
  4634. goodErrcode := models.XtGoodErrcode{
  4635. UserOrgId: goods.OrgId,
  4636. Errcode: "添加入库单详情ID",
  4637. GoodId: goods.GoodId,
  4638. Status: 1,
  4639. Ctime: time.Now().Unix(),
  4640. Mtime: 0,
  4641. Count: 0,
  4642. StockCount: 0,
  4643. Creater: creator,
  4644. BatchNumberId: warehouse.ID,
  4645. WarehouseOutId: 0,
  4646. }
  4647. CreateGoodErrcode(goodErrcode)
  4648. return errOne
  4649. }
  4650. stockFlow := models.VmStockFlow{
  4651. WarehousingId: warehouse.ID,
  4652. GoodId: goods.GoodId,
  4653. Number: warehouse.Number,
  4654. LicenseNumber: goods.LicenseNumber,
  4655. Count: goods.Count,
  4656. UserOrgId: goods.OrgId,
  4657. PatientId: goods.PatientId,
  4658. SystemTime: record_time,
  4659. ConsumableType: 2,
  4660. IsSys: goods.IsSys,
  4661. WarehousingOrder: warehouse.WarehousingOrder,
  4662. WarehouseOutId: warehouseOut.ID,
  4663. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  4664. IsEdit: 1,
  4665. CancelStockId: 0,
  4666. CancelOrderNumber: "",
  4667. Manufacturer: goods.Manufacturer,
  4668. Dealer: goods.Dealer,
  4669. Creator: creator,
  4670. UpdateCreator: 0,
  4671. Status: 1,
  4672. Ctime: time.Now().Unix(),
  4673. Mtime: 0,
  4674. Price: warehouse.PackingPrice, //零售价
  4675. WarehousingDetailId: warehouse.ID,
  4676. WarehouseOutDetailId: goods.ID,
  4677. CancelOutDetailId: 0,
  4678. ProductDate: goods.ProductDate,
  4679. ExpireDate: goods.ExpiryDate,
  4680. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4681. StorehouseId: warehouse.StorehouseId,
  4682. AdminUserId: goods.AdminUserId,
  4683. BuyPrice: warehouse.Price, //进货价
  4684. StockCount: goods.StockCount,
  4685. BatchNumberCount: warehouse.StockCount - goods.Count,
  4686. IsCheck: 1,
  4687. OverCount: sum_count,
  4688. RegisterNumber: goods.RegisterNumber,
  4689. }
  4690. //创建出库流水
  4691. errflow := CreateStockFlowOne(stockFlow)
  4692. if errflow != nil {
  4693. goodErrcode := models.XtGoodErrcode{
  4694. UserOrgId: goods.OrgId,
  4695. Errcode: "创建流水报错",
  4696. GoodId: goods.GoodId,
  4697. Status: 1,
  4698. Ctime: time.Now().Unix(),
  4699. Mtime: 0,
  4700. Count: 0,
  4701. StockCount: 0,
  4702. Creater: creator,
  4703. BatchNumberId: warehouse.ID,
  4704. WarehouseOutId: 0,
  4705. }
  4706. CreateGoodErrcode(goodErrcode)
  4707. }
  4708. //添加入库ID
  4709. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, goods.OrgId, sum_count)
  4710. if errWarehouse != nil {
  4711. goodErrcode := models.XtGoodErrcode{
  4712. UserOrgId: goods.OrgId,
  4713. Errcode: "添加入库ID报错",
  4714. GoodId: goods.GoodId,
  4715. Status: 1,
  4716. Ctime: time.Now().Unix(),
  4717. Mtime: 0,
  4718. Count: 0,
  4719. StockCount: 0,
  4720. Creater: creator,
  4721. BatchNumberId: warehouse.ID,
  4722. WarehouseOutId: 0,
  4723. }
  4724. CreateGoodErrcode(goodErrcode)
  4725. }
  4726. //更新出库数量
  4727. errsumcode := ModifyGoodSumCount(goods.StorehouseId, goods.Count, goods.OrgId, goods.GoodId)
  4728. if errsumcode != nil {
  4729. goodErrcode := models.XtGoodErrcode{
  4730. UserOrgId: goods.OrgId,
  4731. Errcode: "更新出库数量报错",
  4732. GoodId: goods.GoodId,
  4733. Status: 1,
  4734. Ctime: time.Now().Unix(),
  4735. Mtime: 0,
  4736. Count: 0,
  4737. StockCount: 0,
  4738. Creater: creator,
  4739. BatchNumberId: warehouse.ID,
  4740. WarehouseOutId: 0,
  4741. }
  4742. CreateGoodErrcode(goodErrcode)
  4743. }
  4744. if warehouse.StockCount < maxNumber {
  4745. goodErrcode := models.XtGoodErrcode{
  4746. UserOrgId: goods.OrgId,
  4747. Errcode: "出库接口库存数量不足",
  4748. GoodId: goods.GoodId,
  4749. Status: 1,
  4750. Ctime: time.Now().Unix(),
  4751. Mtime: 0,
  4752. Count: 0,
  4753. StockCount: 0,
  4754. Creater: creator,
  4755. BatchNumberId: warehouse.ID,
  4756. WarehouseOutId: 0,
  4757. }
  4758. CreateGoodErrcode(goodErrcode)
  4759. return errors.New("库存数量不足")
  4760. }
  4761. return nil
  4762. } else {
  4763. // 出库完成后,要将该批次库存清零
  4764. warehouse.StockCount = 0
  4765. warehouse.Mtime = time.Now().Unix()
  4766. errThree := UpDateWarehouseInfoByStock(&warehouse)
  4767. if errThree != nil {
  4768. goodErrcode := models.XtGoodErrcode{
  4769. UserOrgId: goods.OrgId,
  4770. Errcode: "扣减库存报错",
  4771. GoodId: goods.GoodId,
  4772. Status: 1,
  4773. Ctime: time.Now().Unix(),
  4774. Mtime: 0,
  4775. Count: 0,
  4776. StockCount: 0,
  4777. Creater: creator,
  4778. BatchNumberId: warehouse.ID,
  4779. WarehouseOutId: 0,
  4780. }
  4781. CreateGoodErrcode(goodErrcode)
  4782. return errThree
  4783. }
  4784. //查询剩余库存
  4785. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  4786. var sum_count int64
  4787. for _, item := range goodList {
  4788. sum_count += item.StockCount
  4789. }
  4790. stockFlow := models.VmStockFlow{
  4791. WarehousingId: warehouse.ID,
  4792. GoodId: goods.GoodId,
  4793. Number: warehouse.Number,
  4794. LicenseNumber: goods.LicenseNumber,
  4795. Count: stock_number,
  4796. UserOrgId: goods.OrgId,
  4797. PatientId: goods.PatientId,
  4798. SystemTime: record_time,
  4799. ConsumableType: 2,
  4800. IsSys: goods.IsSys,
  4801. WarehousingOrder: warehouse.WarehousingOrder,
  4802. WarehouseOutId: warehouseOut.ID,
  4803. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  4804. IsEdit: 1,
  4805. CancelStockId: 0,
  4806. CancelOrderNumber: "",
  4807. Manufacturer: goods.Manufacturer,
  4808. Dealer: goods.Dealer,
  4809. Creator: creator,
  4810. UpdateCreator: 0,
  4811. Status: 1,
  4812. Ctime: time.Now().Unix(),
  4813. Mtime: 0,
  4814. Price: warehouse.PackingPrice, //零售价
  4815. WarehousingDetailId: warehouse.ID,
  4816. WarehouseOutDetailId: goods.ID,
  4817. CancelOutDetailId: 0,
  4818. ProductDate: goods.ProductDate,
  4819. ExpireDate: goods.ExpiryDate,
  4820. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  4821. StorehouseId: warehouse.StorehouseId,
  4822. AdminUserId: goods.AdminUserId,
  4823. BuyPrice: warehouse.Price, //进货价
  4824. StockCount: goods.StockCount,
  4825. BatchNumberCount: 0,
  4826. IsCheck: 1,
  4827. OverCount: sum_count,
  4828. RegisterNumber: goods.RegisterNumber,
  4829. }
  4830. //创建出库流水
  4831. errflow := CreateStockFlowOne(stockFlow)
  4832. if errflow != nil {
  4833. goodErrcode := models.XtGoodErrcode{
  4834. UserOrgId: goods.OrgId,
  4835. Errcode: "创建出库流水报错",
  4836. GoodId: goods.GoodId,
  4837. Status: 1,
  4838. Ctime: time.Now().Unix(),
  4839. Mtime: 0,
  4840. Count: 0,
  4841. StockCount: 0,
  4842. Creater: creator,
  4843. BatchNumberId: warehouse.ID,
  4844. WarehouseOutId: 0,
  4845. }
  4846. CreateGoodErrcode(goodErrcode)
  4847. }
  4848. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, goods.OrgId, sum_count)
  4849. if errWarehouse != nil {
  4850. goodErrcode := models.XtGoodErrcode{
  4851. UserOrgId: goods.OrgId,
  4852. Errcode: "添加入库ID报错",
  4853. GoodId: goods.GoodId,
  4854. Status: 1,
  4855. Ctime: time.Now().Unix(),
  4856. Mtime: 0,
  4857. Count: 0,
  4858. StockCount: 0,
  4859. Creater: creator,
  4860. BatchNumberId: warehouse.ID,
  4861. WarehouseOutId: 0,
  4862. }
  4863. CreateGoodErrcode(goodErrcode)
  4864. }
  4865. //更新出库数量
  4866. errcodecout := ModifyGoodSumCount(goods.StorehouseId, stock_number, goods.OrgId, goods.GoodId)
  4867. if errcodecout != nil {
  4868. goodErrcode := models.XtGoodErrcode{
  4869. UserOrgId: goods.OrgId,
  4870. Errcode: "更新出库数量报错",
  4871. GoodId: goods.GoodId,
  4872. Status: 1,
  4873. Ctime: time.Now().Unix(),
  4874. Mtime: 0,
  4875. Count: 0,
  4876. StockCount: 0,
  4877. Creater: creator,
  4878. BatchNumberId: warehouse.ID,
  4879. WarehouseOutId: 0,
  4880. }
  4881. CreateGoodErrcode(goodErrcode)
  4882. }
  4883. }
  4884. goods.Count = deliver_number - stock_number
  4885. ConsumablesDeliveryThirty(orgID, record_time, goods, warehouseOut, count, creator)
  4886. return nil
  4887. }
  4888. // 药品手动出库 递归方式
  4889. func AutoDrugDeliverInfoFourtyOne(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  4890. fmt.Println("出库数量", prescribingNumber)
  4891. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  4892. var deliver_number int64 = 0
  4893. var stock_number int64 = 0
  4894. var retail_price float64
  4895. if advice.CountUnit == drup.MaxUnit {
  4896. deliver_number = prescribingNumber * drup.MinNumber
  4897. formatInt := strconv.FormatInt(prescribingNumber, 10)
  4898. floatcount, _ := strconv.ParseFloat(formatInt, 64)
  4899. retail_price = floatcount * advice.Price
  4900. } else {
  4901. deliver_number = prescribingNumber
  4902. formatInt := strconv.FormatInt(prescribingNumber, 10)
  4903. floatcount, _ := strconv.ParseFloat(formatInt, 64)
  4904. retail_price = floatcount * advice.Price
  4905. }
  4906. lastWarehouse, _ := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  4907. if lastWarehouse.StockMinNumber >= drup.MinNumber {
  4908. var stockMax int64
  4909. var stockMin int64
  4910. stockMax = lastWarehouse.StockMinNumber / drup.MinNumber
  4911. stockMin = lastWarehouse.StockMinNumber % drup.MinNumber
  4912. //fmt.Println("stockmax", stockMax)
  4913. //fmt.Println("stockMin", stockMin)
  4914. ChangeMaxNumber(lastWarehouse.ID, stockMax)
  4915. UpdateMinNumber(lastWarehouse.ID, stockMin)
  4916. }
  4917. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId, warehouseout.StorehouseId)
  4918. if err != nil {
  4919. return err
  4920. }
  4921. // 将该批次的剩余库存数量转换为拆零数量
  4922. if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit != drup.MinUnit {
  4923. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  4924. }
  4925. if warehouse.MaxUnit == drup.MinUnit && drup.MaxUnit != drup.MinUnit {
  4926. stock_number = warehouse.StockMaxNumber + warehouse.StockMinNumber
  4927. }
  4928. if warehouse.MaxUnit == drup.MaxUnit && drup.MaxUnit == drup.MinUnit {
  4929. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  4930. }
  4931. fmt.Println("stock_number", stock_number)
  4932. fmt.Println("deliver_number", deliver_number)
  4933. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  4934. if stock_number >= deliver_number {
  4935. // 出库完成后,要减去对应批次的库存数量
  4936. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  4937. var maxNumber int64 = 0
  4938. var minNumber int64 = 0
  4939. maxNumber = deliver_number / drup.MinNumber
  4940. minNumber = deliver_number % drup.MinNumber
  4941. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  4942. minNumber = maxNumber
  4943. }
  4944. if drup.MaxUnit != drup.MinUnit {
  4945. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  4946. return errors.New("库存数量不足")
  4947. }
  4948. }
  4949. if drup.MinUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit {
  4950. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber*drup.MinNumber
  4951. }
  4952. if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit != drup.MinUnit {
  4953. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  4954. }
  4955. if drup.MaxUnit == warehouse.MaxUnit && drup.MaxUnit == drup.MinUnit {
  4956. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  4957. }
  4958. if warehouse.StockMaxNumber < 0 {
  4959. warehouse.StockMaxNumber = 0
  4960. }
  4961. if warehouse.StockMinNumber < 0 {
  4962. warehouse.StockMinNumber = 0
  4963. }
  4964. warehouse.Mtime = time.Now().Unix()
  4965. if warehouse.StockMinNumber < minNumber {
  4966. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  4967. if warehouse.MaxUnit != warehouse.MinUnit {
  4968. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  4969. }
  4970. } else {
  4971. //fmt.Println("maxNumber23323323332322323w9", maxNumber)
  4972. //fmt.Println("maxNumber23323323332322323w9", minNumber)
  4973. if minNumber > 0 {
  4974. if minNumber == 1 && maxNumber == 1 && drup.MaxUnit != drup.MinUnit {
  4975. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4976. } else {
  4977. if (warehouse.StockMinNumber - minNumber) >= 0 {
  4978. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  4979. }
  4980. }
  4981. }
  4982. if minNumber == 0 && maxNumber != 1 {
  4983. if warehouse.StockMinNumber > 0 {
  4984. if (warehouse.StockMinNumber - deliver_number) >= 0 {
  4985. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4986. }
  4987. }
  4988. }
  4989. }
  4990. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  4991. if (warehouse.StockMinNumber - deliver_number) >= 0 {
  4992. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  4993. }
  4994. }
  4995. if drup.MaxUnit != drup.MinUnit {
  4996. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  4997. return errors.New("库存数量不足")
  4998. }
  4999. }
  5000. if warehouse.StockMinNumber <= 0 {
  5001. warehouse.StockMinNumber = 0
  5002. }
  5003. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  5004. if errThree != nil {
  5005. return errors.New("扣减库存失败")
  5006. }
  5007. //查询该药品剩余库存
  5008. infolist, _ := FindDrugWarehouseInfoFlushCount(advice.DrugId, advice.OrgId)
  5009. var over_count int64
  5010. for _, its := range infolist {
  5011. if its.MaxUnit == drup.MaxUnit {
  5012. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  5013. }
  5014. over_count += its.StockMaxNumber + its.StockMinNumber
  5015. }
  5016. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  5017. drugflow := models.DrugFlow{
  5018. WarehouseOutId: warehouseout.ID,
  5019. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  5020. DrugId: advice.DrugId,
  5021. Number: warehouse.Number,
  5022. ProductDate: advice.ProductDate,
  5023. ExpireDate: advice.ExpiryDate,
  5024. Count: deliver_number,
  5025. Price: warehouse.RetailPrice,
  5026. Status: 1,
  5027. Ctime: time.Now().Unix(),
  5028. UserOrgId: advice.OrgId,
  5029. Manufacturer: advice.Manufacturer,
  5030. Dealer: advice.Dealer,
  5031. BatchNumber: warehouse.BatchNumber,
  5032. MaxUnit: drup.MinUnit,
  5033. ConsumableType: 2,
  5034. IsEdit: 1,
  5035. Creator: 0,
  5036. IsSys: 0,
  5037. WarehouseOutDetailId: drugWareInfo.ID,
  5038. AdviceId: advice.ID,
  5039. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5040. StorehouseId: advice.StorehouseId,
  5041. AdminUserId: advice.AdminUserId,
  5042. LastPrice: warehouse.Price,
  5043. StockCount: advice.StockCount,
  5044. WarehousingDetailId: warehouse.ID,
  5045. OverCount: over_count,
  5046. RetailPrice: retail_price, //手动出库出库价格
  5047. WarehousingId: warehouse.ID,
  5048. SystemTime: advice.SysRecordTime,
  5049. }
  5050. if warehouse.RetailPrice == 0 {
  5051. drugflow.Price = advice.Price
  5052. }
  5053. CreateDrugFlowOne(drugflow)
  5054. //更新出库id
  5055. UpdateDrugWarehouseOutInfo(advice.ID, warehouse.ID, advice.OrgId, over_count)
  5056. return nil
  5057. } else {
  5058. stock_number_int := strconv.FormatInt(stock_number, 10)
  5059. stock_number_int_count, _ := strconv.ParseFloat(stock_number_int, 64)
  5060. retail_price = stock_number_int_count * advice.Price
  5061. //扣减库存
  5062. warehouse.StockMaxNumber = 0
  5063. warehouse.StockMinNumber = 0
  5064. warehouse.Mtime = time.Now().Unix()
  5065. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  5066. if errThree != nil {
  5067. return errThree
  5068. }
  5069. //查询该药品剩余库存
  5070. infolist, _ := FindDrugWarehouseInfoFlushCount(advice.DrugId, advice.OrgId)
  5071. var over_count int64
  5072. for _, its := range infolist {
  5073. if its.MaxUnit == drup.MaxUnit {
  5074. its.StockMaxNumber = its.StockMaxNumber * drup.MinNumber
  5075. }
  5076. over_count += its.StockMaxNumber + its.StockMinNumber
  5077. }
  5078. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  5079. drugflow := models.DrugFlow{
  5080. WarehouseOutId: warehouseout.ID,
  5081. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  5082. DrugId: advice.DrugId,
  5083. Number: warehouse.Number,
  5084. ProductDate: advice.ProductDate,
  5085. ExpireDate: advice.ExpiryDate,
  5086. Count: stock_number,
  5087. Price: warehouse.RetailPrice,
  5088. Status: 1,
  5089. Ctime: time.Now().Unix(),
  5090. UserOrgId: advice.OrgId,
  5091. Manufacturer: advice.Manufacturer,
  5092. Dealer: advice.Dealer,
  5093. BatchNumber: warehouse.BatchNumber,
  5094. MaxUnit: drup.MinUnit,
  5095. ConsumableType: 2,
  5096. IsEdit: 1,
  5097. Creator: 0,
  5098. IsSys: 0,
  5099. WarehouseOutDetailId: drugWareInfo.ID,
  5100. AdviceId: advice.ID,
  5101. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5102. StorehouseId: advice.StorehouseId,
  5103. AdminUserId: advice.AdminUserId,
  5104. LastPrice: warehouse.Price,
  5105. StockCount: advice.StockCount,
  5106. OverCount: over_count,
  5107. RetailPrice: retail_price, //手动出库出库价格
  5108. WarehousingId: warehouse.ID,
  5109. WarehousingDetailId: warehouse.ID,
  5110. SystemTime: advice.SysRecordTime,
  5111. }
  5112. CreateDrugFlowOne(drugflow)
  5113. //更新出库id
  5114. UpdateDrugWarehouseOutInfo(advice.ID, warehouse.ID, advice.OrgId, over_count)
  5115. // 出库完成后,要将该批次库存清零
  5116. prescribingNumber_two_temp := deliver_number - stock_number
  5117. advice.CountUnit = drup.MinUnit
  5118. AutoDrugDeliverInfoFourtyOne(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  5119. }
  5120. return
  5121. }
  5122. func UpdateDrugWarehouseOutInfo(id int64, warehouse_info_id int64, org_id int64, over_count int64) error {
  5123. ut := XTWriteDB().Begin()
  5124. err = ut.Model(&models.DrugWarehouseOutInfo{}).Where("id = ? and org_id = ? and status = 1", id, org_id).Update(map[string]interface{}{"warehouse_info_id": warehouse_info_id, "over_count": over_count}).Error
  5125. if err != nil {
  5126. ut.Rollback()
  5127. return err
  5128. }
  5129. ut.Commit()
  5130. return err
  5131. }
  5132. func UpdateGoodWarehouseOutById(id int64, warehouse_info_id int64, org_id int64, over_count int64) error {
  5133. utx := XTWriteDB().Begin()
  5134. err := utx.Model(models.WarehouseOutInfo{}).Where("id = ? and org_id = ? and status = 1", id, org_id).Update(map[string]interface{}{"warehouse_info_id": warehouse_info_id, "over_count": over_count}).Error
  5135. if err != nil {
  5136. utx.Rollback()
  5137. return err
  5138. }
  5139. utx.Commit()
  5140. return err
  5141. }
  5142. func ChangeMaxNumber(id int64, count int64) error {
  5143. err = XTWriteDB().Model(&models.DrugWarehouseInfo{}).Where("id = ? and status = 1 and is_check = 1", id).UpdateColumn("stock_max_number", gorm.Expr("stock_max_number + ?", count)).Error
  5144. return err
  5145. }
  5146. func UpdateMinNumber(id int64, count int64) error {
  5147. err := XTWriteDB().Model(&models.DrugWarehouseInfo{}).Where("id = ? and status = 1 and is_check = 1", id).Update(map[string]interface{}{"stock_min_number": count}).Error
  5148. return err
  5149. }
  5150. func FindLastDrugWarehouseOutInfo(orgid int64) (models.DrugWarehouseOutInfo, error) {
  5151. info := models.DrugWarehouseOutInfo{}
  5152. err := XTReadDB().Where("org_id = ? and status = 1", orgid).Last(&info).Error
  5153. return info, err
  5154. }
  5155. func GetAllGoodSumCount(goodid int64, orgid int64, storehouse_id int64) (info []*models.WarehousingInfo, err error) {
  5156. err = XTReadDB().Where("good_id = ? and org_id = ? and is_check =1 and status= 1 and stock_count > 0 and storehouse_id = ?", goodid, orgid, storehouse_id).Find(&info).Error
  5157. return info, err
  5158. }
  5159. func CreatedFlushInfo(info models.XtWarehouseFlushInfo) error {
  5160. ut := writeDb.Begin()
  5161. err := ut.Create(&info).Error
  5162. if err != nil {
  5163. ut.Rollback()
  5164. return err
  5165. }
  5166. ut.Commit()
  5167. return err
  5168. }
  5169. func FindDrugWarehouseInfoList(drugid int64, orgid int64) (info []*models.DrugWarehouseInfo, err error) {
  5170. err = XTReadDB().Where("drug_id = ? and org_id = ? and status =1 and is_check =1 and (stock_max_number>0 or stock_min_number>0)", drugid, orgid).Find(&info).Error
  5171. return info, err
  5172. }
  5173. func CreatedDrugFlushInfo(info models.XtDrugWarehouseFlushInfo) error {
  5174. ut := writeDb.Begin()
  5175. err := ut.Create(&info).Error
  5176. if err != nil {
  5177. ut.Rollback()
  5178. return err
  5179. }
  5180. ut.Commit()
  5181. return err
  5182. }
  5183. func UpdateWarehouseFlushInfo(warehouse_out_id int64, record_time int64, patient_id int64, batch_nubmer_id int64, good_id int64, sum_count int64, orgid int64) error {
  5184. err := XTWriteDB().Model(&models.XtWarehouseFlushInfo{}).Where("warehouse_out_id = ? and system_time = ? and patient_id = ? and batch_number_id = ? and good_id = ? and user_org_id = ?", warehouse_out_id, record_time, patient_id, batch_nubmer_id, good_id, orgid).Update(map[string]interface{}{"flush_count": sum_count}).Error
  5185. return err
  5186. }
  5187. func FindLastWarehouseOutInfo(orgId int64) (models.WarehouseOutInfo, error) {
  5188. info := models.WarehouseOutInfo{}
  5189. err := XTReadDB().Model(&info).Where("org_id = ? and status = 1", orgId).Find(&info).Error
  5190. return info, err
  5191. }
  5192. func ModifyAddGoodInformation(count int64, id int64) error {
  5193. ut := XTWriteDB().Begin()
  5194. err = ut.Model(&models.GoodInfo{}).Where("id = ? and status =1", id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count + ?", count)).Error
  5195. if err != nil {
  5196. ut.Rollback()
  5197. return err
  5198. }
  5199. ut.Commit()
  5200. return err
  5201. }
  5202. func ModifyReduceGoodInformation(count int64, id int64) error {
  5203. ut := XTWriteDB().Begin()
  5204. err = ut.Model(&models.GoodInfo{}).Where("id = ? and status =1", id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", count)).Error
  5205. if err != nil {
  5206. ut.Rollback()
  5207. return err
  5208. }
  5209. ut.Commit()
  5210. return err
  5211. }
  5212. func ModifyAddCancelCount(count int64, id int64) error {
  5213. ut := XTWriteDB().Begin()
  5214. err = ut.Model(&models.GoodInfo{}).Where("id = ? and status =1", id).UpdateColumn("sum_cancel_count", gorm.Expr("sum_cancel_count + ?", count)).Error
  5215. if err != nil {
  5216. ut.Rollback()
  5217. return err
  5218. }
  5219. ut.Commit()
  5220. return err
  5221. }
  5222. func ModifyReduceCancelCount(count int64, id int64) error {
  5223. ut := XTWriteDB().Begin()
  5224. err = ut.Model(&models.GoodInfo{}).Where("id = ? and status =1", id).UpdateColumn("sum_cancel_count", gorm.Expr("sum_cancel_count + ?", count)).Error
  5225. if err != nil {
  5226. ut.Rollback()
  5227. return err
  5228. }
  5229. ut.Commit()
  5230. return err
  5231. }
  5232. func ModifyAddDrugInformation(id int64, count int64, orgid int64) error {
  5233. ut := XTWriteDB().Begin()
  5234. err = ut.Model(&models.BaseDrugLib{}).Where("id = ? and status = 1 and org_id = ?", id, orgid).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count + ?", count)).Error
  5235. if err != nil {
  5236. ut.Rollback()
  5237. return err
  5238. }
  5239. ut.Commit()
  5240. return err
  5241. }
  5242. func ModifyReduceDrugInformation(id int64, count int64, orgid int64) error {
  5243. ut := XTWriteDB().Begin()
  5244. err = ut.Model(&models.BaseDrugLib{}).Where("id = ? and status = 1 and org_id = ?", id, orgid).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", count)).Error
  5245. if err != nil {
  5246. ut.Rollback()
  5247. return err
  5248. }
  5249. ut.Commit()
  5250. return err
  5251. }
  5252. func ModifyAddCancelAddInfomation(id int64, count int64, orgid int64, storehouse_id int64) error {
  5253. ut := XTWriteDB().Begin()
  5254. err = ut.Model(&models.XtDrugStockCount{}).Where("drug_id = ? and status = 1 and user_org_id = ? and storehouse_id = ?", id, orgid, storehouse_id).UpdateColumn("sum_cancel_count", gorm.Expr("sum_cancel_count + ?", count)).Error
  5255. if err != nil {
  5256. ut.Rollback()
  5257. return err
  5258. }
  5259. ut.Commit()
  5260. return err
  5261. }
  5262. func ModifyAddDrugOutReduceInfomation(id int64, count int64, orgid int64, storehouse_id int64) error {
  5263. ut := XTWriteDB().Begin()
  5264. err = ut.Model(&models.XtDrugStockCount{}).Where("drug_id = ? and status = 1 and user_org_id = ? and storehouse_id =?", id, orgid, storehouse_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count - ?", count)).Error
  5265. if err != nil {
  5266. ut.Rollback()
  5267. return err
  5268. }
  5269. ut.Commit()
  5270. return err
  5271. }
  5272. func ModifyAddDrugOutAddInfomation(id int64, count int64, orgid int64, storehouse_id int64) error {
  5273. ut := XTWriteDB().Begin()
  5274. err = ut.Model(&models.XtDrugStockCount{}).Where("drug_id = ? and status = 1 and user_org_id = ? and storehouse_id =?", id, orgid, storehouse_id).UpdateColumn("sum_out_count", gorm.Expr("sum_out_count + ?", count)).Error
  5275. if err != nil {
  5276. ut.Rollback()
  5277. return err
  5278. }
  5279. ut.Commit()
  5280. return err
  5281. }
  5282. func ModifyDrugCancelWarehouseInfo(id int64, count int64, orgid int64, storehouse_id int64) error {
  5283. ut := XTWriteDB().Begin()
  5284. err = ut.Model(&models.XtDrugStockCount{}).Where("drug_id = ? and status = 1 and user_org_id = ? and storehouse_id = ?", id, orgid, storehouse_id).UpdateColumn("sum_cancel_count", gorm.Expr("sum_cancel_count - ?", count)).Error
  5285. if err != nil {
  5286. ut.Rollback()
  5287. return err
  5288. }
  5289. ut.Commit()
  5290. return err
  5291. }
  5292. func ModifyGoodSumCount(storehouse_id int64, count int64, user_org_id int64, good_id int64) error {
  5293. ut := XTWriteDB().Begin()
  5294. err = ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id =?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_out_count", gorm.Expr("stock_out_count + ?", count)).Error
  5295. if err != nil {
  5296. ut.Rollback()
  5297. return err
  5298. }
  5299. err = ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id =?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_act_out_count", gorm.Expr("stock_act_out_count + ?", count)).Error
  5300. if err != nil {
  5301. ut.Rollback()
  5302. return err
  5303. }
  5304. ut.Commit()
  5305. return err
  5306. }
  5307. func ModifyReduceGoodSumCount(storehouse_id int64, count int64, user_org_id int64, good_id int64) error {
  5308. ut := XTWriteDB().Begin()
  5309. err = ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id =?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_out_count", gorm.Expr("stock_out_count - ?", count)).Error
  5310. if err != nil {
  5311. ut.Rollback()
  5312. return err
  5313. }
  5314. err = ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id =?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_act_out_count", gorm.Expr("stock_act_out_count - ?", count)).Error
  5315. if err != nil {
  5316. ut.Rollback()
  5317. return err
  5318. }
  5319. ut.Commit()
  5320. return err
  5321. }
  5322. func ModifyAddGoodSumCount(storehouse_id int64, count int64, user_org_id int64, good_id int64) error {
  5323. ut := XTWriteDB().Begin()
  5324. err = ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id =?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_out_count", gorm.Expr("stock_out_count - ?", count)).Error
  5325. if err != nil {
  5326. ut.Rollback()
  5327. return err
  5328. }
  5329. ut.Commit()
  5330. return err
  5331. }
  5332. func UpdateSumAddCancelCount(user_org_id int64, good_id int64, storehouse_id int64, count int64) error {
  5333. ut := XTWriteDB().Begin()
  5334. err := ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id = ?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_cancel_count", gorm.Expr("stock_cancel_count + ?", count)).Error
  5335. if err != nil {
  5336. ut.Rollback()
  5337. return err
  5338. }
  5339. ut.Commit()
  5340. return err
  5341. }
  5342. func UpdateSumReduceCancelCount(user_org_id int64, good_id int64, storehouse_id int64, count int64) error {
  5343. ut := XTWriteDB().Begin()
  5344. err := ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id = ?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_cancel_count", gorm.Expr("stock_cancel_count - ?", count)).Error
  5345. if err != nil {
  5346. ut.Rollback()
  5347. return err
  5348. }
  5349. ut.Commit()
  5350. return err
  5351. }
  5352. func UpdateSumAddOutCount(user_org_id int64, good_id int64, storehouse_id int64, count int64) error {
  5353. ut := XTWriteDB().Begin()
  5354. err := ut.Model(&models.XtGoodStockCount{}).Where("storehouse_id = ? and status = 1 and user_org_id = ? and good_id = ?", storehouse_id, user_org_id, good_id).UpdateColumn("stock_out_count", gorm.Expr("stock_out_count + ?", count)).Error
  5355. if err != nil {
  5356. ut.Rollback()
  5357. return err
  5358. }
  5359. ut.Commit()
  5360. return err
  5361. }
  5362. func FindDrugWarehouseInfoFlushCount(drug_id int64, orgid int64) (info []*models.DrugWarehouseInfo, err error) {
  5363. err = XTReadDB().Where("drug_id = ? and org_id = ? and status = 1 and is_check = 1", drug_id, orgid).Find(&info).Error
  5364. return info, err
  5365. }
  5366. func FindDrugWarehouseInfoFlushCountByStorehouse(drug_id int64, orgid int64, storehouse_id int64) (info []*models.DrugWarehouseInfo, err error) {
  5367. err = XTReadDB().Where("drug_id = ? and org_id = ? and status = 1 and is_check = 1 and storehouse_id =?", drug_id, orgid, storehouse_id).Find(&info).Error
  5368. return info, err
  5369. }
  5370. // 结算出库
  5371. func HisSettleDrugsDelivery(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo, order_id int64) (err error) {
  5372. // 1.判断药品是否来自专用字典的药品库
  5373. // 2.判断当天当前机构有没有创建出库单,没有则创建
  5374. // 3.创建出库流程
  5375. // 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
  5376. isHasWay := false
  5377. record_time := int64(0)
  5378. isHasWay = true
  5379. record_time = advice.RecordDate
  5380. if isHasWay {
  5381. //判断当天当前机构有没有创建结算出库单,没有则创建
  5382. out, err := FindDrugSettleStockOutByIsSys(orgID, 5, record_time)
  5383. houseConfig, _ := GetAllStoreHouseConfig(orgID)
  5384. if err == gorm.ErrRecordNotFound {
  5385. timeStr := time.Now().Format("2006-01-02")
  5386. timeArr := strings.Split(timeStr, "-")
  5387. total, _ := FindAllDrugWarehouseOut(orgID)
  5388. total = total + 1
  5389. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  5390. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  5391. number = number + total
  5392. warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
  5393. warehouseOut := models.DrugWarehouseOut{
  5394. WarehouseOutOrderNumber: warehousing_out_order,
  5395. OperationTime: time.Now().Unix(),
  5396. OrgId: orgID,
  5397. Creater: creater,
  5398. Ctime: time.Now().Unix(),
  5399. Status: 1,
  5400. WarehouseOutTime: record_time,
  5401. Dealer: 0,
  5402. Manufacturer: 0,
  5403. Type: 1, //结算出库
  5404. IsSys: 5,
  5405. StorehouseId: houseConfig.DrugStorehouseOut,
  5406. IsCheck: 1,
  5407. OrderId: order_id,
  5408. }
  5409. err := AddSigleDrugWarehouseOut(&warehouseOut)
  5410. if err != nil {
  5411. utils.TraceLog("创建出库单失败 err = %v", err)
  5412. return err
  5413. } else {
  5414. out = warehouseOut
  5415. }
  5416. }
  5417. // 出库流程
  5418. // 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  5419. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  5420. if drup.ID > 0 {
  5421. prescribingNumber := advice.PrescribingNumber
  5422. var prescribingNumberOne int64
  5423. prescribingCount_temp := strconv.FormatFloat(math.Abs(advice.PrescribingNumber), 'f', 0, 64)
  5424. prescribe_count, _ := strconv.ParseInt(prescribingCount_temp, 10, 64)
  5425. if advice.PrescribingNumberUnit == drup.MaxUnit && drup.MaxUnit != drup.MinUnit {
  5426. prescribingNumberOne = prescribe_count * drup.MinNumber
  5427. }
  5428. if advice.PrescribingNumberUnit == drup.MinUnit && drup.MaxUnit != drup.MinUnit {
  5429. prescribingNumberOne = prescribe_count
  5430. }
  5431. if advice.PrescribingNumberUnit == drup.MinUnit && drup.MaxUnit == drup.MinUnit {
  5432. prescribingNumberOne = prescribe_count
  5433. }
  5434. HisSettleDrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice, prescribingNumberOne)
  5435. } else {
  5436. return errors.New("药品信息不存在")
  5437. }
  5438. }
  5439. return
  5440. }
  5441. // 耗材结算出库
  5442. func ConsumableSettleDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, creator int64, order_id int64) (err error) {
  5443. var deliver_number int64 = 0
  5444. var stock_number int64 = 0
  5445. var maxNumber int64 = 0
  5446. fmt.Println("223323233233223233223233223woo", goods.Count)
  5447. deliver_number = goods.Count
  5448. // 根据先进先出原则,查询最先入库的批次,进行出库
  5449. // 如果没有对应的库存,则报错
  5450. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  5451. if err != nil {
  5452. goodErrcode := models.XtGoodErrcode{
  5453. UserOrgId: goods.UserOrgId,
  5454. Errcode: "查询库存信息报错",
  5455. GoodId: goods.GoodId,
  5456. Status: 1,
  5457. Ctime: time.Now().Unix(),
  5458. Mtime: 0,
  5459. Count: 0,
  5460. StockCount: 0,
  5461. Creater: creator,
  5462. BatchNumberId: warehouse.ID,
  5463. WarehouseOutId: 0,
  5464. }
  5465. CreateGoodErrcode(goodErrcode)
  5466. return err
  5467. }
  5468. stock_number = warehouse.StockCount
  5469. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  5470. fmt.Println("stock_numnber233232232323", stock_number)
  5471. fmt.Println("deliver_nmuberwooeooo2oo23", deliver_number)
  5472. if stock_number >= deliver_number {
  5473. maxNumber = goods.Count
  5474. warehouse.StockCount = warehouse.StockCount - maxNumber
  5475. warehouse.Mtime = time.Now().Unix()
  5476. //扣减库存
  5477. errThree := UpDateWarehouseInfoByStock(&warehouse)
  5478. if errThree != nil {
  5479. goodErrcode := models.XtGoodErrcode{
  5480. UserOrgId: goods.UserOrgId,
  5481. Errcode: "扣减库存失败",
  5482. GoodId: goods.GoodId,
  5483. Status: 1,
  5484. Ctime: time.Now().Unix(),
  5485. Mtime: 0,
  5486. Count: 0,
  5487. StockCount: 0,
  5488. Creater: creator,
  5489. BatchNumberId: warehouse.ID,
  5490. WarehouseOutId: 0,
  5491. }
  5492. CreateGoodErrcode(goodErrcode)
  5493. return errThree
  5494. }
  5495. //查询剩余库存
  5496. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  5497. var sum_count int64
  5498. for _, item := range goodList {
  5499. sum_count += item.StockCount
  5500. }
  5501. warehouseOutInfo := &models.WarehouseOutInfo{
  5502. WarehouseInfotId: warehouse.ID,
  5503. }
  5504. //添加入库单详情ID
  5505. errOne := UpdatedSigleWarehouseOutInfo(goods.ID, warehouseOutInfo)
  5506. if errOne != nil {
  5507. goodErrcode := models.XtGoodErrcode{
  5508. UserOrgId: goods.UserOrgId,
  5509. Errcode: "添加入库单详情ID",
  5510. GoodId: goods.GoodId,
  5511. Status: 1,
  5512. Ctime: time.Now().Unix(),
  5513. Mtime: 0,
  5514. Count: 0,
  5515. StockCount: 0,
  5516. Creater: creator,
  5517. BatchNumberId: warehouse.ID,
  5518. WarehouseOutId: 0,
  5519. }
  5520. CreateGoodErrcode(goodErrcode)
  5521. return errOne
  5522. }
  5523. OutInfo := &models.WarehouseOutInfo{
  5524. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5525. WarehouseOutId: warehouseOut.ID,
  5526. WarehouseInfotId: warehouse.ID,
  5527. Status: 1,
  5528. Ctime: time.Now().Unix(),
  5529. Remark: warehouse.Remark,
  5530. OrgId: orgID,
  5531. Type: 1,
  5532. Manufacturer: warehouse.Manufacturer,
  5533. Dealer: warehouse.Dealer,
  5534. IsSys: 5,
  5535. SysRecordTime: record_time,
  5536. GoodTypeId: goods.GoodTypeId,
  5537. GoodId: goods.GoodId,
  5538. PatientId: patient_id,
  5539. Number: warehouse.Number,
  5540. LicenseNumber: warehouse.LicenseNumber,
  5541. Price: warehouse.PackingPrice,
  5542. ExpiryDate: warehouse.ExpiryDate,
  5543. ProductDate: warehouse.ProductDate,
  5544. ProjectId: goods.ProjectId,
  5545. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5546. StorehouseId: goods.StorehouseId,
  5547. IsCheck: 1,
  5548. OverCount: sum_count,
  5549. RegisterNumber: warehouse.RegisterNumber,
  5550. OrderId: order_id,
  5551. }
  5552. fmt.Println("goods.count2323232233232233232322332322332", goods.Count)
  5553. OutInfo.Count = goods.Count
  5554. AddSigleWarehouseOutInfo(OutInfo)
  5555. stockFlow := models.VmStockFlow{
  5556. WarehousingId: warehouse.ID,
  5557. GoodId: goods.GoodId,
  5558. Number: warehouse.Number,
  5559. LicenseNumber: warehouse.LicenseNumber,
  5560. Count: goods.Count,
  5561. UserOrgId: orgID,
  5562. PatientId: patient_id,
  5563. SystemTime: record_time,
  5564. ConsumableType: 15,
  5565. IsSys: 5,
  5566. WarehousingOrder: warehouse.WarehousingOrder,
  5567. WarehouseOutId: warehouseOut.ID,
  5568. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5569. IsEdit: 1,
  5570. CancelStockId: 0,
  5571. CancelOrderNumber: "",
  5572. Manufacturer: warehouse.Manufacturer,
  5573. Dealer: warehouse.Dealer,
  5574. Creator: creator,
  5575. UpdateCreator: 0,
  5576. Status: 1,
  5577. Ctime: time.Now().Unix(),
  5578. Mtime: 0,
  5579. Price: warehouse.PackingPrice, //零售价
  5580. WarehousingDetailId: warehouse.ID,
  5581. WarehouseOutDetailId: goods.ID,
  5582. CancelOutDetailId: 0,
  5583. ProductDate: warehouse.ProductDate,
  5584. ExpireDate: warehouse.ExpiryDate,
  5585. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5586. StorehouseId: warehouse.StorehouseId,
  5587. AdminUserId: creator,
  5588. BuyPrice: warehouse.Price, //进货价
  5589. StockCount: "",
  5590. BatchNumberCount: warehouse.StockCount - goods.Count,
  5591. IsCheck: 1,
  5592. OverCount: sum_count,
  5593. RegisterNumber: warehouse.RegisterNumber,
  5594. OrderId: order_id,
  5595. ProjectId: goods.ProjectId,
  5596. }
  5597. //创建出库流水
  5598. errflow := CreateStockFlowOne(stockFlow)
  5599. if errflow != nil {
  5600. goodErrcode := models.XtGoodErrcode{
  5601. UserOrgId: orgID,
  5602. Errcode: "创建流水报错",
  5603. GoodId: goods.GoodId,
  5604. Status: 1,
  5605. Ctime: time.Now().Unix(),
  5606. Mtime: 0,
  5607. Count: 0,
  5608. StockCount: 0,
  5609. Creater: creator,
  5610. BatchNumberId: warehouse.ID,
  5611. WarehouseOutId: 0,
  5612. }
  5613. CreateGoodErrcode(goodErrcode)
  5614. }
  5615. //添加入库ID
  5616. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, orgID, sum_count)
  5617. if errWarehouse != nil {
  5618. goodErrcode := models.XtGoodErrcode{
  5619. UserOrgId: orgID,
  5620. Errcode: "添加入库ID报错",
  5621. GoodId: goods.GoodId,
  5622. Status: 1,
  5623. Ctime: time.Now().Unix(),
  5624. Mtime: 0,
  5625. Count: 0,
  5626. StockCount: 0,
  5627. Creater: creator,
  5628. BatchNumberId: warehouse.ID,
  5629. WarehouseOutId: 0,
  5630. }
  5631. CreateGoodErrcode(goodErrcode)
  5632. }
  5633. //更新出库数量
  5634. errsumcode := ModifyGoodSumCount(goods.StorehouseId, goods.Count, orgID, goods.GoodId)
  5635. if errsumcode != nil {
  5636. goodErrcode := models.XtGoodErrcode{
  5637. UserOrgId: orgID,
  5638. Errcode: "更新出库数量报错",
  5639. GoodId: goods.GoodId,
  5640. Status: 1,
  5641. Ctime: time.Now().Unix(),
  5642. Mtime: 0,
  5643. Count: 0,
  5644. StockCount: 0,
  5645. Creater: creator,
  5646. BatchNumberId: warehouse.ID,
  5647. WarehouseOutId: 0,
  5648. }
  5649. CreateGoodErrcode(goodErrcode)
  5650. }
  5651. if warehouse.StockCount < maxNumber {
  5652. goodErrcode := models.XtGoodErrcode{
  5653. UserOrgId: orgID,
  5654. Errcode: "出库接口库存数量不足",
  5655. GoodId: goods.GoodId,
  5656. Status: 1,
  5657. Ctime: time.Now().Unix(),
  5658. Mtime: 0,
  5659. Count: 0,
  5660. StockCount: 0,
  5661. Creater: creator,
  5662. BatchNumberId: warehouse.ID,
  5663. WarehouseOutId: 0,
  5664. }
  5665. CreateGoodErrcode(goodErrcode)
  5666. return errors.New("库存数量不足")
  5667. }
  5668. return nil
  5669. } else {
  5670. // 出库完成后,要将该批次库存清零
  5671. warehouse.StockCount = 0
  5672. warehouse.Mtime = time.Now().Unix()
  5673. errThree := UpDateWarehouseInfoByStock(&warehouse)
  5674. if errThree != nil {
  5675. goodErrcode := models.XtGoodErrcode{
  5676. UserOrgId: orgID,
  5677. Errcode: "扣减库存报错",
  5678. GoodId: goods.GoodId,
  5679. Status: 1,
  5680. Ctime: time.Now().Unix(),
  5681. Mtime: 0,
  5682. Count: 0,
  5683. StockCount: 0,
  5684. Creater: creator,
  5685. BatchNumberId: warehouse.ID,
  5686. WarehouseOutId: 0,
  5687. }
  5688. CreateGoodErrcode(goodErrcode)
  5689. return errThree
  5690. }
  5691. //查询剩余库存
  5692. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  5693. var sum_count int64
  5694. for _, item := range goodList {
  5695. sum_count += item.StockCount
  5696. }
  5697. OutInfo := &models.WarehouseOutInfo{
  5698. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5699. WarehouseOutId: warehouseOut.ID,
  5700. WarehouseInfotId: warehouse.ID,
  5701. Status: 1,
  5702. Ctime: time.Now().Unix(),
  5703. Remark: warehouse.Remark,
  5704. OrgId: orgID,
  5705. Type: 1,
  5706. Manufacturer: warehouse.Manufacturer,
  5707. Dealer: warehouse.Dealer,
  5708. IsSys: 5,
  5709. SysRecordTime: record_time,
  5710. GoodTypeId: goods.GoodTypeId,
  5711. GoodId: goods.GoodId,
  5712. PatientId: patient_id,
  5713. Number: warehouse.Number,
  5714. LicenseNumber: warehouse.LicenseNumber,
  5715. Price: warehouse.PackingPrice,
  5716. ExpiryDate: warehouse.ExpiryDate,
  5717. ProductDate: warehouse.ProductDate,
  5718. ProjectId: goods.ProjectId,
  5719. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5720. StorehouseId: goods.StorehouseId,
  5721. IsCheck: 1,
  5722. OverCount: sum_count,
  5723. RegisterNumber: warehouse.RegisterNumber,
  5724. OrderId: order_id,
  5725. }
  5726. OutInfo.Count = stock_number
  5727. AddSigleWarehouseOutInfo(OutInfo)
  5728. stockFlow := models.VmStockFlow{
  5729. WarehousingId: warehouse.ID,
  5730. GoodId: goods.GoodId,
  5731. Number: warehouse.Number,
  5732. LicenseNumber: warehouse.LicenseNumber,
  5733. Count: stock_number,
  5734. UserOrgId: orgID,
  5735. PatientId: patient_id,
  5736. SystemTime: record_time,
  5737. ConsumableType: 15,
  5738. IsSys: 5,
  5739. WarehousingOrder: warehouse.WarehousingOrder,
  5740. WarehouseOutId: warehouseOut.ID,
  5741. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5742. IsEdit: 1,
  5743. CancelStockId: 0,
  5744. CancelOrderNumber: "",
  5745. Manufacturer: warehouse.Manufacturer,
  5746. Dealer: warehouse.Dealer,
  5747. Creator: creator,
  5748. UpdateCreator: 0,
  5749. Status: 1,
  5750. Ctime: time.Now().Unix(),
  5751. Mtime: 0,
  5752. Price: warehouse.PackingPrice, //零售价
  5753. WarehousingDetailId: warehouse.ID,
  5754. WarehouseOutDetailId: goods.ID,
  5755. CancelOutDetailId: 0,
  5756. ProductDate: warehouse.ProductDate,
  5757. ExpireDate: warehouse.ExpiryDate,
  5758. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5759. StorehouseId: warehouse.StorehouseId,
  5760. AdminUserId: creator,
  5761. BuyPrice: warehouse.Price, //进货价
  5762. StockCount: "",
  5763. BatchNumberCount: 0,
  5764. IsCheck: 1,
  5765. OverCount: sum_count,
  5766. RegisterNumber: warehouse.RegisterNumber,
  5767. OrderId: order_id,
  5768. ProjectId: goods.ProjectId,
  5769. }
  5770. //创建出库流水
  5771. errflow := CreateStockFlowOne(stockFlow)
  5772. if errflow != nil {
  5773. goodErrcode := models.XtGoodErrcode{
  5774. UserOrgId: orgID,
  5775. Errcode: "创建出库流水报错",
  5776. GoodId: goods.GoodId,
  5777. Status: 1,
  5778. Ctime: time.Now().Unix(),
  5779. Mtime: 0,
  5780. Count: 0,
  5781. StockCount: 0,
  5782. Creater: creator,
  5783. BatchNumberId: warehouse.ID,
  5784. WarehouseOutId: 0,
  5785. }
  5786. CreateGoodErrcode(goodErrcode)
  5787. }
  5788. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, orgID, sum_count)
  5789. if errWarehouse != nil {
  5790. goodErrcode := models.XtGoodErrcode{
  5791. UserOrgId: orgID,
  5792. Errcode: "添加入库ID报错",
  5793. GoodId: goods.GoodId,
  5794. Status: 1,
  5795. Ctime: time.Now().Unix(),
  5796. Mtime: 0,
  5797. Count: 0,
  5798. StockCount: 0,
  5799. Creater: creator,
  5800. BatchNumberId: warehouse.ID,
  5801. WarehouseOutId: 0,
  5802. }
  5803. CreateGoodErrcode(goodErrcode)
  5804. }
  5805. //更新出库数量
  5806. errcodecout := ModifyGoodSumCount(goods.StorehouseId, stock_number, orgID, goods.GoodId)
  5807. if errcodecout != nil {
  5808. goodErrcode := models.XtGoodErrcode{
  5809. UserOrgId: orgID,
  5810. Errcode: "更新出库数量报错",
  5811. GoodId: goods.GoodId,
  5812. Status: 1,
  5813. Ctime: time.Now().Unix(),
  5814. Mtime: 0,
  5815. Count: 0,
  5816. StockCount: 0,
  5817. Creater: creator,
  5818. BatchNumberId: warehouse.ID,
  5819. WarehouseOutId: 0,
  5820. }
  5821. CreateGoodErrcode(goodErrcode)
  5822. }
  5823. }
  5824. goods.Count = deliver_number - stock_number
  5825. prepare := &models.DialysisBeforePrepare{
  5826. Count: deliver_number - stock_number,
  5827. GoodTypeId: goods.GoodTypeId,
  5828. GoodId: goods.GoodId,
  5829. PatientId: goods.PatientId,
  5830. RecordDate: goods.RecordDate,
  5831. UserOrgId: orgID,
  5832. Ctime: time.Now().Unix(),
  5833. Creater: goods.Creater,
  5834. CommdityCode: goods.CommdityCode,
  5835. Status: 1,
  5836. StorehouseId: goods.StorehouseId,
  5837. }
  5838. ConsumableSettleDelivery(orgID, patient_id, record_time, prepare, warehouseOut, creator, order_id)
  5839. return nil
  5840. }
  5841. // 保存处方出库
  5842. func ConsumablePrescriptionDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, creator int64, count int64) (err error) {
  5843. var deliver_number int64 = 0
  5844. var stock_number int64 = 0
  5845. var maxNumber int64 = 0
  5846. deliver_number = goods.Count
  5847. // 根据先进先出原则,查询最先入库的批次,进行出库
  5848. // 如果没有对应的库存,则报错
  5849. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId, goods.StorehouseId)
  5850. if err != nil {
  5851. goodErrcode := models.XtGoodErrcode{
  5852. UserOrgId: goods.UserOrgId,
  5853. Errcode: "查询库存信息报错",
  5854. GoodId: goods.GoodId,
  5855. Status: 1,
  5856. Ctime: time.Now().Unix(),
  5857. Mtime: 0,
  5858. Count: 0,
  5859. StockCount: 0,
  5860. Creater: creator,
  5861. BatchNumberId: warehouse.ID,
  5862. WarehouseOutId: 0,
  5863. }
  5864. CreateGoodErrcode(goodErrcode)
  5865. return err
  5866. }
  5867. stock_number = warehouse.StockCount
  5868. fmt.Println("sotck_number233223322o", stock_number)
  5869. fmt.Println("deliver_number", deliver_number)
  5870. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  5871. if stock_number >= deliver_number {
  5872. maxNumber = goods.Count
  5873. warehouse.StockCount = warehouse.StockCount - maxNumber
  5874. warehouse.Mtime = time.Now().Unix()
  5875. //扣减库存
  5876. errThree := UpDateWarehouseInfoByStock(&warehouse)
  5877. if errThree != nil {
  5878. goodErrcode := models.XtGoodErrcode{
  5879. UserOrgId: goods.UserOrgId,
  5880. Errcode: "扣减库存失败",
  5881. GoodId: goods.GoodId,
  5882. Status: 1,
  5883. Ctime: time.Now().Unix(),
  5884. Mtime: 0,
  5885. Count: 0,
  5886. StockCount: 0,
  5887. Creater: creator,
  5888. BatchNumberId: warehouse.ID,
  5889. WarehouseOutId: 0,
  5890. }
  5891. CreateGoodErrcode(goodErrcode)
  5892. return errThree
  5893. }
  5894. //查询剩余库存
  5895. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  5896. var sum_count int64
  5897. for _, item := range goodList {
  5898. sum_count += item.StockCount
  5899. }
  5900. //查询已经出库的数据
  5901. flowGood, _ := GetStockFlowIsBatchNumberSix(patient_id, record_time, goods.GoodId, goods.ProjectId)
  5902. var out_count int64
  5903. var out_count_one int64
  5904. for _, item := range flowGood {
  5905. out_count += item.Count
  5906. }
  5907. //查询退库数据
  5908. flowGoodTwo, _ := GetStockFlowIsBatchNumberFour(patient_id, record_time, goods.GoodId, goods.ProjectId)
  5909. for _, item := range flowGoodTwo {
  5910. out_count_one += item.Count
  5911. }
  5912. //flowGood, _ := GetStockFlowIsBatchNumberSeventy(patient_id, record_time, goods.GoodId, goods.ProjectId)
  5913. //
  5914. //var out_count int64
  5915. //var out_count_one int64
  5916. var out_count_two int64
  5917. //
  5918. //for _, item := range flowGood {
  5919. // out_count += item.Count
  5920. //}
  5921. //查询退库数据
  5922. //flowGoodTwo, _ := GetStockFlowIsBatchNumberFourty(patient_id, record_time, goods.GoodId, goods.ProjectId)
  5923. //for _, item := range flowGoodTwo {
  5924. // out_count_one += item.Count
  5925. //}
  5926. wareOutList, _ := GetStockFlowIsBatchNumberSixty(patient_id, record_time, goods.GoodId, goods.ProjectId)
  5927. for _, item := range wareOutList {
  5928. out_count_two += item.Count
  5929. }
  5930. OutInfo := &models.WarehouseOutInfo{
  5931. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5932. WarehouseOutId: warehouseOut.ID,
  5933. WarehouseInfotId: warehouse.ID,
  5934. Status: 1,
  5935. Ctime: time.Now().Unix(),
  5936. Remark: warehouse.Remark,
  5937. OrgId: orgID,
  5938. Type: 1,
  5939. Manufacturer: warehouse.Manufacturer,
  5940. Dealer: warehouse.Dealer,
  5941. IsSys: 1,
  5942. SysRecordTime: record_time,
  5943. GoodTypeId: goods.GoodTypeId,
  5944. GoodId: goods.GoodId,
  5945. PatientId: patient_id,
  5946. Number: warehouse.Number,
  5947. LicenseNumber: warehouse.LicenseNumber,
  5948. Price: warehouse.PackingPrice,
  5949. ExpiryDate: warehouse.ExpiryDate,
  5950. ProductDate: warehouse.ProductDate,
  5951. ProjectId: goods.ProjectId,
  5952. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  5953. StorehouseId: goods.StorehouseId,
  5954. IsCheck: 1,
  5955. OverCount: sum_count,
  5956. RegisterNumber: warehouse.RegisterNumber,
  5957. }
  5958. OutInfo.Count = count - out_count_two + out_count_one
  5959. _, errcodes := GetNewWarehouseOutInfoIsExistSix(goods.GoodId, patient_id, record_time, goods.ProjectId, warehouse.ID)
  5960. if errcodes == gorm.ErrRecordNotFound {
  5961. errOne := AddSigleWarehouseOutInfo(OutInfo)
  5962. if errOne != nil {
  5963. return errOne
  5964. }
  5965. } else if errcodes == nil {
  5966. outInfoOne, _ := GetWarehouseOutInfoIsExistThree(goods.GoodId, patient_id, record_time, goods.ProjectId)
  5967. if count != outInfoOne.Count {
  5968. UpdatedWarehouseOutInfo(OutInfo, goods.GoodId, patient_id, record_time, goods.ProjectId)
  5969. }
  5970. }
  5971. lastOut, _ := FindWarehouseOutInfoByPatientIdTwo(patient_id, record_time, goods.GoodId, orgID, goods.ProjectId)
  5972. //如果本次出库数据大于历史出库数据 新增1条流水
  5973. fmt.Println("本次出库数据", count)
  5974. fmt.Println("历史出库数据", out_count)
  5975. fmt.Println("退库数据", out_count_one)
  5976. if count > (out_count - out_count_one) {
  5977. stockFlow := models.VmStockFlow{
  5978. WarehousingId: warehouse.ID,
  5979. GoodId: goods.GoodId,
  5980. Number: warehouse.Number,
  5981. LicenseNumber: warehouse.LicenseNumber,
  5982. Count: count - out_count + out_count_one,
  5983. UserOrgId: orgID,
  5984. PatientId: goods.PatientId,
  5985. SystemTime: record_time,
  5986. ConsumableType: 3,
  5987. IsSys: 1,
  5988. WarehousingOrder: warehouse.WarehousingOrder,
  5989. WarehouseOutId: warehouseOut.ID,
  5990. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  5991. IsEdit: 1,
  5992. CancelStockId: 0,
  5993. CancelOrderNumber: "",
  5994. Manufacturer: warehouse.Manufacturer,
  5995. Dealer: warehouse.Dealer,
  5996. Creator: creator,
  5997. UpdateCreator: 0,
  5998. Status: 1,
  5999. Ctime: time.Now().Unix(),
  6000. Mtime: 0,
  6001. Price: warehouse.PackingPrice, //零售价
  6002. WarehousingDetailId: warehouse.ID,
  6003. WarehouseOutDetailId: goods.ID,
  6004. CancelOutDetailId: 0,
  6005. ProductDate: warehouse.ProductDate,
  6006. ExpireDate: warehouse.ExpiryDate,
  6007. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  6008. StorehouseId: warehouse.StorehouseId,
  6009. AdminUserId: creator,
  6010. BuyPrice: warehouse.Price, //进货价
  6011. StockCount: "",
  6012. BatchNumberCount: warehouse.StockCount - goods.Count,
  6013. IsCheck: 1,
  6014. OverCount: sum_count,
  6015. RegisterNumber: warehouse.RegisterNumber,
  6016. ProjectId: goods.ProjectId,
  6017. }
  6018. //创建出库流水
  6019. errflow := CreateStockFlowOne(stockFlow)
  6020. if errflow != nil {
  6021. goodErrcode := models.XtGoodErrcode{
  6022. UserOrgId: orgID,
  6023. Errcode: "创建流水报错",
  6024. GoodId: goods.GoodId,
  6025. Status: 1,
  6026. Ctime: time.Now().Unix(),
  6027. Mtime: 0,
  6028. Count: 0,
  6029. StockCount: 0,
  6030. Creater: creator,
  6031. BatchNumberId: warehouse.ID,
  6032. WarehouseOutId: 0,
  6033. }
  6034. CreateGoodErrcode(goodErrcode)
  6035. }
  6036. fmt.Println("stockFlow.Count233232323232322323232332wo0-----------------------", stockFlow.Count)
  6037. //更新出库数量
  6038. errsumcode := ModifyGoodSumCount(goods.StorehouseId, stockFlow.Count, orgID, goods.GoodId)
  6039. if errsumcode != nil {
  6040. goodErrcode := models.XtGoodErrcode{
  6041. UserOrgId: orgID,
  6042. Errcode: "更新出库数量报错",
  6043. GoodId: goods.GoodId,
  6044. Status: 1,
  6045. Ctime: time.Now().Unix(),
  6046. Mtime: 0,
  6047. Count: 0,
  6048. StockCount: 0,
  6049. Creater: creator,
  6050. BatchNumberId: warehouse.ID,
  6051. WarehouseOutId: 0,
  6052. }
  6053. CreateGoodErrcode(goodErrcode)
  6054. }
  6055. }
  6056. //如果本次出库数据小于历史出库数据 新增1条退库流水
  6057. if count < (out_count - out_count_one) {
  6058. operation_time := time.Now().Unix()
  6059. //创建退库单
  6060. timeStr := time.Now().Format("2006-01-02")
  6061. timeArr := strings.Split(timeStr, "-")
  6062. total, _ := FindAllCancelStockTotal(orgID)
  6063. total = total + 1
  6064. orderNumber := "CKTKD" + strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10)
  6065. cancelStock := models.CancelStock{
  6066. OrderNumber: orderNumber,
  6067. OperaTime: operation_time,
  6068. OrgId: orgID,
  6069. Creater: warehouseOut.Creater,
  6070. Ctime: time.Now().Unix(),
  6071. Status: 1,
  6072. ReturnTime: record_time,
  6073. Type: 1,
  6074. StorehouseId: goods.StorehouseId,
  6075. IsCheck: 1,
  6076. }
  6077. _, msgerrkonde := GetCancelStockDetailByOrderNumberOne(record_time, orgID)
  6078. if msgerrkonde == gorm.ErrRecordNotFound {
  6079. AddSigleCancelStock(&cancelStock)
  6080. }
  6081. cancel, _ := GetLastCancelStockById(orgID)
  6082. manufacturer, _ := GetManufactureById(warehouse.Manufacturer)
  6083. deaerler, _ := GetDealerById(warehouse.Dealer)
  6084. cancelStockInfo := models.CancelStockInfo{
  6085. GoodId: goods.GoodId,
  6086. CancelStockId: cancel.ID,
  6087. GoodTypeId: goods.GoodTypeId,
  6088. Count: out_count - out_count_one - count,
  6089. Price: warehouse.PackingPrice,
  6090. Total: 0,
  6091. ProductDate: warehouse.ProductDate,
  6092. ExpiryDate: warehouse.ExpiryDate,
  6093. Ctime: time.Now().Unix(),
  6094. Status: 1,
  6095. OrgId: orgID,
  6096. OrderNumber: cancel.OrderNumber,
  6097. Type: 0,
  6098. Dealer: deaerler.DealerName,
  6099. Manufacturer: manufacturer.ManufacturerName,
  6100. Number: warehouse.Number,
  6101. RegisterAccount: "",
  6102. Remark: "",
  6103. WarehouseInfoId: warehouse.ID,
  6104. PatientId: patient_id,
  6105. RecordDate: record_time,
  6106. StorehouseId: goods.StorehouseId,
  6107. IsCheck: 1,
  6108. }
  6109. if orgID == 9671 || orgID == 10265 {
  6110. goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId)
  6111. cancelStockInfo.Price = goodsInfo.PackingPrice
  6112. }
  6113. CreateCancelStockInfoOne(&cancelStockInfo)
  6114. cancelInfo, _ := GetLastCancelStockInfoByGoodId(goods.GoodId)
  6115. flow := models.VmStockFlow{
  6116. WarehousingId: warehouse.ID,
  6117. GoodId: goods.GoodId,
  6118. Number: warehouse.Number,
  6119. LicenseNumber: warehouse.LicenseNumber,
  6120. Count: out_count - out_count_one - count,
  6121. UserOrgId: orgID,
  6122. PatientId: patient_id,
  6123. SystemTime: record_time,
  6124. ConsumableType: 7,
  6125. IsSys: 1,
  6126. WarehousingOrder: "",
  6127. WarehouseOutId: lastOut.WarehouseOutId,
  6128. WarehouseOutOrderNumber: lastOut.WarehouseOutOrderNumber,
  6129. IsEdit: 0,
  6130. CancelStockId: cancel.ID,
  6131. CancelOrderNumber: cancel.OrderNumber,
  6132. Manufacturer: manufacturer.ID,
  6133. Dealer: 0,
  6134. Creator: warehouseOut.Creater,
  6135. UpdateCreator: 0,
  6136. Status: 1,
  6137. Ctime: time.Now().Unix(),
  6138. Mtime: 0,
  6139. Price: warehouse.PackingPrice,
  6140. WarehousingDetailId: warehouse.ID,
  6141. WarehouseOutDetailId: lastOut.ID,
  6142. CancelOutDetailId: cancelInfo.ID,
  6143. ProductDate: warehouse.ProductDate,
  6144. ExpireDate: warehouse.ExpiryDate,
  6145. StorehouseId: goods.StorehouseId,
  6146. BuyPrice: warehouse.Price,
  6147. ProjectId: goods.ProjectId,
  6148. OverCount: sum_count,
  6149. RegisterNumber: warehouse.RegisterNumber,
  6150. }
  6151. if orgID == 9671 || orgID == 10265 {
  6152. goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId)
  6153. flow.Price = goodsInfo.PackingPrice
  6154. flow.BuyPrice = goodsInfo.BuyPrice
  6155. }
  6156. CreateStockFlowOne(flow)
  6157. //退库数量增加
  6158. UpdateSumAddCancelCount(orgID, goods.GoodId, goods.StorehouseId, flow.Count)
  6159. ModifyAddGoodSumCount(goods.StorehouseId, flow.Count, orgID, goods.GoodId)
  6160. }
  6161. //添加入库ID
  6162. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, orgID, sum_count)
  6163. if errWarehouse != nil {
  6164. goodErrcode := models.XtGoodErrcode{
  6165. UserOrgId: orgID,
  6166. Errcode: "添加入库ID报错",
  6167. GoodId: goods.GoodId,
  6168. Status: 1,
  6169. Ctime: time.Now().Unix(),
  6170. Mtime: 0,
  6171. Count: 0,
  6172. StockCount: 0,
  6173. Creater: creator,
  6174. BatchNumberId: warehouse.ID,
  6175. WarehouseOutId: 0,
  6176. }
  6177. CreateGoodErrcode(goodErrcode)
  6178. }
  6179. if warehouse.StockCount < maxNumber {
  6180. goodErrcode := models.XtGoodErrcode{
  6181. UserOrgId: orgID,
  6182. Errcode: "出库接口库存数量不足",
  6183. GoodId: goods.GoodId,
  6184. Status: 1,
  6185. Ctime: time.Now().Unix(),
  6186. Mtime: 0,
  6187. Count: 0,
  6188. StockCount: 0,
  6189. Creater: creator,
  6190. BatchNumberId: warehouse.ID,
  6191. WarehouseOutId: 0,
  6192. }
  6193. CreateGoodErrcode(goodErrcode)
  6194. return errors.New("库存数量不足")
  6195. }
  6196. return nil
  6197. } else {
  6198. // 出库完成后,要将该批次库存清零
  6199. warehouse.StockCount = 0
  6200. warehouse.Mtime = time.Now().Unix()
  6201. errThree := UpDateWarehouseInfoByStock(&warehouse)
  6202. if errThree != nil {
  6203. goodErrcode := models.XtGoodErrcode{
  6204. UserOrgId: orgID,
  6205. Errcode: "扣减库存报错",
  6206. GoodId: goods.GoodId,
  6207. Status: 1,
  6208. Ctime: time.Now().Unix(),
  6209. Mtime: 0,
  6210. Count: 0,
  6211. StockCount: 0,
  6212. Creater: creator,
  6213. BatchNumberId: warehouse.ID,
  6214. WarehouseOutId: 0,
  6215. }
  6216. CreateGoodErrcode(goodErrcode)
  6217. return errThree
  6218. }
  6219. //查询剩余库存
  6220. goodList, _ := GetAllGoodSumCount(goods.GoodId, orgID, goods.StorehouseId)
  6221. var sum_count int64
  6222. for _, item := range goodList {
  6223. sum_count += item.StockCount
  6224. }
  6225. fmt.Println("剩余库存", sum_count)
  6226. OutInfo := &models.WarehouseOutInfo{
  6227. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  6228. WarehouseOutId: warehouseOut.ID,
  6229. WarehouseInfotId: warehouse.ID,
  6230. Status: 1,
  6231. Ctime: time.Now().Unix(),
  6232. Remark: warehouse.Remark,
  6233. OrgId: orgID,
  6234. Type: 1,
  6235. Manufacturer: warehouse.Manufacturer,
  6236. Dealer: warehouse.Dealer,
  6237. IsSys: 1,
  6238. SysRecordTime: record_time,
  6239. GoodTypeId: goods.GoodTypeId,
  6240. GoodId: goods.GoodId,
  6241. PatientId: patient_id,
  6242. Number: warehouse.Number,
  6243. LicenseNumber: warehouse.LicenseNumber,
  6244. Price: warehouse.PackingPrice,
  6245. ExpiryDate: warehouse.ExpiryDate,
  6246. ProductDate: warehouse.ProductDate,
  6247. ProjectId: goods.ProjectId,
  6248. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  6249. StorehouseId: goods.StorehouseId,
  6250. IsCheck: 1,
  6251. OverCount: sum_count,
  6252. RegisterNumber: warehouse.RegisterNumber,
  6253. }
  6254. OutInfo.Count = stock_number
  6255. _, errcodes := GetNewWarehouseOutInfoIsExistSix(goods.GoodId, patient_id, record_time, goods.ProjectId, warehouse.ID)
  6256. if errcodes == gorm.ErrRecordNotFound {
  6257. errOne := AddSigleWarehouseOutInfo(OutInfo)
  6258. if errOne != nil {
  6259. return errOne
  6260. }
  6261. } else if errcodes == nil {
  6262. outInfoOne, _ := GetWarehouseOutInfoIsExistTen(goods.GoodId, patient_id, record_time, goods.ProjectId, warehouse.ID)
  6263. if count != outInfoOne.Count {
  6264. UpdatedWarehouseOutInfoSix(OutInfo, goods.GoodId, patient_id, record_time, goods.ProjectId, warehouse.ID)
  6265. }
  6266. }
  6267. lastOut, _ := FindWarehouseOutInfoByPatientIdTwo(patient_id, record_time, goods.GoodId, orgID, goods.ProjectId)
  6268. //查询该该批次已经出库的数据
  6269. //flowGood, _ := GetStockFlowIsBatchNumber(warehouse.ID, patient_id, record_time, goods.GoodId)
  6270. //查询已经出库的数据
  6271. //flowGood, _ := GetStockFlowIsBatchNumberSeventy(patient_id, record_time, goods.GoodId, goods.ProjectId)
  6272. //var out_count int64
  6273. //var out_count_one int64
  6274. //for _, item := range flowGood {
  6275. // out_count += item.Count
  6276. //}
  6277. //flowGoodTwo, _ := GetStockFlowIsBatchNumberSix(patient_id, record_time, goods.GoodId, goods.ProjectId)
  6278. //for _, item := range flowGoodTwo {
  6279. // out_count_one += item.Count
  6280. //}
  6281. //查询该该批次已经出库的数据
  6282. flowGood, _ := GetStockFlowIsBatchNumberSix(patient_id, record_time, goods.GoodId, goods.ProjectId)
  6283. var out_count int64
  6284. var out_count_one int64
  6285. for _, item := range flowGood {
  6286. out_count += item.Count
  6287. }
  6288. flowGoodTwo, _ := GetStockFlowIsBatchNumberFour(patient_id, record_time, goods.GoodId, goods.ProjectId)
  6289. for _, item := range flowGoodTwo {
  6290. out_count_one += item.Count
  6291. }
  6292. fmt.Println("count----------------", count)
  6293. fmt.Println("out_count----------", out_count)
  6294. fmt.Println("out_count_one--------", out_count_one)
  6295. //如果出库数量 大于 历史出库数据 新增1条流水
  6296. if count > out_count-out_count_one {
  6297. stockFlow := models.VmStockFlow{
  6298. WarehousingId: warehouse.ID,
  6299. GoodId: goods.GoodId,
  6300. Number: warehouse.Number,
  6301. LicenseNumber: warehouse.LicenseNumber,
  6302. Count: stock_number,
  6303. UserOrgId: orgID,
  6304. PatientId: goods.PatientId,
  6305. SystemTime: record_time,
  6306. ConsumableType: 3,
  6307. IsSys: 1,
  6308. WarehousingOrder: warehouse.WarehousingOrder,
  6309. WarehouseOutId: warehouseOut.ID,
  6310. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  6311. IsEdit: 1,
  6312. CancelStockId: 0,
  6313. CancelOrderNumber: "",
  6314. Manufacturer: warehouse.Manufacturer,
  6315. Dealer: warehouse.Dealer,
  6316. Creator: creator,
  6317. UpdateCreator: 0,
  6318. Status: 1,
  6319. Ctime: time.Now().Unix(),
  6320. Mtime: 0,
  6321. Price: warehouse.PackingPrice, //零售价
  6322. WarehousingDetailId: warehouse.ID,
  6323. WarehouseOutDetailId: goods.ID,
  6324. CancelOutDetailId: 0,
  6325. ProductDate: warehouse.ProductDate,
  6326. ExpireDate: warehouse.ExpiryDate,
  6327. SupplyWarehouseId: warehouse.SupplyWarehouseId,
  6328. StorehouseId: warehouse.StorehouseId,
  6329. AdminUserId: creator,
  6330. BuyPrice: warehouse.Price, //进货价
  6331. StockCount: "",
  6332. BatchNumberCount: 0,
  6333. IsCheck: 1,
  6334. OverCount: sum_count,
  6335. RegisterNumber: warehouse.RegisterNumber,
  6336. ProjectId: goods.ProjectId,
  6337. }
  6338. //创建出库流水
  6339. errflow := CreateStockFlowOne(stockFlow)
  6340. if errflow != nil {
  6341. goodErrcode := models.XtGoodErrcode{
  6342. UserOrgId: orgID,
  6343. Errcode: "创建出库流水报错",
  6344. GoodId: goods.GoodId,
  6345. Status: 1,
  6346. Ctime: time.Now().Unix(),
  6347. Mtime: 0,
  6348. Count: 0,
  6349. StockCount: 0,
  6350. Creater: creator,
  6351. BatchNumberId: warehouse.ID,
  6352. WarehouseOutId: 0,
  6353. }
  6354. CreateGoodErrcode(goodErrcode)
  6355. }
  6356. //更新出库数量
  6357. errcodecout := ModifyGoodSumCount(goods.StorehouseId, stock_number, orgID, goods.GoodId)
  6358. if errcodecout != nil {
  6359. goodErrcode := models.XtGoodErrcode{
  6360. UserOrgId: orgID,
  6361. Errcode: "更新出库数量报错",
  6362. GoodId: goods.GoodId,
  6363. Status: 1,
  6364. Ctime: time.Now().Unix(),
  6365. Mtime: 0,
  6366. Count: 0,
  6367. StockCount: 0,
  6368. Creater: creator,
  6369. BatchNumberId: warehouse.ID,
  6370. WarehouseOutId: 0,
  6371. }
  6372. CreateGoodErrcode(goodErrcode)
  6373. }
  6374. }
  6375. //退库
  6376. if count < out_count-out_count_one {
  6377. operation_time := time.Now().Unix()
  6378. //创建退库单
  6379. timeStr := time.Now().Format("2006-01-02")
  6380. timeArr := strings.Split(timeStr, "-")
  6381. total, _ := FindAllCancelStockTotal(orgID)
  6382. total = total + 1
  6383. orderNumber := "CKTKD" + strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000" + strconv.FormatInt(total, 10)
  6384. cancelStock := models.CancelStock{
  6385. OrderNumber: orderNumber,
  6386. OperaTime: operation_time,
  6387. OrgId: orgID,
  6388. Creater: warehouseOut.Creater,
  6389. Ctime: time.Now().Unix(),
  6390. Status: 1,
  6391. ReturnTime: record_time,
  6392. Type: 1,
  6393. StorehouseId: goods.StorehouseId,
  6394. IsCheck: 1,
  6395. }
  6396. _, msgerrkonde := GetCancelStockDetailByOrderNumberOne(record_time, orgID)
  6397. if msgerrkonde == gorm.ErrRecordNotFound {
  6398. AddSigleCancelStock(&cancelStock)
  6399. }
  6400. cancel, _ := GetLastCancelStockById(orgID)
  6401. manufacturer, _ := GetManufactureById(warehouse.Manufacturer)
  6402. deaerler, _ := GetDealerById(warehouse.Dealer)
  6403. cancelStockInfo := models.CancelStockInfo{
  6404. GoodId: goods.GoodId,
  6405. CancelStockId: cancel.ID,
  6406. GoodTypeId: goods.GoodTypeId,
  6407. Count: out_count - out_count_one - count,
  6408. Price: warehouse.PackingPrice,
  6409. Total: 0,
  6410. ProductDate: warehouse.ProductDate,
  6411. ExpiryDate: warehouse.ExpiryDate,
  6412. Ctime: time.Now().Unix(),
  6413. Status: 1,
  6414. OrgId: orgID,
  6415. OrderNumber: cancel.OrderNumber,
  6416. Type: 0,
  6417. Dealer: deaerler.DealerName,
  6418. Manufacturer: manufacturer.ManufacturerName,
  6419. Number: warehouse.Number,
  6420. RegisterAccount: "",
  6421. Remark: "",
  6422. WarehouseInfoId: warehouse.ID,
  6423. PatientId: patient_id,
  6424. RecordDate: record_time,
  6425. StorehouseId: goods.StorehouseId,
  6426. IsCheck: 1,
  6427. }
  6428. if orgID == 9671 || orgID == 10265 {
  6429. goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId)
  6430. cancelStockInfo.Price = goodsInfo.PackingPrice
  6431. }
  6432. CreateCancelStockInfoOne(&cancelStockInfo)
  6433. cancelInfo, _ := GetLastCancelStockInfoByGoodId(goods.GoodId)
  6434. flow := models.VmStockFlow{
  6435. WarehousingId: warehouse.ID,
  6436. GoodId: goods.GoodId,
  6437. Number: warehouse.Number,
  6438. LicenseNumber: warehouse.LicenseNumber,
  6439. Count: out_count - count,
  6440. UserOrgId: orgID,
  6441. PatientId: patient_id,
  6442. SystemTime: record_time,
  6443. ConsumableType: 7,
  6444. IsSys: 1,
  6445. WarehousingOrder: "",
  6446. WarehouseOutId: lastOut.WarehouseOutId,
  6447. WarehouseOutOrderNumber: lastOut.WarehouseOutOrderNumber,
  6448. IsEdit: 0,
  6449. CancelStockId: cancel.ID,
  6450. CancelOrderNumber: cancel.OrderNumber,
  6451. Manufacturer: manufacturer.ID,
  6452. Dealer: 0,
  6453. Creator: warehouseOut.Creater,
  6454. UpdateCreator: 0,
  6455. Status: 1,
  6456. Ctime: time.Now().Unix(),
  6457. Mtime: 0,
  6458. Price: warehouse.Price,
  6459. WarehousingDetailId: warehouse.ID,
  6460. WarehouseOutDetailId: lastOut.ID,
  6461. CancelOutDetailId: cancelInfo.ID,
  6462. ProductDate: warehouse.ProductDate,
  6463. ExpireDate: warehouse.ExpiryDate,
  6464. StorehouseId: goods.StorehouseId,
  6465. BuyPrice: warehouse.Price,
  6466. ProjectId: goods.ProjectId,
  6467. OverCount: sum_count,
  6468. RegisterNumber: warehouse.RegisterNumber,
  6469. }
  6470. if orgID == 9671 || orgID == 10265 {
  6471. goodsInfo, _ := FindeGoodInfo(orgID, goods.ProjectId)
  6472. flow.Price = goodsInfo.PackingPrice
  6473. flow.BuyPrice = goodsInfo.BuyPrice
  6474. }
  6475. CreateStockFlowOne(flow)
  6476. //退库数量增加
  6477. UpdateSumAddCancelCount(orgID, goods.GoodId, goods.StorehouseId, flow.Count)
  6478. //实际出库减少
  6479. ModifyAddGoodSumCount(goods.StorehouseId, flow.Count, orgID, goods.GoodId)
  6480. }
  6481. errWarehouse := UpdateGoodWarehouseOutById(goods.ID, warehouse.ID, orgID, sum_count)
  6482. if errWarehouse != nil {
  6483. goodErrcode := models.XtGoodErrcode{
  6484. UserOrgId: orgID,
  6485. Errcode: "添加入库ID报错",
  6486. GoodId: goods.GoodId,
  6487. Status: 1,
  6488. Ctime: time.Now().Unix(),
  6489. Mtime: 0,
  6490. Count: 0,
  6491. StockCount: 0,
  6492. Creater: creator,
  6493. BatchNumberId: warehouse.ID,
  6494. WarehouseOutId: 0,
  6495. }
  6496. CreateGoodErrcode(goodErrcode)
  6497. }
  6498. }
  6499. goods.Count = deliver_number - stock_number
  6500. prepare := &models.DialysisBeforePrepare{
  6501. Count: deliver_number - stock_number,
  6502. GoodTypeId: goods.GoodTypeId,
  6503. GoodId: goods.GoodId,
  6504. PatientId: goods.PatientId,
  6505. RecordDate: goods.RecordDate,
  6506. UserOrgId: orgID,
  6507. Ctime: time.Now().Unix(),
  6508. Creater: creator,
  6509. Status: 1,
  6510. StorehouseId: goods.StorehouseId,
  6511. ProjectId: goods.ProjectId,
  6512. }
  6513. fmt.Println("剩余出库数量", prepare.Count)
  6514. ConsumablePrescriptionDelivery(orgID, patient_id, record_time, prepare, warehouseOut, creator, count)
  6515. return nil
  6516. }
  6517. func CreateAutoDetail(detail models.AutomaticReduceDetail) error {
  6518. err := XTWriteDB().Create(&detail).Error
  6519. return err
  6520. }
  6521. func UpdateAutomaticReduce(patient_id int64, record_date int64, good_id int64, project_id int64) error {
  6522. err := XTWriteDB().Model(&models.AutomaticReduceDetail{}).Where("patient_id = ? and record_time =? and good_id = ? and project_id = ? and status = 1", patient_id, record_date, good_id, project_id).Update(map[string]interface{}{"status": 0}).Error
  6523. return err
  6524. }