warhouse_service.go 111KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162
  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. warehouseOut := models.DrugWarehouseOut{
  39. WarehouseOutOrderNumber: warehousing_out_order,
  40. OperationTime: time.Now().Unix(),
  41. OrgId: orgID,
  42. Creater: creater,
  43. Ctime: time.Now().Unix(),
  44. Status: 1,
  45. WarehouseOutTime: record_time,
  46. Dealer: 0,
  47. Manufacturer: 0,
  48. Type: 1,
  49. IsSys: 1,
  50. }
  51. err := AddSigleDrugWarehouseOut(&warehouseOut)
  52. if err != nil {
  53. utils.TraceLog("创建出库单失败 err = %v", err)
  54. return err
  55. } else {
  56. out = warehouseOut
  57. }
  58. }
  59. // 出库流程
  60. // 1.查询该药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  61. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  62. if drup.ID > 0 {
  63. prescribingNumber := advice.PrescribingNumber
  64. DrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  65. } else {
  66. return errors.New("药品信息不存在")
  67. }
  68. }
  69. return
  70. }
  71. // 药品出库 递归方式
  72. func DrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) {
  73. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  74. var deliver_number int64 = 0
  75. var stock_number int64 = 0
  76. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  77. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  78. var drug_price float64
  79. if advice.PrescribingNumberUnit == drup.MaxUnit {
  80. deliver_number = count * drup.MinNumber
  81. } else {
  82. deliver_number = count
  83. }
  84. if advice.PrescribingNumberUnit == drup.MaxUnit {
  85. drug_price = drup.RetailPrice
  86. }
  87. fmt.Println(drug_price)
  88. if advice.PrescribingNumberUnit == drup.MinUnit {
  89. drug_price = drup.MinPrice
  90. }
  91. if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit {
  92. drug_price = drup.RetailPrice
  93. }
  94. // 根据先进先出原则,查询最先入库的批次,进行出库
  95. // 如果没有对应的库存,则报错
  96. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  97. if err != nil {
  98. return err
  99. }
  100. // 将该批次的剩余库存数量转换为拆零数量
  101. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  102. //查找药品信息
  103. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  104. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  105. if stock_number >= deliver_number {
  106. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  107. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  108. WarehouseOutId: warehouseout.ID,
  109. Status: 1,
  110. Ctime: time.Now().Unix(),
  111. Remark: warehouse.Remark,
  112. OrgId: orgID,
  113. Type: 1,
  114. Manufacturer: warehouse.Manufacturer,
  115. Dealer: warehouse.Dealer,
  116. IsSys: 1,
  117. SysRecordTime: advice.RecordDate,
  118. DrugId: advice.DrugId,
  119. Number: warehouse.Number,
  120. BatchNumber: warehouse.BatchNumber,
  121. Price: warehouse.RetailPrice,
  122. CountUnit: drup.MinUnit,
  123. RetailPrice: warehouse.RetailPrice,
  124. ProductDate: warehouse.ProductDate,
  125. ExpiryDate: warehouse.ExpiryDate,
  126. PatientId: advice.PatientId,
  127. Count: deliver_number, //出最小单位
  128. WarehouseInfoId: warehouse.ID,
  129. }
  130. drugflow := models.DrugFlow{
  131. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  132. WarehouseOutId: warehouseout.ID,
  133. DrugId: advice.DrugId,
  134. Number: warehouse.Number,
  135. ProductDate: warehouse.ProductDate,
  136. ExpireDate: warehouse.ExpiryDate,
  137. Count: deliver_number, //按最小单位计算,
  138. Price: warehouse.RetailPrice,
  139. Status: 1,
  140. Ctime: time.Now().Unix(),
  141. UserOrgId: orgID,
  142. Manufacturer: warehouse.Manufacturer,
  143. Dealer: warehouse.Dealer,
  144. BatchNumber: warehouse.BatchNumber,
  145. MaxUnit: drup.MinUnit,
  146. ConsumableType: 3,
  147. IsEdit: 1,
  148. Creator: advice.ExecutionStaff,
  149. IsSys: 1,
  150. PatientId: advice.PatientId,
  151. SystemTime: advice.AdviceDate,
  152. WarehousingDetailId: warehouse.ID,
  153. }
  154. CreateDrugFlowOne(drugflow)
  155. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  156. fmt.Println(errOne)
  157. //查询是否存在数据
  158. //_, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  159. //if errcodes == gorm.ErrRecordNotFound {
  160. // errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  161. // if errOne != nil {
  162. // return errOne
  163. // }
  164. //} else if errcodes == nil {
  165. // //service.GetLastDrugWarehouseOutInfoByPatientId(advice.DrugId, advice.PatientId, advice.RecordDate)
  166. // UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  167. //}
  168. details := &models.DrugAutomaticReduceDetail{
  169. WarehouseOutId: warehouseout.ID,
  170. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  171. PatientId: advice.PatientId,
  172. Ctime: time.Now().Unix(),
  173. Mtime: time.Now().Unix(),
  174. Status: 1,
  175. RecordTime: advice.RecordDate,
  176. OrgId: orgID,
  177. DrugId: advice.DrugId,
  178. Count: count,
  179. CountUnit: advice.PrescribingNumberUnit,
  180. WarehouseInfoId: warehouse.ID,
  181. }
  182. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  183. if errTwo != nil {
  184. return errTwo
  185. }
  186. // 出库完成后,要减去对应批次的库存数量
  187. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  188. var maxNumber int64 = 0
  189. var minNumber int64 = 0
  190. //if advice.PrescribingNumberUnit == drup.MaxUnit {
  191. // maxNumber = deliver_number / drup.MinNumber
  192. // minNumber = deliver_number % drup.MinNumber
  193. //
  194. //} else {
  195. // minNumber = deliver_number
  196. //}
  197. maxNumber = deliver_number / drup.MinNumber
  198. minNumber = deliver_number % drup.MinNumber
  199. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  200. minNumber = maxNumber
  201. }
  202. if warehouse.StockMaxNumber < maxNumber {
  203. return errors.New("库存数量不足")
  204. }
  205. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  206. warehouse.Mtime = time.Now().Unix()
  207. if warehouse.StockMinNumber < minNumber {
  208. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  209. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  210. } else {
  211. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  212. }
  213. if warehouse.StockMaxNumber < 0 {
  214. return errors.New("库存数量不足")
  215. }
  216. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  217. if errThree != nil {
  218. return errThree
  219. }
  220. return nil
  221. } else {
  222. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  223. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  224. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  225. WarehouseOutId: warehouseout.ID,
  226. Status: 1,
  227. Ctime: time.Now().Unix(),
  228. Remark: warehouse.Remark,
  229. OrgId: orgID,
  230. Type: 1,
  231. Manufacturer: warehouse.Manufacturer,
  232. Dealer: warehouse.Dealer,
  233. IsSys: 1,
  234. SysRecordTime: advice.RecordDate,
  235. DrugId: advice.DrugId,
  236. Number: warehouse.Number,
  237. BatchNumber: warehouse.BatchNumber,
  238. Price: warehouse.RetailPrice,
  239. CountUnit: drup.MinUnit,
  240. ProductDate: warehouse.ProductDate,
  241. ExpiryDate: warehouse.ExpiryDate,
  242. PatientId: advice.PatientId,
  243. Count: deliver_number,
  244. WarehouseInfoId: warehouse.ID,
  245. }
  246. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  247. if errOne != nil {
  248. return errOne
  249. }
  250. details := &models.DrugAutomaticReduceDetail{
  251. WarehouseOutId: warehouseout.ID,
  252. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  253. PatientId: advice.PatientId,
  254. Ctime: time.Now().Unix(),
  255. Mtime: time.Now().Unix(),
  256. Status: 1,
  257. RecordTime: advice.RecordDate,
  258. OrgId: orgID,
  259. DrugId: advice.DrugId,
  260. Count: deliver_number,
  261. CountUnit: drup.MinUnit,
  262. WarehouseInfoId: warehouse.ID,
  263. }
  264. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  265. if errTwo != nil {
  266. return errTwo
  267. }
  268. info := models.XtDrugWarehouseInfo{
  269. ID: warehouse.ID,
  270. WarehousingId: warehouse.WarehousingId,
  271. DrugId: warehouse.DrugId,
  272. Number: warehouse.Number,
  273. ProductDate: warehouse.ProductDate,
  274. ExpiryDate: warehouse.ExpiryDate,
  275. WarehousingCount: warehouse.WarehousingCount,
  276. Price: warehouse.RetailPrice,
  277. TotalPrice: warehouse.TotalPrice,
  278. Dealer: warehouse.Dealer,
  279. Manufacturer: warehouse.Manufacturer,
  280. Remark: warehouse.Remark,
  281. Ctime: warehouse.Ctime,
  282. Mtime: warehouse.Mtime,
  283. Status: 1,
  284. OrgId: warehouse.OrgId,
  285. IsReturn: warehouse.IsReturn,
  286. WarehousingOrder: warehouse.WarehousingOrder,
  287. Type: warehouse.Type,
  288. RetailPrice: warehouse.RetailPrice,
  289. RetailTotalPrice: warehouse.RetailPrice,
  290. StockMaxNumber: 0,
  291. StockMinNumber: 0,
  292. BatchNumber: warehouse.BatchNumber,
  293. MaxUnit: warehouse.MaxUnit,
  294. WarehousingInfoId: warehouse.WarehousingInfoId,
  295. }
  296. //扣减库存
  297. errThree := UpDateDrugWarehouseInfoByStock(&info)
  298. //fmt.Println("w我的事件23232332hh23323232233322332323232233232332323232323232",errThree)
  299. if errThree != nil {
  300. return errThree
  301. }
  302. drugflow := models.DrugFlow{
  303. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  304. WarehouseOutId: warehouseout.ID,
  305. DrugId: advice.DrugId,
  306. Number: warehouse.Number,
  307. ProductDate: warehouse.ProductDate,
  308. ExpireDate: warehouse.ExpiryDate,
  309. Count: stock_number,
  310. Price: warehouse.RetailPrice,
  311. Status: 1,
  312. Ctime: time.Now().Unix(),
  313. UserOrgId: orgID,
  314. Manufacturer: warehouse.Manufacturer,
  315. Dealer: warehouse.Dealer,
  316. BatchNumber: warehouse.BatchNumber,
  317. MaxUnit: drup.MinUnit,
  318. ConsumableType: 3,
  319. IsEdit: 1,
  320. Creator: advice.ExecutionStaff,
  321. IsSys: 1,
  322. PatientId: advice.PatientId,
  323. WarehousingDetailId: warehouse.ID,
  324. }
  325. CreateDrugFlowOne(drugflow)
  326. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  327. prescribingNumber_two_temp := deliver_number - stock_number
  328. overPlusNumber := float64(prescribingNumber_two_temp)
  329. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  330. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  331. NewDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  332. }
  333. return
  334. }
  335. // 药品出库
  336. func HisDrugsDelivery(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo) (err error) {
  337. // 1.判断药品是否来自专用字典的药品库
  338. // 2.判断当天当前机构有没有创建出库单,没有则创建
  339. // 3.创建出库流程
  340. // 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
  341. isHasWay := false
  342. record_time := int64(0)
  343. isHasWay = true
  344. record_time = advice.RecordDate
  345. if isHasWay {
  346. //判断当天当前机构有没有创建出库单,没有则创建
  347. out, err := FindDrugStockOutByIsSys(orgID, 1, record_time)
  348. if err == gorm.ErrRecordNotFound {
  349. timeStr := time.Now().Format("2006-01-02")
  350. timeArr := strings.Split(timeStr, "-")
  351. total, _ := FindAllDrugWarehouseOut(orgID)
  352. total = total + 1
  353. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  354. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  355. number = number + total
  356. warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
  357. // creater := adminUserInfo.AdminUser.Id
  358. warehouseOut := models.DrugWarehouseOut{
  359. WarehouseOutOrderNumber: warehousing_out_order,
  360. OperationTime: time.Now().Unix(),
  361. OrgId: orgID,
  362. Creater: creater,
  363. Ctime: time.Now().Unix(),
  364. Status: 1,
  365. WarehouseOutTime: record_time,
  366. Dealer: 0,
  367. Manufacturer: 0,
  368. Type: 1,
  369. IsSys: 1,
  370. }
  371. err := AddSigleDrugWarehouseOut(&warehouseOut)
  372. if err != nil {
  373. utils.TraceLog("创建出库单失败 err = %v", err)
  374. return err
  375. } else {
  376. out = warehouseOut
  377. }
  378. }
  379. // 出库流程
  380. // 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  381. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  382. if drup.ID > 0 {
  383. prescribingNumber := advice.PrescribingNumber
  384. HisDrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  385. } else {
  386. return errors.New("药品信息不存在")
  387. }
  388. }
  389. return
  390. }
  391. // 药品出库 递归方式
  392. func HisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  393. //fmt.Println("进来了吗323222222222222222222222222222222222222222222222222222222222222222222")
  394. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  395. var deliver_number int64 = 0
  396. var stock_number int64 = 0
  397. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  398. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  399. if advice.PrescribingNumberUnit == drup.MaxUnit {
  400. deliver_number = count * drup.MinNumber
  401. } else {
  402. deliver_number = count
  403. }
  404. var min_price float64
  405. if advice.PrescribingNumberUnit == drup.MaxUnit {
  406. min_price = drup.RetailPrice
  407. }
  408. if advice.PrescribingNumberUnit == drup.MinUnit {
  409. min_price = drup.MinPrice
  410. }
  411. if advice.PrescribingNumberUnit != drup.MaxUnit && advice.PrescribingNumberUnit != drup.MinUnit {
  412. min_price = drup.RetailPrice
  413. }
  414. fmt.Println(min_price)
  415. // 根据先进先出原则,查询最先入库的批次,进行出库
  416. // 如果没有对应的库存,则报错
  417. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  418. //查找药品信息
  419. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  420. if err != nil {
  421. return err
  422. }
  423. // 将该批次的剩余库存数量转换为拆零数量
  424. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  425. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  426. if stock_number >= deliver_number {
  427. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  428. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  429. WarehouseOutId: warehouseout.ID,
  430. Status: 1,
  431. Ctime: time.Now().Unix(),
  432. Remark: warehouse.Remark,
  433. OrgId: orgID,
  434. Type: 1,
  435. Manufacturer: warehouse.Manufacturer,
  436. Dealer: warehouse.Dealer,
  437. IsSys: 1,
  438. SysRecordTime: advice.RecordDate,
  439. DrugId: advice.DrugId,
  440. Number: warehouse.Number,
  441. BatchNumber: warehouse.BatchNumber,
  442. Price: warehouse.RetailPrice,
  443. CountUnit: drup.MinUnit,
  444. RetailPrice: warehouse.RetailPrice,
  445. ProductDate: warehouse.ProductDate,
  446. ExpiryDate: warehouse.ExpiryDate,
  447. PatientId: advice.PatientId,
  448. WarehouseInfoId: warehouse.ID,
  449. Count: deliver_number,
  450. AdviceId: advice.ID,
  451. }
  452. drugflow := models.DrugFlow{
  453. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  454. WarehouseOutId: warehouseout.ID,
  455. DrugId: advice.DrugId,
  456. Number: warehouse.Number,
  457. ProductDate: warehouse.ProductDate,
  458. ExpireDate: warehouse.ExpiryDate,
  459. Count: deliver_number,
  460. Price: warehouse.RetailPrice,
  461. Status: 1,
  462. Ctime: time.Now().Unix(),
  463. UserOrgId: orgID,
  464. Manufacturer: warehouse.Manufacturer,
  465. Dealer: warehouse.Dealer,
  466. BatchNumber: warehouse.BatchNumber,
  467. MaxUnit: drup.MinUnit,
  468. ConsumableType: 3,
  469. IsEdit: 1,
  470. Creator: advice.ExecutionStaff,
  471. IsSys: 1,
  472. PatientId: advice.PatientId,
  473. SystemTime: advice.AdviceDate,
  474. WarehousingDetailId: warehouse.ID,
  475. AdviceId: advice.ID,
  476. }
  477. CreateDrugFlowOne(drugflow)
  478. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  479. if errOne != nil {
  480. return errOne
  481. }
  482. details := &models.DrugAutomaticReduceDetail{
  483. WarehouseOutId: warehouseout.ID,
  484. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  485. PatientId: advice.PatientId,
  486. Ctime: time.Now().Unix(),
  487. Mtime: time.Now().Unix(),
  488. Status: 1,
  489. RecordTime: advice.RecordDate,
  490. OrgId: orgID,
  491. DrugId: advice.DrugId,
  492. Count: deliver_number,
  493. CountUnit: drup.MinUnit,
  494. WarehouseInfoId: warehouse.ID,
  495. AdviceId: advice.ID,
  496. }
  497. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  498. if errTwo != nil {
  499. return errTwo
  500. }
  501. // 出库完成后,要减去对应批次的库存数量
  502. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  503. var maxNumber int64 = 0
  504. var minNumber int64 = 0
  505. var stock_max_number int64 = 0
  506. stock_max_number = warehouse.StockMaxNumber
  507. maxNumber = deliver_number / drup.MinNumber
  508. minNumber = deliver_number % drup.MinNumber
  509. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  510. minNumber = maxNumber
  511. }
  512. if drup.MaxUnit != drup.MinUnit {
  513. if warehouse.StockMaxNumber < maxNumber && warehouse.StockMinNumber < minNumber {
  514. return errors.New("库存数量不足")
  515. }
  516. }
  517. fmt.Println("minNumber23323323232323232322332", maxNumber, minNumber)
  518. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  519. if warehouse.StockMaxNumber < 0 {
  520. warehouse.StockMaxNumber = 0
  521. }
  522. if warehouse.StockMinNumber < 0 {
  523. warehouse.StockMinNumber = 0
  524. }
  525. warehouse.Mtime = time.Now().Unix()
  526. fmt.Println("w23332233232232332", warehouse.StockMinNumber, minNumber)
  527. if warehouse.StockMinNumber < minNumber {
  528. fmt.Println("进来的风3232332322323")
  529. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  530. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  531. } else {
  532. fmt.Println("进3232332322323")
  533. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  534. }
  535. if maxNumber == 1 && minNumber == 0 && drup.MaxUnit != drup.MinUnit {
  536. fmt.Println("2223232332322323", warehouse.StockMinNumber)
  537. warehouse.StockMinNumber = warehouse.StockMinNumber - deliver_number
  538. if warehouse.StockMinNumber == 0 {
  539. warehouse.StockMaxNumber = stock_max_number
  540. }
  541. }
  542. if drup.MaxUnit != drup.MinUnit {
  543. if warehouse.StockMaxNumber < 0 && warehouse.StockMinNumber < 0 {
  544. return errors.New("库存数量不足")
  545. }
  546. }
  547. if warehouse.StockMinNumber <= 0 {
  548. warehouse.StockMinNumber = 0
  549. }
  550. //扣减库存232332332332
  551. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  552. if errThree != nil {
  553. return errThree
  554. }
  555. return nil
  556. } else {
  557. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  558. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  559. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  560. WarehouseOutId: warehouseout.ID,
  561. Status: 1,
  562. Ctime: time.Now().Unix(),
  563. Remark: warehouse.Remark,
  564. OrgId: orgID,
  565. Type: 1,
  566. Manufacturer: warehouse.Manufacturer,
  567. Dealer: warehouse.Dealer,
  568. IsSys: 1,
  569. SysRecordTime: advice.RecordDate,
  570. DrugId: advice.DrugId,
  571. Number: warehouse.Number,
  572. BatchNumber: warehouse.BatchNumber,
  573. Price: warehouse.RetailPrice,
  574. RetailPrice: warehouse.RetailPrice,
  575. ProductDate: warehouse.ProductDate,
  576. ExpiryDate: warehouse.ExpiryDate,
  577. PatientId: advice.PatientId,
  578. WarehouseInfoId: warehouse.ID,
  579. Count: stock_number,
  580. CountUnit: drup.MinUnit,
  581. AdviceId: advice.ID,
  582. }
  583. drugflow := models.DrugFlow{
  584. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  585. WarehouseOutId: warehouseout.ID,
  586. DrugId: advice.DrugId,
  587. Number: warehouse.Number,
  588. ProductDate: warehouse.ProductDate,
  589. ExpireDate: warehouse.ExpiryDate,
  590. Count: stock_number,
  591. Price: warehouse.RetailPrice,
  592. Status: 1,
  593. Ctime: time.Now().Unix(),
  594. UserOrgId: orgID,
  595. Manufacturer: warehouse.Manufacturer,
  596. Dealer: warehouse.Dealer,
  597. BatchNumber: warehouse.BatchNumber,
  598. MaxUnit: drup.MinUnit,
  599. ConsumableType: 3,
  600. IsEdit: 1,
  601. Creator: advice.ExecutionStaff,
  602. IsSys: 1,
  603. PatientId: advice.PatientId,
  604. SystemTime: advice.AdviceDate,
  605. WarehousingDetailId: warehouse.ID,
  606. AdviceId: advice.ID,
  607. }
  608. CreateDrugFlowOne(drugflow)
  609. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  610. if errOne != nil {
  611. return errOne
  612. }
  613. //查询是否存在数据
  614. details := &models.DrugAutomaticReduceDetail{
  615. WarehouseOutId: warehouseout.ID,
  616. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  617. PatientId: advice.PatientId,
  618. Ctime: time.Now().Unix(),
  619. Mtime: time.Now().Unix(),
  620. Status: 1,
  621. RecordTime: advice.RecordDate,
  622. OrgId: orgID,
  623. DrugId: advice.DrugId,
  624. Count: stock_number,
  625. CountUnit: drup.MinUnit,
  626. WarehouseInfoId: warehouse.ID,
  627. AdviceId: advice.ID,
  628. }
  629. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  630. if errTwo != nil {
  631. return errTwo
  632. }
  633. info := models.XtDrugWarehouseInfo{
  634. ID: warehouse.ID,
  635. WarehousingId: warehouse.WarehousingId,
  636. DrugId: warehouse.DrugId,
  637. Number: warehouse.Number,
  638. ProductDate: warehouse.ProductDate,
  639. ExpiryDate: warehouse.ExpiryDate,
  640. WarehousingCount: warehouse.WarehousingCount,
  641. Price: warehouse.Price,
  642. TotalPrice: warehouse.TotalPrice,
  643. Dealer: warehouse.Dealer,
  644. Manufacturer: warehouse.Manufacturer,
  645. Remark: warehouse.Remark,
  646. Ctime: warehouse.Ctime,
  647. Mtime: warehouse.Mtime,
  648. Status: 1,
  649. OrgId: warehouse.OrgId,
  650. IsReturn: warehouse.IsReturn,
  651. WarehousingOrder: warehouse.WarehousingOrder,
  652. Type: warehouse.Type,
  653. RetailPrice: warehouse.RetailPrice,
  654. RetailTotalPrice: warehouse.RetailPrice,
  655. StockMaxNumber: 0,
  656. StockMinNumber: 0,
  657. BatchNumber: warehouse.BatchNumber,
  658. MaxUnit: warehouse.MaxUnit,
  659. WarehousingInfoId: warehouse.WarehousingInfoId,
  660. }
  661. errThree := UpDateDrugWarehouseInfoByStock(&info)
  662. if errThree != nil {
  663. return errThree
  664. }
  665. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  666. prescribingNumber_two_temp := deliver_number - stock_number
  667. overPlusNumber := float64(prescribingNumber_two_temp)
  668. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  669. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  670. NewHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  671. }
  672. return
  673. }
  674. // 药品出库 递归方式
  675. func AutoDrugDeliverInfo(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  676. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  677. var deliver_number int64 = 0
  678. var stock_number int64 = 0
  679. if advice.CountUnit == drup.MaxUnit {
  680. deliver_number = prescribingNumber * drup.MinNumber
  681. } else {
  682. deliver_number = prescribingNumber
  683. }
  684. // 根据先进先出原则,查询最先入库的批次,进行出库
  685. // 如果没有对应的库存,则报错
  686. //开启事物
  687. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  688. if err != nil {
  689. return err
  690. }
  691. // 将该批次的剩余库存数量转换为拆零数量
  692. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  693. fmt.Println("库存1", stock_number)
  694. fmt.Println("c出库数量", deliver_number)
  695. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  696. if stock_number >= deliver_number {
  697. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  698. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  699. WarehouseOutId: warehouseout.ID,
  700. Status: 1,
  701. Ctime: time.Now().Unix(),
  702. Remark: advice.Remark,
  703. OrgId: orgID,
  704. Type: 1,
  705. Manufacturer: advice.Manufacturer,
  706. Dealer: warehouse.Dealer,
  707. IsSys: 0,
  708. SysRecordTime: advice.Ctime,
  709. DrugId: advice.DrugId,
  710. ExpiryDate: advice.ExpiryDate,
  711. ProductDate: advice.ProductDate,
  712. Number: advice.Number,
  713. BatchNumber: warehouse.BatchNumber,
  714. Count: deliver_number,
  715. RetailPrice: advice.RetailPrice,
  716. Price: advice.Price,
  717. WarehouseInfoId: warehouse.ID,
  718. CountUnit: drup.MinUnit,
  719. AdviceId: advice.ID,
  720. }
  721. warehouseOutInfo.Count = prescribingNumber
  722. warehouseOutInfo.CountUnit = advice.CountUnit
  723. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  724. if errOne != nil {
  725. return errOne
  726. }
  727. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  728. drugflow := models.DrugFlow{
  729. WarehouseOutId: warehouseout.ID,
  730. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  731. DrugId: advice.DrugId,
  732. Number: warehouse.Number,
  733. ProductDate: advice.ProductDate,
  734. ExpireDate: advice.ExpiryDate,
  735. Count: deliver_number,
  736. Price: advice.Price,
  737. Status: 1,
  738. Ctime: time.Now().Unix(),
  739. UserOrgId: advice.OrgId,
  740. Manufacturer: advice.Manufacturer,
  741. Dealer: advice.Dealer,
  742. BatchNumber: warehouse.BatchNumber,
  743. MaxUnit: drup.MinUnit,
  744. ConsumableType: 2,
  745. IsEdit: 1,
  746. Creator: 0,
  747. IsSys: 0,
  748. WarehouseOutDetailId: drugWareInfo.ID,
  749. AdviceId: advice.ID,
  750. }
  751. CreateDrugFlowOne(drugflow)
  752. // 出库完成后,要减去对应批次的库存数量
  753. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  754. var maxNumber int64 = 0
  755. var minNumber int64 = 0
  756. if advice.CountUnit == drup.MinUnit {
  757. maxNumber = prescribingNumber / drup.MinNumber
  758. minNumber = prescribingNumber % drup.MinNumber
  759. } else {
  760. maxNumber = prescribingNumber
  761. }
  762. if warehouse.StockMaxNumber < maxNumber {
  763. return errors.New("库存数量不足")
  764. }
  765. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  766. warehouse.Mtime = time.Now().Unix()
  767. if warehouse.StockMinNumber < minNumber {
  768. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  769. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  770. } else {
  771. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  772. }
  773. if warehouse.StockMaxNumber < 0 {
  774. return errors.New("库存数量不足")
  775. }
  776. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  777. if errThree != nil {
  778. return errThree
  779. }
  780. return nil
  781. } else {
  782. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  783. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  784. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  785. WarehouseOutId: warehouseout.ID,
  786. Status: 1,
  787. Ctime: time.Now().Unix(),
  788. Remark: advice.Remark,
  789. OrgId: orgID,
  790. Type: 1,
  791. Manufacturer: advice.Manufacturer,
  792. Dealer: warehouse.Dealer,
  793. IsSys: 0,
  794. SysRecordTime: advice.Ctime,
  795. DrugId: advice.DrugId,
  796. ExpiryDate: warehouse.ExpiryDate,
  797. ProductDate: warehouse.ProductDate,
  798. Number: warehouse.Number,
  799. BatchNumber: warehouse.BatchNumber,
  800. Count: stock_number,
  801. RetailPrice: advice.RetailPrice,
  802. Price: advice.Price,
  803. WarehouseInfoId: warehouse.ID,
  804. CountUnit: drup.MinUnit,
  805. AdviceId: advice.ID,
  806. }
  807. warehouseOutInfo.Count = stock_number
  808. //warehouseOutInfo.CountUnit = advice.CountUnit
  809. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  810. if errOne != nil {
  811. return errOne
  812. }
  813. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  814. drugflow := models.DrugFlow{
  815. WarehouseOutId: warehouseout.ID,
  816. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  817. DrugId: advice.DrugId,
  818. Number: warehouse.Number,
  819. ProductDate: advice.ProductDate,
  820. ExpireDate: advice.ExpiryDate,
  821. Count: stock_number,
  822. Price: advice.Price,
  823. Status: 1,
  824. Ctime: time.Now().Unix(),
  825. UserOrgId: advice.OrgId,
  826. Manufacturer: advice.Manufacturer,
  827. Dealer: advice.Dealer,
  828. BatchNumber: warehouse.BatchNumber,
  829. MaxUnit: drup.MinUnit,
  830. ConsumableType: 2,
  831. IsEdit: 1,
  832. Creator: 0,
  833. IsSys: 0,
  834. WarehouseOutDetailId: drugWareInfo.ID,
  835. AdviceId: advice.ID,
  836. }
  837. CreateDrugFlowOne(drugflow)
  838. // 出库完成后,要将该批次库存清零
  839. warehouse.StockMaxNumber = 0
  840. warehouse.StockMinNumber = 0
  841. warehouse.Mtime = time.Now().Unix()
  842. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  843. if errThree != nil {
  844. return errThree
  845. }
  846. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  847. prescribingNumber_two_temp := deliver_number - stock_number
  848. fmt.Println("剩余库存323323223232323232323323223", prescribingNumber_two_temp)
  849. advice.CountUnit = drup.MinUnit
  850. AutoDrugDeliverInfo(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  851. }
  852. return
  853. }
  854. // 耗材出库
  855. func ConsumablesDeliveryTotal(orgID int64, patient_id int64, record_time int64, goods []*models.DialysisBeforePrepareGoods, goodOne []*models.NewDialysisBeforePrepareGoods, creator int64) (err error) {
  856. //查询该患者当天已经出库的耗材信息
  857. goods_yc, _ := FindConsumablesByDateTwo(orgID, patient_id, record_time)
  858. // 和新请求的出库数据进行对比,分出那些是继续出库的,那些是需要删除出库的
  859. for i := len(goods_yc) - 1; i >= 0; i-- {
  860. goods_yc_temp := goods_yc[i]
  861. for j := len(goods) - 1; j >= 0; j-- {
  862. goods_temp := goods[j]
  863. // 已经出库和新请求出库都存在该耗材,则判断出库数量,分成是继续出库,还是删除出库
  864. if goods_yc_temp.GoodTypeId == goods_temp.GoodTypeId && goods_yc_temp.GoodId == goods_temp.GoodId {
  865. // 已经出库和新请求出库的出库数量一致,则清除两个结构体里的数据(既不出库,也不删除出库)
  866. if goods_yc_temp.Count == goods_temp.Count {
  867. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  868. goods = append(goods[:j], goods[j+1:]...)
  869. break
  870. }
  871. // 如果已经出库的数量 大于 新请求出库的数量,则代表需要删除出库
  872. if goods_yc_temp.Count > goods_temp.Count {
  873. temp_count := goods_yc_temp.Count - goods_temp.Count
  874. goods_yc[i].Count = temp_count
  875. goods = append(goods[:j], goods[j+1:]...)
  876. break
  877. }
  878. // 如果已经出库的数量 小于 新请求出库的梳理,则代表需要增加出库
  879. if goods_yc_temp.Count < goods_temp.Count {
  880. temp_count := goods_temp.Count - goods_yc_temp.Count
  881. //fmt.Println("988888888888888", temp_count)
  882. goods[j].Count = temp_count
  883. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  884. //fmt.Println("888888888", goods_yc)
  885. break
  886. }
  887. }
  888. }
  889. }
  890. // goods_yc 这个数据就是需要已经出库了,但是现在需要删除出库的耗材数据
  891. // goods 这个数据就是需要出库的耗材的数据(新增的数据)
  892. if len(goods) > 0 {
  893. out, err := FindStockOutByIsSys(orgID, 1, record_time)
  894. if err == gorm.ErrRecordNotFound {
  895. //没有记录,则创建出库单
  896. timeStr := time.Now().Format("2006-01-02")
  897. timeArr := strings.Split(timeStr, "-")
  898. total, _ := FindAllWarehouseOut(orgID)
  899. total = total + 1
  900. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  901. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  902. number = number + total
  903. warehousing_out_order = "CKD" + strconv.FormatInt(number, 10)
  904. warehouseOut := models.WarehouseOut{
  905. WarehouseOutOrderNumber: warehousing_out_order,
  906. OperationTime: time.Now().Unix(),
  907. OrgId: orgID,
  908. Creater: creator,
  909. Ctime: time.Now().Unix(),
  910. Status: 1,
  911. WarehouseOutTime: record_time,
  912. Dealer: 0,
  913. Manufacturer: 0,
  914. Type: 1,
  915. IsSys: 1,
  916. }
  917. err := AddSigleWarehouseOut(&warehouseOut)
  918. if err != nil {
  919. utils.TraceLog("创建出库单失败 err = %v", err)
  920. return err
  921. } else {
  922. out = warehouseOut
  923. }
  924. }
  925. for _, item := range goods {
  926. var newCount int64 = 0
  927. for _, it := range goodOne {
  928. if item.GoodTypeId == it.GoodTypeId && item.GoodId == it.GoodId {
  929. newCount = it.Count
  930. }
  931. }
  932. prepare := models.DialysisBeforePrepare{
  933. GoodTypeId: item.GoodTypeId,
  934. GoodId: item.GoodId,
  935. Count: item.Count,
  936. ProjectId: item.ProjectId,
  937. }
  938. ConsumablesDelivery(orgID, patient_id, record_time, &prepare, &out, newCount)
  939. }
  940. }
  941. if len(goods_yc) > 0 {
  942. for _, good_yc := range goods_yc {
  943. out, _ := FindStockOutByIsSys(orgID, 1, record_time)
  944. ConsumablesDeliveryDelete(orgID, patient_id, record_time, good_yc, &out)
  945. }
  946. }
  947. return nil
  948. }
  949. //耗材出库
  950. func ConsumablesDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, count int64) (err error) {
  951. fmt.Println("count23323223233232323232332232323", count, goods.Count)
  952. var deliver_number int64 = 0
  953. var stock_number int64 = 0
  954. var maxNumber int64 = 0
  955. deliver_number = goods.Count
  956. // 根据先进先出原则,查询最先入库的批次,进行出库
  957. // 如果没有对应的库存,则报错
  958. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId)
  959. if err != nil {
  960. return errors.New("库存数量不足")
  961. }
  962. stock_number = warehouse.StockCount
  963. //获取耗材信息
  964. info, _ := GetGoodInformationByGoodId(goods.GoodId)
  965. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  966. if stock_number >= deliver_number {
  967. warehouseOutInfo := &models.WarehouseOutInfo{
  968. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  969. WarehouseOutId: warehouseOut.ID,
  970. WarehouseInfotId: warehouse.ID,
  971. Status: 1,
  972. Ctime: time.Now().Unix(),
  973. Remark: warehouse.Remark,
  974. OrgId: orgID,
  975. Type: 1,
  976. Manufacturer: warehouse.Manufacturer,
  977. Dealer: warehouse.Dealer,
  978. IsSys: 1,
  979. SysRecordTime: record_time,
  980. GoodTypeId: goods.GoodTypeId,
  981. GoodId: goods.GoodId,
  982. PatientId: patient_id,
  983. Number: warehouse.Number,
  984. LicenseNumber: warehouse.LicenseNumber,
  985. Price: warehouse.PackingPrice,
  986. ExpiryDate: warehouse.ExpiryDate,
  987. ProductDate: warehouse.ProductDate,
  988. ProjectId: goods.ProjectId,
  989. }
  990. warehouseOutInfo.Count = count
  991. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, patient_id, record_time)
  992. if errcodes == gorm.ErrRecordNotFound {
  993. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  994. if errOne != nil {
  995. return errOne
  996. }
  997. } else if errcodes == nil {
  998. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, patient_id, record_time)
  999. }
  1000. details := models.BloodAutomaticReduceDetail{
  1001. WarehouseOutId: warehouseOutInfo.ID,
  1002. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1003. PatientId: patient_id,
  1004. Ctime: time.Now().Unix(),
  1005. Mtime: time.Now().Unix(),
  1006. Status: 1,
  1007. RecordTime: record_time,
  1008. OrgId: orgID,
  1009. GoodId: goods.GoodId,
  1010. GoodTypeId: goods.GoodTypeId,
  1011. Count: count,
  1012. ProjectId: goods.ProjectId,
  1013. }
  1014. //查询当天耗材是否已经存在数据
  1015. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1016. if errcode == gorm.ErrRecordNotFound {
  1017. errTwo := CreateAutoReduceRecord(&details)
  1018. if errTwo != nil {
  1019. return errTwo
  1020. }
  1021. //插入库存流水表
  1022. flow := models.VmStockFlow{
  1023. WarehouseOutId: warehouseOut.ID,
  1024. WarehousingId: warehouse.ID,
  1025. GoodId: goods.GoodId,
  1026. Number: warehouse.Number,
  1027. ProductDate: warehouse.ProductDate,
  1028. ExpireDate: warehouse.ExpiryDate,
  1029. Count: deliver_number,
  1030. Price: warehouse.PackingPrice,
  1031. Status: 1,
  1032. Ctime: time.Now().Unix(),
  1033. UserOrgId: orgID,
  1034. Manufacturer: info.Manufacturer,
  1035. Dealer: info.Dealer,
  1036. LicenseNumber: warehouse.LicenseNumber,
  1037. IsEdit: 2,
  1038. Creator: warehouseOut.Creater,
  1039. SystemTime: record_time,
  1040. ConsumableType: 3,
  1041. WarehouseOutDetailId: warehouseOutInfo.ID,
  1042. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1043. IsSys: 1,
  1044. PatientId: patient_id,
  1045. ProjectId: goods.ProjectId,
  1046. }
  1047. //查询流水是否存在
  1048. exsit, errflow := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1049. if errflow == gorm.ErrRecordNotFound {
  1050. errThre := CreateStockFlowOne(flow)
  1051. if errThre != nil {
  1052. return errThre
  1053. }
  1054. } else if errflow == nil {
  1055. flow := models.VmStockFlow{
  1056. ID: exsit.ID,
  1057. WarehouseOutId: warehouseOut.ID,
  1058. WarehousingId: warehouse.ID,
  1059. GoodId: goods.GoodId,
  1060. Number: warehouse.Number,
  1061. ProductDate: warehouse.ProductDate,
  1062. ExpireDate: warehouse.ExpiryDate,
  1063. Count: exsit.Count + goods.Count,
  1064. Price: warehouse.PackingPrice,
  1065. Status: 1,
  1066. Ctime: time.Now().Unix(),
  1067. UserOrgId: orgID,
  1068. Manufacturer: info.Manufacturer,
  1069. Dealer: info.Dealer,
  1070. LicenseNumber: warehouse.LicenseNumber,
  1071. IsEdit: 2,
  1072. Creator: warehouseOut.Creater,
  1073. SystemTime: record_time,
  1074. ConsumableType: 3,
  1075. WarehouseOutDetailId: warehouseOutInfo.ID,
  1076. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1077. IsSys: 1,
  1078. PatientId: patient_id,
  1079. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1080. ProjectId: goods.ProjectId,
  1081. }
  1082. errFour := UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1083. if errFour != nil {
  1084. return errFour
  1085. }
  1086. }
  1087. } else if errcode == nil {
  1088. flow := models.VmStockFlow{
  1089. WarehouseOutId: warehouseOut.ID,
  1090. WarehousingId: warehouse.ID,
  1091. GoodId: goods.GoodId,
  1092. Number: warehouse.Number,
  1093. ProductDate: warehouse.ProductDate,
  1094. ExpireDate: warehouse.ExpiryDate,
  1095. Count: deliver_number,
  1096. Price: warehouse.PackingPrice,
  1097. Status: 1,
  1098. Ctime: time.Now().Unix(),
  1099. UserOrgId: orgID,
  1100. Manufacturer: info.Manufacturer,
  1101. Dealer: info.Dealer,
  1102. LicenseNumber: warehouse.LicenseNumber,
  1103. IsEdit: 2,
  1104. Creator: warehouseOut.Creater,
  1105. SystemTime: record_time,
  1106. ConsumableType: 3,
  1107. WarehouseOutDetailId: warehouseOutInfo.ID,
  1108. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1109. IsSys: 1,
  1110. PatientId: patient_id,
  1111. ProjectId: goods.ProjectId,
  1112. }
  1113. //查询流水是否存在
  1114. exsit, errflow := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1115. if errflow == gorm.ErrRecordNotFound {
  1116. CreateStockFlowOne(flow)
  1117. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1118. CreateAutoReduceRecord(&details)
  1119. } else if errflow == nil {
  1120. flow := models.VmStockFlow{
  1121. ID: exsit.ID,
  1122. WarehouseOutId: warehouseOut.ID,
  1123. WarehousingId: warehouse.ID,
  1124. GoodId: goods.GoodId,
  1125. Number: warehouse.Number,
  1126. ProductDate: warehouse.ProductDate,
  1127. ExpireDate: warehouse.ExpiryDate,
  1128. Count: exsit.Count + goods.Count,
  1129. Price: warehouse.PackingPrice,
  1130. Status: 1,
  1131. Ctime: time.Now().Unix(),
  1132. UserOrgId: orgID,
  1133. Manufacturer: info.Manufacturer,
  1134. Dealer: info.Dealer,
  1135. LicenseNumber: warehouse.LicenseNumber,
  1136. IsEdit: 2,
  1137. Creator: warehouseOut.Creater,
  1138. SystemTime: record_time,
  1139. ConsumableType: 3,
  1140. WarehouseOutDetailId: warehouseOutInfo.ID,
  1141. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1142. IsSys: 1,
  1143. PatientId: patient_id,
  1144. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1145. ProjectId: goods.ProjectId,
  1146. }
  1147. //UpdatedStockFlow(flow)
  1148. UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1149. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1150. CreateAutoReduceRecord(&details)
  1151. }
  1152. }
  1153. maxNumber = goods.Count
  1154. if warehouse.StockCount < maxNumber {
  1155. return errors.New("库存数量不足")
  1156. }
  1157. warehouse.StockCount = warehouse.StockCount - maxNumber
  1158. warehouse.Mtime = time.Now().Unix()
  1159. if warehouse.StockCount < 0 {
  1160. return errors.New("库存数量不足")
  1161. }
  1162. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1163. if errThree != nil {
  1164. return errThree
  1165. }
  1166. return nil
  1167. } else {
  1168. // 当刚批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1169. warehouseOutInfo := &models.WarehouseOutInfo{
  1170. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1171. WarehouseOutId: warehouseOut.ID,
  1172. WarehouseInfotId: warehouse.ID,
  1173. Status: 1,
  1174. Ctime: time.Now().Unix(),
  1175. Remark: warehouse.Remark,
  1176. OrgId: orgID,
  1177. Type: 1,
  1178. Manufacturer: warehouse.Manufacturer,
  1179. Dealer: warehouse.Dealer,
  1180. IsSys: 1,
  1181. SysRecordTime: record_time,
  1182. GoodTypeId: goods.GoodTypeId,
  1183. GoodId: goods.GoodId,
  1184. PatientId: patient_id,
  1185. Number: warehouse.Number,
  1186. LicenseNumber: warehouse.LicenseNumber,
  1187. Price: warehouse.PackingPrice,
  1188. ExpiryDate: warehouse.ExpiryDate,
  1189. ProductDate: warehouse.ProductDate,
  1190. ProjectId: goods.ProjectId,
  1191. }
  1192. warehouseOutInfo.Count = stock_number
  1193. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, goods.PatientId, record_time)
  1194. if errcodes == gorm.ErrRecordNotFound {
  1195. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1196. if errOne != nil {
  1197. return errOne
  1198. }
  1199. //插入库存流水表
  1200. flow := models.VmStockFlow{
  1201. WarehouseOutId: warehouseOut.ID,
  1202. WarehousingId: warehouse.ID,
  1203. GoodId: goods.GoodId,
  1204. Number: warehouse.Number,
  1205. ProductDate: warehouse.ProductDate,
  1206. ExpireDate: warehouse.ExpiryDate,
  1207. Count: stock_number,
  1208. Price: warehouse.PackingPrice,
  1209. Status: 1,
  1210. Ctime: time.Now().Unix(),
  1211. UserOrgId: orgID,
  1212. Manufacturer: info.Manufacturer,
  1213. Dealer: info.Dealer,
  1214. LicenseNumber: warehouse.LicenseNumber,
  1215. IsEdit: 2,
  1216. Creator: warehouseOut.Creater,
  1217. SystemTime: record_time,
  1218. ConsumableType: 3,
  1219. WarehouseOutDetailId: warehouseOutInfo.ID,
  1220. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1221. IsSys: 1,
  1222. PatientId: patient_id,
  1223. ProjectId: goods.ProjectId,
  1224. }
  1225. //查询流水是否存在
  1226. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1227. if errflows == gorm.ErrRecordNotFound {
  1228. CreateStockFlowOne(flow)
  1229. } else if errflows == nil {
  1230. flow := models.VmStockFlow{
  1231. ID: exsit.ID,
  1232. WarehouseOutId: warehouseOut.ID,
  1233. WarehousingId: warehouse.ID,
  1234. GoodId: goods.GoodId,
  1235. Number: warehouse.Number,
  1236. ProductDate: warehouse.ProductDate,
  1237. ExpireDate: warehouse.ExpiryDate,
  1238. Count: exsit.Count + goods.Count,
  1239. Price: warehouse.PackingPrice,
  1240. Status: 1,
  1241. Ctime: time.Now().Unix(),
  1242. UserOrgId: orgID,
  1243. Manufacturer: info.Manufacturer,
  1244. Dealer: info.Dealer,
  1245. LicenseNumber: warehouse.LicenseNumber,
  1246. IsEdit: 2,
  1247. Creator: warehouseOut.Creater,
  1248. SystemTime: record_time,
  1249. ConsumableType: 3,
  1250. WarehouseOutDetailId: warehouseOutInfo.ID,
  1251. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1252. IsSys: 1,
  1253. PatientId: patient_id,
  1254. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1255. ProjectId: goods.ProjectId,
  1256. }
  1257. //UpdatedStockFlow(flow)
  1258. UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1259. }
  1260. } else if errcodes == nil {
  1261. goods.Count = deliver_number - stock_number
  1262. //更新数量为 该批次剩余数量 + 还有未出的数量
  1263. warehouseOutInfo.Count = stock_number
  1264. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, goods.PatientId, record_time)
  1265. //插入库存流水表
  1266. flow := models.VmStockFlow{
  1267. WarehouseOutId: warehouseOut.ID,
  1268. WarehousingId: warehouse.ID,
  1269. GoodId: goods.GoodId,
  1270. Number: warehouse.Number,
  1271. ProductDate: warehouse.ProductDate,
  1272. ExpireDate: warehouse.ExpiryDate,
  1273. Count: stock_number,
  1274. Price: warehouse.PackingPrice,
  1275. Status: 1,
  1276. Ctime: time.Now().Unix(),
  1277. UserOrgId: orgID,
  1278. Manufacturer: info.Manufacturer,
  1279. Dealer: info.Dealer,
  1280. LicenseNumber: warehouse.LicenseNumber,
  1281. IsEdit: 2,
  1282. Creator: warehouseOut.Creater,
  1283. SystemTime: record_time,
  1284. ConsumableType: 3,
  1285. WarehouseOutDetailId: warehouseOutInfo.ID,
  1286. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1287. IsSys: 1,
  1288. PatientId: patient_id,
  1289. ProjectId: goods.ProjectId,
  1290. }
  1291. //查询流水是否存在
  1292. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1293. if errflows == gorm.ErrRecordNotFound {
  1294. CreateStockFlowOne(flow)
  1295. } else if errflows == nil {
  1296. flow := models.VmStockFlow{
  1297. ID: exsit.ID,
  1298. WarehouseOutId: warehouseOut.ID,
  1299. WarehousingId: warehouse.ID,
  1300. GoodId: goods.GoodId,
  1301. Number: warehouse.Number,
  1302. ProductDate: warehouse.ProductDate,
  1303. ExpireDate: warehouse.ExpiryDate,
  1304. Count: exsit.Count + goods.Count,
  1305. Price: warehouse.PackingPrice,
  1306. Status: 1,
  1307. Ctime: time.Now().Unix(),
  1308. UserOrgId: orgID,
  1309. Manufacturer: info.Manufacturer,
  1310. Dealer: info.Dealer,
  1311. LicenseNumber: warehouse.LicenseNumber,
  1312. IsEdit: 2,
  1313. Creator: warehouseOut.Creater,
  1314. SystemTime: record_time,
  1315. ConsumableType: 3,
  1316. WarehouseOutDetailId: warehouseOutInfo.ID,
  1317. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1318. IsSys: 1,
  1319. PatientId: patient_id,
  1320. ProjectId: goods.ProjectId,
  1321. }
  1322. //UpdatedStockFlow(flow)
  1323. UpdatedStockFlowOne(flow, warehouse.ID, patient_id, record_time, goods.GoodId)
  1324. }
  1325. }
  1326. // 出库完成后,要将该批次库存清零
  1327. warehouse.StockCount = 0
  1328. warehouse.Mtime = time.Now().Unix()
  1329. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1330. if errThree != nil {
  1331. return errThree
  1332. }
  1333. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1334. goods.Count = deliver_number - stock_number
  1335. ConsumablesDelivery(orgID, patient_id, record_time, goods, warehouseOut, count)
  1336. }
  1337. return nil
  1338. }
  1339. //耗材出库删除
  1340. func ConsumablesDeliveryDelete(orgID int64, patient_id int64, record_time int64, good_yc *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut) (err error) {
  1341. // 先根据相关信息查询当天该耗材的出库信息
  1342. warehouseOutInfos, err := FindStockOutInfoByStock(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time, patient_id)
  1343. if err != nil {
  1344. return err
  1345. }
  1346. var delete_count int64 = 0
  1347. for _, ware := range warehouseOutInfos {
  1348. // 判断当前出库的数据和删除出库数量
  1349. if good_yc.Count <= ware.Count {
  1350. delete_count = good_yc.Count
  1351. } else {
  1352. delete_count = ware.Count
  1353. }
  1354. // 在出库记录表里记录退库详情
  1355. warehouseOutInfo := &models.WarehouseOutInfo{
  1356. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1357. WarehouseOutId: warehouseOut.ID,
  1358. //WarehouseInfoId: warehouse.ID,
  1359. Status: 1,
  1360. Ctime: time.Now().Unix(),
  1361. Remark: "",
  1362. OrgId: orgID,
  1363. Type: 1,
  1364. Manufacturer: 0,
  1365. Dealer: 0,
  1366. IsSys: 2,
  1367. SysRecordTime: record_time,
  1368. GoodTypeId: good_yc.GoodTypeId,
  1369. GoodId: good_yc.GoodId,
  1370. PatientId: patient_id,
  1371. }
  1372. warehouseOutInfo.Count = ware.Count - delete_count
  1373. stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1374. warehouseOutInfo.Price = stockInInfo.Price
  1375. errOne := UpdateAutoMaticReduceDetail(good_yc.GoodId, good_yc.GoodTypeId, record_time, patient_id, orgID, warehouseOutInfo)
  1376. if errOne != nil {
  1377. return errOne
  1378. } else {
  1379. details := &models.AutomaticReduceDetail{
  1380. WarehouseOutId: warehouseOutInfo.ID,
  1381. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1382. PatientId: patient_id,
  1383. Ctime: time.Now().Unix(),
  1384. Mtime: time.Now().Unix(),
  1385. Status: 1,
  1386. RecordTime: record_time,
  1387. OrgId: orgID,
  1388. GoodId: good_yc.GoodId,
  1389. GoodTypeId: good_yc.GoodTypeId,
  1390. Count: warehouseOutInfo.Count,
  1391. Type: 2,
  1392. }
  1393. //查询是否当天已经存在数据
  1394. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1395. if errcode == gorm.ErrRecordNotFound {
  1396. errTwo := AddSigleAutoReduceRecordInfo(details)
  1397. if errTwo != nil {
  1398. return errTwo
  1399. }
  1400. } else if errcode == nil {
  1401. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1402. AddSigleAutoReduceRecordInfo(details)
  1403. }
  1404. }
  1405. // 删除出库完成后,要增加对应批次的库存数量
  1406. errThree := UpDateWarehouseInfoByStockDelete(ware.WarehouseInfotId, delete_count)
  1407. if errThree != nil {
  1408. return errThree
  1409. }
  1410. // 增加了对应的库存后,看看还有多少需要退库的
  1411. good_yc.Count = good_yc.Count - delete_count
  1412. if good_yc.Count == 0 {
  1413. return nil
  1414. }
  1415. }
  1416. if good_yc.Count == 0 {
  1417. return nil
  1418. } else {
  1419. return errors.New("退库和出库数据不匹配")
  1420. }
  1421. }
  1422. func GetAutoReduceRecordInfoByPatientId(orgid int64, patient_id int64, recordTime int64) (autoReduce []*models.AutomaticReduceDetail, err error) {
  1423. err = XTReadDB().Model(&autoReduce).Where("org_id = ? and patient_id = ? and record_time = ? and status = 1", orgid, patient_id, recordTime).Find(&autoReduce).Error
  1424. return autoReduce, err
  1425. }
  1426. func DeleteDialysisBefor(orgid int64, patient_id int64, record_date int64, goodid int64, goodtypeid int64) error {
  1427. prepare := models.DialysisBeforePrepare{}
  1428. 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
  1429. return err
  1430. }
  1431. func DeleteDialysisBeforThree(orgid int64, patient_id int64, record_date int64) error {
  1432. prepare := models.DialysisBeforePrepare{}
  1433. 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
  1434. return err
  1435. }
  1436. func GetWarehouseById(id int64) (models.WarehouseOut, error) {
  1437. out := models.WarehouseOut{}
  1438. err := XTReadDB().Where("id=? and status = 1", id).Find(&out).Error
  1439. return out, err
  1440. }
  1441. //耗材出库
  1442. func ConsumablesDeliveryOne(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64) (err error) {
  1443. var deliver_number int64 = 0
  1444. var stock_number int64 = 0
  1445. var maxNumber int64 = 0
  1446. deliver_number = goods.Count
  1447. // 根据先进先出原则,查询最先入库的批次,进行出库
  1448. // 如果没有对应的库存,则报错
  1449. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId)
  1450. if err != nil {
  1451. return err
  1452. }
  1453. stock_number = warehouse.StockCount
  1454. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1455. if stock_number >= deliver_number {
  1456. warehouseOutInfo := &models.WarehouseOutInfo{
  1457. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1458. WarehouseOutId: warehouseOut.ID,
  1459. WarehouseInfotId: warehouse.ID,
  1460. Status: 1,
  1461. Ctime: time.Now().Unix(),
  1462. Remark: goods.Remark,
  1463. OrgId: orgID,
  1464. Type: 1,
  1465. Manufacturer: goods.Manufacturer,
  1466. Dealer: goods.Dealer,
  1467. IsSys: 0,
  1468. SysRecordTime: record_time,
  1469. GoodTypeId: goods.GoodTypeId,
  1470. GoodId: goods.GoodId,
  1471. ExpiryDate: goods.ExpiryDate,
  1472. ProductDate: goods.ProductDate,
  1473. Number: warehouse.Number,
  1474. Price: goods.Price,
  1475. LicenseNumber: goods.LicenseNumber,
  1476. }
  1477. warehouseOutInfo.Count = goods.Count
  1478. //添加出库单详情
  1479. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1480. if errOne != nil {
  1481. return errOne
  1482. }
  1483. stockFlow := models.VmStockFlow{
  1484. WarehousingId: warehouse.ID,
  1485. GoodId: goods.GoodId,
  1486. Number: warehouse.Number,
  1487. LicenseNumber: goods.LicenseNumber,
  1488. Count: goods.Count,
  1489. UserOrgId: goods.OrgId,
  1490. PatientId: goods.PatientId,
  1491. SystemTime: record_time,
  1492. ConsumableType: 2,
  1493. IsSys: goods.IsSys,
  1494. WarehousingOrder: "",
  1495. WarehouseOutId: warehouseOut.ID,
  1496. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1497. IsEdit: 1,
  1498. CancelStockId: 0,
  1499. CancelOrderNumber: "",
  1500. Manufacturer: goods.Manufacturer,
  1501. Dealer: goods.Dealer,
  1502. Creator: creator,
  1503. UpdateCreator: 0,
  1504. Status: 1,
  1505. Ctime: time.Now().Unix(),
  1506. Mtime: 0,
  1507. Price: warehouse.PackingPrice,
  1508. WarehousingDetailId: 0,
  1509. WarehouseOutDetailId: warehouseOutInfo.ID,
  1510. CancelOutDetailId: 0,
  1511. ProductDate: goods.ProductDate,
  1512. ExpireDate: goods.ExpiryDate,
  1513. }
  1514. //创建出库流水
  1515. CreateStockFlowOne(stockFlow)
  1516. maxNumber = goods.Count
  1517. if warehouse.StockCount < maxNumber {
  1518. return errors.New("库存数量不足")
  1519. }
  1520. warehouse.StockCount = warehouse.StockCount - maxNumber
  1521. warehouse.Mtime = time.Now().Unix()
  1522. //扣减库存
  1523. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1524. if errThree != nil {
  1525. return errThree
  1526. }
  1527. } else {
  1528. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1529. warehouseOutInfo := &models.WarehouseOutInfo{
  1530. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1531. WarehouseOutId: warehouseOut.ID,
  1532. WarehouseInfotId: warehouse.ID,
  1533. Status: 1,
  1534. Ctime: time.Now().Unix(),
  1535. Remark: goods.Remark,
  1536. OrgId: orgID,
  1537. Type: 1,
  1538. Manufacturer: goods.Manufacturer,
  1539. Dealer: goods.Dealer,
  1540. IsSys: 0,
  1541. SysRecordTime: record_time,
  1542. GoodTypeId: goods.GoodTypeId,
  1543. GoodId: goods.GoodId,
  1544. ExpiryDate: goods.ExpiryDate,
  1545. ProductDate: goods.ProductDate,
  1546. Number: warehouse.Number,
  1547. Price: warehouse.PackingPrice,
  1548. LicenseNumber: goods.LicenseNumber,
  1549. }
  1550. warehouseOutInfo.Count = stock_number
  1551. //查询是否已经生成出库单
  1552. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  1553. if errcodes == gorm.ErrRecordNotFound {
  1554. //创建出库单
  1555. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1556. if errOne != nil {
  1557. return errOne
  1558. }
  1559. } else {
  1560. warehouseOutInfo.Count = info.Count + stock_number
  1561. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  1562. }
  1563. stockFlow := models.VmStockFlow{
  1564. WarehousingId: warehouse.ID,
  1565. GoodId: goods.GoodId,
  1566. Number: warehouse.Number,
  1567. LicenseNumber: goods.LicenseNumber,
  1568. Count: stock_number,
  1569. UserOrgId: goods.OrgId,
  1570. PatientId: 0,
  1571. SystemTime: record_time,
  1572. ConsumableType: 2,
  1573. IsSys: 0,
  1574. WarehousingOrder: "",
  1575. WarehouseOutId: warehouseOut.ID,
  1576. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1577. IsEdit: 1,
  1578. CancelStockId: 0,
  1579. CancelOrderNumber: "",
  1580. Manufacturer: goods.Manufacturer,
  1581. Dealer: goods.Dealer,
  1582. Creator: creator,
  1583. UpdateCreator: 0,
  1584. Status: 1,
  1585. Ctime: time.Now().Unix(),
  1586. Mtime: 0,
  1587. Price: warehouse.PackingPrice,
  1588. WarehousingDetailId: 0,
  1589. WarehouseOutDetailId: warehouseOutInfo.ID,
  1590. CancelOutDetailId: 0,
  1591. ProductDate: goods.ProductDate,
  1592. ExpireDate: goods.ExpiryDate,
  1593. }
  1594. //创建出库明细
  1595. CreateStockFlowOne(stockFlow)
  1596. // 出库完成后,要将该批次库存清零
  1597. warehouse.StockCount = 0
  1598. warehouse.Mtime = time.Now().Unix()
  1599. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1600. if errThree != nil {
  1601. return errThree
  1602. }
  1603. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1604. goods.Count = deliver_number - stock_number
  1605. ConsumablesDeliveryOne(orgID, record_time, goods, warehouseOut, count, creator)
  1606. }
  1607. return nil
  1608. }
  1609. //退库逻辑
  1610. func ConsumablesDeliveryTwo(orgID int64, goods *models.WarehouseOutInfo, count int64) (err error) {
  1611. var deliver_number int64 = 0
  1612. var stock_number int64 = 0
  1613. var maxNumber int64 = 0
  1614. deliver_number = goods.Count
  1615. // 根据先进先出原则,查询最先入库的批次,进行出库
  1616. warehouse, err := FindFirstWarehousingInfoByGoodId(goods.GoodId, goods.ID)
  1617. if err != nil {
  1618. return err
  1619. }
  1620. stock_number = warehouse.StockCount
  1621. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1622. if stock_number >= deliver_number {
  1623. warehouseOutInfo := &models.WarehouseOutInfo{
  1624. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  1625. WarehouseOutId: goods.ID,
  1626. WarehouseInfotId: warehouse.ID,
  1627. Status: 1,
  1628. Ctime: time.Now().Unix(),
  1629. Remark: goods.Remark,
  1630. OrgId: orgID,
  1631. Type: 1,
  1632. Manufacturer: goods.Manufacturer,
  1633. Dealer: goods.Dealer,
  1634. IsSys: 0,
  1635. GoodTypeId: goods.GoodTypeId,
  1636. GoodId: goods.GoodId,
  1637. ExpiryDate: goods.ExpiryDate,
  1638. ProductDate: goods.ProductDate,
  1639. Number: goods.Number,
  1640. Price: warehouse.PackingPrice,
  1641. LicenseNumber: goods.LicenseNumber,
  1642. ConsumableType: 2,
  1643. }
  1644. warehouseOutInfo.Count = goods.Count
  1645. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1646. if errOne != nil {
  1647. return errOne
  1648. }
  1649. maxNumber = goods.Count
  1650. if warehouse.StockCount < maxNumber {
  1651. return errors.New("库存数量不足")
  1652. }
  1653. warehouse.StockCount = warehouse.StockCount - maxNumber
  1654. warehouse.Mtime = time.Now().Unix()
  1655. if warehouse.StockCount <= 0 {
  1656. return errors.New("库存数量不足")
  1657. }
  1658. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1659. if errThree != nil {
  1660. return errThree
  1661. }
  1662. return
  1663. } else {
  1664. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1665. warehouseOutInfo := &models.WarehouseOutInfo{
  1666. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  1667. WarehouseOutId: goods.ID,
  1668. WarehouseInfotId: warehouse.ID,
  1669. Status: 1,
  1670. Ctime: time.Now().Unix(),
  1671. Remark: goods.Remark,
  1672. OrgId: orgID,
  1673. Type: 1,
  1674. Manufacturer: goods.Manufacturer,
  1675. Dealer: goods.Dealer,
  1676. IsSys: 0,
  1677. GoodTypeId: goods.GoodTypeId,
  1678. GoodId: goods.GoodId,
  1679. ExpiryDate: goods.ExpiryDate,
  1680. ProductDate: goods.ProductDate,
  1681. Number: goods.Number,
  1682. Price: warehouse.PackingPrice,
  1683. LicenseNumber: goods.LicenseNumber,
  1684. ConsumableType: 2,
  1685. }
  1686. warehouseOutInfo.Count = stock_number
  1687. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1688. if errOne != nil {
  1689. return errOne
  1690. }
  1691. // 出库完成后,要将该批次库存清零
  1692. warehouse.StockCount = 0
  1693. warehouse.Mtime = time.Now().Unix()
  1694. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1695. if errThree != nil {
  1696. return errThree
  1697. }
  1698. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1699. goods.Count = deliver_number - stock_number
  1700. ConsumablesDeliveryTwo(orgID, goods, count)
  1701. }
  1702. return nil
  1703. }
  1704. func DeleteWarehouseInfo(id int64) error {
  1705. err := XTWriteDB().Model(models.WarehousingInfo{}).Where("id = ? and status = 1", id).Updates(map[string]interface{}{"stock_count": 0}).Error
  1706. return err
  1707. }
  1708. // 药品出库 递归方式
  1709. func NewDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) {
  1710. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  1711. var deliver_number int64 = 0
  1712. var stock_number int64 = 0
  1713. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  1714. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  1715. var drug_price float64
  1716. //按最小单位数据计算
  1717. deliver_number = count
  1718. if advice.PrescribingNumberUnit == drup.MaxUnit {
  1719. drug_price = drup.RetailPrice
  1720. }
  1721. if advice.PrescribingNumberUnit == drup.MinUnit {
  1722. drug_price = drup.MinPrice
  1723. }
  1724. if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit {
  1725. drug_price = drup.RetailPrice
  1726. }
  1727. // 根据先进先出原则,查询最先入库的批次,进行出库
  1728. // 如果没有对应的库存,则报错
  1729. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  1730. if err != nil {
  1731. return err
  1732. }
  1733. // 将该批次的剩余库存数量转换为拆零数量
  1734. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  1735. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1736. if stock_number >= deliver_number {
  1737. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  1738. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  1739. WarehouseOutId: warehouseout.ID,
  1740. Status: 1,
  1741. Ctime: time.Now().Unix(),
  1742. Remark: warehouse.Remark,
  1743. OrgId: orgID,
  1744. Type: 1,
  1745. Manufacturer: warehouse.Manufacturer,
  1746. Dealer: warehouse.Dealer,
  1747. IsSys: 1,
  1748. SysRecordTime: advice.RecordDate,
  1749. DrugId: advice.DrugId,
  1750. Number: warehouse.Number,
  1751. BatchNumber: warehouse.BatchNumber,
  1752. Price: warehouse.RetailPrice,
  1753. CountUnit: drup.MinUnit,
  1754. RetailPrice: drug_price,
  1755. ProductDate: warehouse.ProductDate,
  1756. ExpiryDate: warehouse.ExpiryDate,
  1757. PatientId: advice.PatientId,
  1758. Count: deliver_number, //出最小单位
  1759. WarehouseInfoId: warehouse.ID,
  1760. AdviceId: advice.ID,
  1761. }
  1762. drugflow := models.DrugFlow{
  1763. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  1764. WarehouseOutId: warehouseout.ID,
  1765. DrugId: advice.DrugId,
  1766. Number: warehouse.Number,
  1767. ProductDate: warehouse.ProductDate,
  1768. ExpireDate: warehouse.ExpiryDate,
  1769. Count: deliver_number, //按最小单位计算,
  1770. Price: warehouse.RetailPrice,
  1771. Status: 1,
  1772. Ctime: time.Now().Unix(),
  1773. UserOrgId: orgID,
  1774. Manufacturer: warehouse.Manufacturer,
  1775. Dealer: warehouse.Dealer,
  1776. BatchNumber: warehouse.BatchNumber,
  1777. MaxUnit: drup.MinUnit,
  1778. ConsumableType: 3,
  1779. IsEdit: 1,
  1780. Creator: advice.ExecutionStaff,
  1781. IsSys: 1,
  1782. PatientId: advice.PatientId,
  1783. WarehousingDetailId: warehouse.ID,
  1784. AdviceId: advice.ID,
  1785. }
  1786. CreateDrugFlowOne(drugflow)
  1787. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  1788. if errOne != nil {
  1789. return errOne
  1790. }
  1791. //查询是否存在数据
  1792. //_, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  1793. //if errcodes == gorm.ErrRecordNotFound {
  1794. // errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  1795. // if errOne != nil {
  1796. // return errOne
  1797. // }
  1798. //} else if errcodes == nil {
  1799. // UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  1800. //}
  1801. details := &models.DrugAutomaticReduceDetail{
  1802. WarehouseOutId: warehouseout.ID,
  1803. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  1804. PatientId: advice.PatientId,
  1805. Ctime: time.Now().Unix(),
  1806. Mtime: time.Now().Unix(),
  1807. Status: 1,
  1808. RecordTime: advice.RecordDate,
  1809. OrgId: orgID,
  1810. DrugId: advice.DrugId,
  1811. Count: count,
  1812. CountUnit: advice.PrescribingNumberUnit,
  1813. WarehouseInfoId: warehouse.ID,
  1814. }
  1815. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  1816. if errTwo != nil {
  1817. return errTwo
  1818. }
  1819. // 出库完成后,要减去对应批次的库存数量
  1820. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  1821. var maxNumber int64 = 0
  1822. var minNumber int64 = 0
  1823. //将拆零数量转为 最大包装单位 和 最小单位
  1824. maxNumber = deliver_number / drup.MinNumber
  1825. minNumber = deliver_number % drup.MinNumber
  1826. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  1827. minNumber = maxNumber
  1828. }
  1829. if warehouse.StockMaxNumber < maxNumber {
  1830. return errors.New("库存数量不足")
  1831. }
  1832. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  1833. warehouse.Mtime = time.Now().Unix()
  1834. if warehouse.StockMinNumber < minNumber {
  1835. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  1836. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  1837. } else {
  1838. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  1839. }
  1840. if warehouse.StockMaxNumber < 0 {
  1841. return errors.New("库存数量不足")
  1842. }
  1843. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  1844. if errThree != nil {
  1845. return errThree
  1846. }
  1847. return nil
  1848. } else {
  1849. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1850. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  1851. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  1852. WarehouseOutId: warehouseout.ID,
  1853. Status: 1,
  1854. Ctime: time.Now().Unix(),
  1855. Remark: warehouse.Remark,
  1856. OrgId: orgID,
  1857. Type: 1,
  1858. Manufacturer: warehouse.Manufacturer,
  1859. Dealer: warehouse.Dealer,
  1860. IsSys: 1,
  1861. SysRecordTime: advice.RecordDate,
  1862. DrugId: advice.DrugId,
  1863. Number: warehouse.Number,
  1864. BatchNumber: warehouse.BatchNumber,
  1865. Price: warehouse.RetailPrice,
  1866. CountUnit: drup.MinUnit,
  1867. ProductDate: warehouse.ProductDate,
  1868. ExpiryDate: warehouse.ExpiryDate,
  1869. PatientId: advice.PatientId,
  1870. Count: deliver_number,
  1871. WarehouseInfoId: warehouse.ID,
  1872. AdviceId: advice.ID,
  1873. }
  1874. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  1875. if errOne != nil {
  1876. return errOne
  1877. }
  1878. //查询是否存在数据
  1879. //_, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  1880. //if errcodes == gorm.ErrRecordNotFound {
  1881. // errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  1882. // if errOne != nil {
  1883. // return errOne
  1884. // }
  1885. //} else if errcodes == nil {
  1886. // UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  1887. //}
  1888. details := &models.DrugAutomaticReduceDetail{
  1889. WarehouseOutId: warehouseout.ID,
  1890. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1891. PatientId: advice.PatientId,
  1892. Ctime: time.Now().Unix(),
  1893. Mtime: time.Now().Unix(),
  1894. Status: 1,
  1895. RecordTime: advice.RecordDate,
  1896. OrgId: orgID,
  1897. DrugId: advice.DrugId,
  1898. Count: deliver_number,
  1899. CountUnit: drup.MinUnit,
  1900. WarehouseInfoId: warehouse.ID,
  1901. }
  1902. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  1903. if errTwo != nil {
  1904. return errTwo
  1905. }
  1906. // 出库完成后,要将该批次库存清零
  1907. //warehouse.StockMaxNumber = 0
  1908. //warehouse.StockMinNumber = 0
  1909. //warehouse.Mtime = time.Now().Unix()
  1910. info := models.XtDrugWarehouseInfo{
  1911. ID: warehouse.ID,
  1912. WarehousingId: warehouse.WarehousingId,
  1913. DrugId: warehouse.DrugId,
  1914. Number: warehouse.Number,
  1915. ProductDate: warehouse.ProductDate,
  1916. ExpiryDate: warehouse.ExpiryDate,
  1917. WarehousingCount: warehouse.WarehousingCount,
  1918. Price: warehouse.Price,
  1919. TotalPrice: warehouse.TotalPrice,
  1920. Dealer: warehouse.Dealer,
  1921. Manufacturer: warehouse.Manufacturer,
  1922. Remark: warehouse.Remark,
  1923. Ctime: warehouse.Ctime,
  1924. Mtime: warehouse.Mtime,
  1925. Status: 1,
  1926. OrgId: warehouse.OrgId,
  1927. IsReturn: warehouse.IsReturn,
  1928. WarehousingOrder: warehouse.WarehousingOrder,
  1929. Type: warehouse.Type,
  1930. RetailPrice: warehouse.RetailPrice,
  1931. RetailTotalPrice: warehouse.RetailPrice,
  1932. StockMaxNumber: 0,
  1933. StockMinNumber: 0,
  1934. BatchNumber: warehouse.BatchNumber,
  1935. MaxUnit: warehouse.MaxUnit,
  1936. WarehousingInfoId: warehouse.WarehousingInfoId,
  1937. }
  1938. //扣减库存
  1939. errThree := UpDateDrugWarehouseInfoByStock(&info)
  1940. if errThree != nil {
  1941. return errThree
  1942. }
  1943. drugflow := models.DrugFlow{
  1944. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  1945. WarehouseOutId: warehouseout.ID,
  1946. DrugId: advice.DrugId,
  1947. Number: warehouse.Number,
  1948. ProductDate: warehouse.ProductDate,
  1949. ExpireDate: warehouse.ExpiryDate,
  1950. Count: deliver_number,
  1951. Price: warehouse.RetailPrice,
  1952. Status: 1,
  1953. Ctime: time.Now().Unix(),
  1954. UserOrgId: orgID,
  1955. Manufacturer: warehouse.Manufacturer,
  1956. Dealer: warehouse.Dealer,
  1957. BatchNumber: warehouse.BatchNumber,
  1958. MaxUnit: drup.MinUnit,
  1959. ConsumableType: 3,
  1960. IsEdit: 1,
  1961. Creator: advice.ExecutionStaff,
  1962. IsSys: 1,
  1963. PatientId: advice.PatientId,
  1964. WarehousingDetailId: warehouse.ID,
  1965. AdviceId: advice.ID,
  1966. }
  1967. CreateDrugFlowOne(drugflow)
  1968. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1969. prescribingNumber_two_temp := deliver_number - stock_number
  1970. overPlusNumber := float64(prescribingNumber_two_temp)
  1971. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  1972. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  1973. NewDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  1974. }
  1975. return
  1976. }
  1977. // 药品出库 递归方式
  1978. func NewHisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  1979. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  1980. var deliver_number int64 = 0
  1981. var stock_number int64 = 0
  1982. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  1983. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  1984. deliver_number = count
  1985. var min_price float64
  1986. if advice.PrescribingNumberUnit == drup.MaxUnit {
  1987. min_price = drup.RetailPrice
  1988. }
  1989. if advice.PrescribingNumberUnit == drup.MinUnit {
  1990. min_price = drup.MinPrice
  1991. }
  1992. if advice.PrescribingNumberUnit != drup.MaxUnit && advice.PrescribingNumberUnit != drup.MinUnit {
  1993. min_price = drup.RetailPrice
  1994. }
  1995. fmt.Println(min_price)
  1996. // 根据先进先出原则,查询最先入库的批次,进行出库
  1997. // 如果没有对应的库存,则报错
  1998. //开启事物
  1999. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  2000. //查找药品信息
  2001. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  2002. if err != nil {
  2003. return err
  2004. }
  2005. // 将该批次的剩余库存数量转换为拆零数量
  2006. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2007. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2008. if stock_number >= deliver_number {
  2009. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2010. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2011. WarehouseOutId: warehouseout.ID,
  2012. Status: 1,
  2013. Ctime: time.Now().Unix(),
  2014. Remark: warehouse.Remark,
  2015. OrgId: orgID,
  2016. Type: 1,
  2017. Manufacturer: warehouse.Manufacturer,
  2018. Dealer: warehouse.Dealer,
  2019. IsSys: 1,
  2020. SysRecordTime: advice.RecordDate,
  2021. DrugId: advice.DrugId,
  2022. Number: warehouse.Number,
  2023. BatchNumber: warehouse.BatchNumber,
  2024. Price: warehouse.RetailPrice,
  2025. CountUnit: drup.MinUnit,
  2026. RetailPrice: warehouse.RetailPrice,
  2027. ProductDate: warehouse.ProductDate,
  2028. ExpiryDate: warehouse.ExpiryDate,
  2029. PatientId: advice.PatientId,
  2030. WarehouseInfoId: warehouse.ID,
  2031. Count: deliver_number,
  2032. AdviceId: advice.ID,
  2033. }
  2034. drugflow := models.DrugFlow{
  2035. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2036. WarehouseOutId: warehouseout.ID,
  2037. DrugId: advice.DrugId,
  2038. Number: warehouse.Number,
  2039. ProductDate: warehouse.ProductDate,
  2040. ExpireDate: warehouse.ExpiryDate,
  2041. Count: deliver_number,
  2042. Price: warehouse.RetailPrice,
  2043. Status: 1,
  2044. Ctime: time.Now().Unix(),
  2045. UserOrgId: orgID,
  2046. Manufacturer: warehouse.Manufacturer,
  2047. Dealer: warehouse.Dealer,
  2048. BatchNumber: warehouse.BatchNumber,
  2049. MaxUnit: drup.MinUnit,
  2050. ConsumableType: 3,
  2051. IsEdit: 1,
  2052. Creator: advice.ExecutionStaff,
  2053. IsSys: 1,
  2054. PatientId: advice.PatientId,
  2055. SystemTime: advice.RecordDate,
  2056. WarehousingDetailId: warehouse.ID,
  2057. AdviceId: advice.ID,
  2058. }
  2059. CreateDrugFlowOne(drugflow)
  2060. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2061. if errOne != nil {
  2062. return errOne
  2063. }
  2064. details := &models.DrugAutomaticReduceDetail{
  2065. WarehouseOutId: warehouseout.ID,
  2066. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2067. PatientId: advice.PatientId,
  2068. Ctime: time.Now().Unix(),
  2069. Mtime: time.Now().Unix(),
  2070. Status: 1,
  2071. RecordTime: advice.RecordDate,
  2072. OrgId: orgID,
  2073. DrugId: advice.DrugId,
  2074. Count: deliver_number,
  2075. CountUnit: drup.MinUnit,
  2076. WarehouseInfoId: warehouse.ID,
  2077. AdviceId: advice.ID,
  2078. }
  2079. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2080. if errTwo != nil {
  2081. return errTwo
  2082. }
  2083. // 出库完成后,要减去对应批次的库存数量
  2084. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  2085. var maxNumber int64 = 0
  2086. var minNumber int64 = 0
  2087. //把拆零单位转为最大单位 和 最小单位
  2088. maxNumber = deliver_number / drup.MinNumber
  2089. minNumber = deliver_number % drup.MinNumber
  2090. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  2091. minNumber = maxNumber
  2092. }
  2093. if warehouse.StockMaxNumber < maxNumber {
  2094. return errors.New("库存数量不足")
  2095. }
  2096. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2097. warehouse.Mtime = time.Now().Unix()
  2098. if warehouse.StockMinNumber < minNumber {
  2099. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2100. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2101. } else {
  2102. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2103. }
  2104. if warehouse.StockMaxNumber < 0 {
  2105. return errors.New("库存数量不足")
  2106. }
  2107. if warehouse.StockMinNumber <= 0 {
  2108. warehouse.StockMinNumber = 0
  2109. }
  2110. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2111. if errThree != nil {
  2112. return errThree
  2113. }
  2114. return nil
  2115. } else {
  2116. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2117. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2118. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2119. WarehouseOutId: warehouseout.ID,
  2120. Status: 1,
  2121. Ctime: time.Now().Unix(),
  2122. Remark: warehouse.Remark,
  2123. OrgId: orgID,
  2124. Type: 1,
  2125. Manufacturer: warehouse.Manufacturer,
  2126. Dealer: warehouse.Dealer,
  2127. IsSys: 1,
  2128. SysRecordTime: advice.RecordDate,
  2129. DrugId: advice.DrugId,
  2130. Number: warehouse.Number,
  2131. BatchNumber: warehouse.BatchNumber,
  2132. Price: warehouse.RetailPrice,
  2133. RetailPrice: warehouse.RetailPrice,
  2134. ProductDate: warehouse.ProductDate,
  2135. ExpiryDate: warehouse.ExpiryDate,
  2136. PatientId: advice.PatientId,
  2137. WarehouseInfoId: warehouse.ID,
  2138. Count: stock_number,
  2139. CountUnit: drup.MinUnit,
  2140. AdviceId: advice.ID,
  2141. }
  2142. drugflow := models.DrugFlow{
  2143. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2144. WarehouseOutId: warehouseout.ID,
  2145. DrugId: advice.DrugId,
  2146. Number: warehouse.Number,
  2147. ProductDate: warehouse.ProductDate,
  2148. ExpireDate: warehouse.ExpiryDate,
  2149. Count: stock_number,
  2150. Price: warehouse.RetailPrice,
  2151. Status: 1,
  2152. Ctime: time.Now().Unix(),
  2153. UserOrgId: orgID,
  2154. Manufacturer: warehouse.Manufacturer,
  2155. Dealer: warehouse.Dealer,
  2156. BatchNumber: warehouse.BatchNumber,
  2157. MaxUnit: drup.MinUnit,
  2158. ConsumableType: 3,
  2159. IsEdit: 1,
  2160. Creator: advice.ExecutionStaff,
  2161. IsSys: 1,
  2162. PatientId: advice.PatientId,
  2163. SystemTime: advice.RecordDate,
  2164. WarehousingDetailId: warehouse.ID,
  2165. AdviceId: advice.ID,
  2166. }
  2167. CreateDrugFlowOne(drugflow)
  2168. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2169. if errOne != nil {
  2170. return errOne
  2171. }
  2172. details := &models.DrugAutomaticReduceDetail{
  2173. WarehouseOutId: warehouseout.ID,
  2174. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2175. PatientId: advice.PatientId,
  2176. Ctime: time.Now().Unix(),
  2177. Mtime: time.Now().Unix(),
  2178. Status: 1,
  2179. RecordTime: advice.RecordDate,
  2180. OrgId: orgID,
  2181. DrugId: advice.DrugId,
  2182. Count: stock_number,
  2183. CountUnit: drup.MinUnit,
  2184. WarehouseInfoId: warehouse.ID,
  2185. AdviceId: advice.ID,
  2186. }
  2187. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  2188. if errTwo != nil {
  2189. return errTwo
  2190. }
  2191. info := models.XtDrugWarehouseInfo{
  2192. ID: warehouse.ID,
  2193. WarehousingId: warehouse.WarehousingId,
  2194. DrugId: warehouse.DrugId,
  2195. Number: warehouse.Number,
  2196. ProductDate: warehouse.ProductDate,
  2197. ExpiryDate: warehouse.ExpiryDate,
  2198. WarehousingCount: warehouse.WarehousingCount,
  2199. Price: warehouse.RetailPrice,
  2200. TotalPrice: warehouse.TotalPrice,
  2201. Dealer: warehouse.Dealer,
  2202. Manufacturer: warehouse.Manufacturer,
  2203. Remark: warehouse.Remark,
  2204. Ctime: warehouse.Ctime,
  2205. Mtime: warehouse.Mtime,
  2206. Status: 1,
  2207. OrgId: warehouse.OrgId,
  2208. IsReturn: warehouse.IsReturn,
  2209. WarehousingOrder: warehouse.WarehousingOrder,
  2210. Type: warehouse.Type,
  2211. RetailPrice: warehouse.RetailPrice,
  2212. RetailTotalPrice: warehouse.RetailPrice,
  2213. StockMaxNumber: 0,
  2214. StockMinNumber: 0,
  2215. BatchNumber: warehouse.BatchNumber,
  2216. MaxUnit: warehouse.MaxUnit,
  2217. WarehousingInfoId: warehouse.WarehousingInfoId,
  2218. }
  2219. errThree := UpDateDrugWarehouseInfoByStock(&info)
  2220. if errThree != nil {
  2221. return errThree
  2222. }
  2223. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2224. prescribingNumber_two_temp := deliver_number - stock_number
  2225. overPlusNumber := float64(prescribingNumber_two_temp)
  2226. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  2227. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  2228. NewHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  2229. }
  2230. return
  2231. }
  2232. // 药品出库 递归方式
  2233. func HisAuToReduce(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  2234. //查询最后一次出库数据
  2235. drugInfo, _ := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  2236. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  2237. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  2238. var count_number int64
  2239. var device_number int64
  2240. if advice.PrescribingNumberUnit == drup.MaxUnit {
  2241. device_number = count * drup.MinNumber
  2242. }
  2243. if advice.PrescribingNumberUnit == drup.MinUnit {
  2244. device_number = count
  2245. }
  2246. if drugInfo.CountUnit == drup.MaxUnit {
  2247. count_number = drugInfo.Count * drup.MinNumber
  2248. }
  2249. if drugInfo.CountUnit == drup.MinUnit {
  2250. count_number = drugInfo.Count
  2251. }
  2252. // 比较数据大小
  2253. //如果当期医嘱数量小于最后一次出库则退库
  2254. if device_number < count_number {
  2255. fmt.Println("进来了吗")
  2256. var cha_number int64
  2257. var maxNumber int64
  2258. var minNumber int64
  2259. cha_number = count_number - device_number
  2260. maxNumber = cha_number / drup.MinNumber
  2261. minNumber = cha_number % drup.MinNumber
  2262. //更改库存
  2263. ModifyDrugWarehouse(drugInfo.WarehouseInfoId, maxNumber, minNumber)
  2264. //修改出库表
  2265. info := models.DrugWarehouseOutInfo{
  2266. Count: device_number,
  2267. CountUnit: advice.PrescribingNumberUnit,
  2268. }
  2269. ModifyDrugWarehouseOutInfo(info, advice.DrugId, advice.PatientId, advice.RecordDate)
  2270. //修改自动出库表
  2271. detail := models.DrugAutomaticReduceDetail{
  2272. Count: device_number,
  2273. CountUnit: advice.PrescribingNumberUnit,
  2274. }
  2275. ModifyAutoMaticReduce(detail, advice.PatientId, advice.RecordDate, advice.DrugId)
  2276. //修改流水
  2277. flow := models.DrugFlow{
  2278. Count: device_number,
  2279. MaxUnit: drup.MinUnit,
  2280. }
  2281. ModifyDrugFlow(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId)
  2282. }
  2283. fmt.Println("医嘱数量44444444444444", device_number)
  2284. fmt.Println("最后一次出库数量", count_number)
  2285. //如果当期医嘱数量大于最后一次出库则需要出库
  2286. if device_number > count_number {
  2287. var cha_number int64
  2288. cha_number = device_number - count_number
  2289. // 根据先进先出原则,查询最先入库的批次,进行出库
  2290. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  2291. //查找药品信息
  2292. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  2293. if err != nil {
  2294. return err
  2295. }
  2296. // 将该批次的剩余库存数量转换为拆零数量
  2297. var stock_number int64
  2298. var maxNumber int64
  2299. var minNumber int64
  2300. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2301. //如果库存数量大于出库数据,正常出库
  2302. if stock_number >= cha_number {
  2303. //扣减库存
  2304. maxNumber = cha_number / drup.MinNumber
  2305. minNumber = cha_number % drup.MinNumber
  2306. if warehouse.StockMaxNumber == 0 && drup.MaxUnit == drup.MinUnit {
  2307. minNumber = maxNumber
  2308. }
  2309. if drup.MaxUnit != drup.MinUnit {
  2310. if warehouse.StockMaxNumber < maxNumber {
  2311. return errors.New("库存数量不足")
  2312. }
  2313. }
  2314. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2315. if warehouse.StockMaxNumber < 0 {
  2316. warehouse.StockMaxNumber = 0
  2317. }
  2318. warehouse.Mtime = time.Now().Unix()
  2319. if warehouse.StockMinNumber < minNumber {
  2320. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2321. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2322. } else {
  2323. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2324. }
  2325. if drup.MaxUnit != drup.MinUnit {
  2326. if warehouse.StockMaxNumber < 0 {
  2327. return errors.New("库存数量不足")
  2328. }
  2329. }
  2330. //扣减库存232332332332
  2331. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2332. if errThree != nil {
  2333. return errThree
  2334. }
  2335. //修改出库表
  2336. info := models.DrugWarehouseOutInfo{
  2337. Count: device_number,
  2338. CountUnit: advice.PrescribingNumberUnit,
  2339. }
  2340. ModifyDrugWarehouseOutInfoOne(info, advice.DrugId, advice.PatientId, advice.RecordDate, warehouse.ID)
  2341. //修改自动出库表
  2342. detail := models.DrugAutomaticReduceDetail{
  2343. Count: device_number,
  2344. CountUnit: advice.PrescribingNumberUnit,
  2345. }
  2346. ModifyAutoMaticReduceOne(detail, advice.PatientId, advice.RecordDate, advice.DrugId, warehouse.ID)
  2347. //修改流水
  2348. flow := models.DrugFlow{
  2349. Count: device_number,
  2350. MaxUnit: advice.PrescribingNumberUnit,
  2351. }
  2352. ModifyDrugFlowOne(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId, warehouse.ID)
  2353. }
  2354. //如果库存数量小于出库数据,则需要出库到下一个批次
  2355. if stock_number < cha_number {
  2356. //修改出库表
  2357. info := models.DrugWarehouseOutInfo{
  2358. Count: cha_number,
  2359. CountUnit: advice.PrescribingNumberUnit,
  2360. }
  2361. ModifyDrugWarehouseOutInfoOne(info, advice.DrugId, advice.PatientId, advice.RecordDate, warehouse.ID)
  2362. //修改自动出库表
  2363. detail := models.DrugAutomaticReduceDetail{
  2364. Count: cha_number,
  2365. CountUnit: advice.PrescribingNumberUnit,
  2366. }
  2367. ModifyAutoMaticReduceOne(detail, advice.PatientId, advice.RecordDate, advice.DrugId, warehouse.ID)
  2368. //修改流水
  2369. flow := models.DrugFlow{
  2370. Count: cha_number,
  2371. MaxUnit: advice.PrescribingNumberUnit,
  2372. }
  2373. ModifyDrugFlowOne(flow, drugInfo.WarehouseOutOrderNumber, advice.DrugId, advice.PatientId, warehouse.ID)
  2374. druginfo := &models.XtDrugWarehouseInfo{
  2375. ID: warehouse.ID,
  2376. WarehousingId: warehouse.WarehousingId,
  2377. DrugId: warehouse.DrugId,
  2378. Number: warehouse.Number,
  2379. ProductDate: warehouse.ProductDate,
  2380. ExpiryDate: warehouse.ExpiryDate,
  2381. WarehousingCount: warehouse.WarehousingCount,
  2382. Price: warehouse.Price,
  2383. TotalPrice: warehouse.TotalPrice,
  2384. Dealer: warehouse.Dealer,
  2385. Manufacturer: warehouse.Manufacturer,
  2386. Remark: warehouse.Remark,
  2387. Ctime: warehouse.Ctime,
  2388. Mtime: warehouse.Mtime,
  2389. Status: 1,
  2390. OrgId: warehouse.OrgId,
  2391. IsReturn: warehouse.IsReturn,
  2392. WarehousingOrder: warehouse.WarehousingOrder,
  2393. Type: warehouse.Type,
  2394. RetailPrice: warehouse.RetailPrice,
  2395. RetailTotalPrice: warehouse.RetailPrice,
  2396. StockMaxNumber: 0,
  2397. StockMinNumber: 0,
  2398. BatchNumber: warehouse.BatchNumber,
  2399. MaxUnit: warehouse.MaxUnit,
  2400. WarehousingInfoId: warehouse.WarehousingInfoId,
  2401. }
  2402. errThree := UpDateDrugWarehouseInfoByStock(druginfo)
  2403. if errThree != nil {
  2404. return errThree
  2405. }
  2406. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2407. prescribingNumber_two_temp := cha_number - stock_number
  2408. overPlusNumber := float64(prescribingNumber_two_temp)
  2409. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  2410. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  2411. NewHisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  2412. }
  2413. }
  2414. return
  2415. }
  2416. //采购管理耗材出库逻辑
  2417. 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) {
  2418. var deliver_number int64 = 0
  2419. var stock_number int64 = 0
  2420. var maxNumber int64 = 0
  2421. deliver_number = goods.Count
  2422. // 根据先进先出原则,查询最先入库的批次,进行出库
  2423. // 如果没有对应的库存,则报错
  2424. warehouse, err := FindFirstWarehousingInfoByStockNight(goods.GoodId, goods.GoodTypeId, warehouse_out_id)
  2425. if err != nil {
  2426. return err
  2427. }
  2428. stock_number = warehouse.StockCount
  2429. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2430. if stock_number >= deliver_number {
  2431. warehouseOutInfo := &models.WarehouseOutInfo{
  2432. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2433. WarehouseOutId: warehouseOut.ID,
  2434. WarehouseInfotId: warehouse.ID,
  2435. Status: 1,
  2436. Ctime: time.Now().Unix(),
  2437. Remark: goods.Remark,
  2438. OrgId: orgID,
  2439. Type: 1,
  2440. Manufacturer: goods.Manufacturer,
  2441. Dealer: goods.Dealer,
  2442. IsSys: 0,
  2443. SysRecordTime: record_time,
  2444. GoodTypeId: goods.GoodTypeId,
  2445. GoodId: goods.GoodId,
  2446. ExpiryDate: goods.ExpiryDate,
  2447. ProductDate: goods.ProductDate,
  2448. Number: warehouse.Number,
  2449. Price: goods.Price,
  2450. LicenseNumber: goods.LicenseNumber,
  2451. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2452. }
  2453. warehouseOutInfo.Count = goods.Count
  2454. //添加出库单详情
  2455. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2456. if errOne != nil {
  2457. return errOne
  2458. }
  2459. stockFlow := models.VmStockFlow{
  2460. WarehousingId: warehouse.ID,
  2461. GoodId: goods.GoodId,
  2462. Number: warehouse.Number,
  2463. LicenseNumber: goods.LicenseNumber,
  2464. Count: goods.Count,
  2465. UserOrgId: goods.OrgId,
  2466. PatientId: goods.PatientId,
  2467. SystemTime: record_time,
  2468. ConsumableType: 2,
  2469. IsSys: goods.IsSys,
  2470. WarehousingOrder: "",
  2471. WarehouseOutId: warehouseOut.ID,
  2472. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2473. IsEdit: 1,
  2474. CancelStockId: 0,
  2475. CancelOrderNumber: "",
  2476. Manufacturer: goods.Manufacturer,
  2477. Dealer: goods.Dealer,
  2478. Creator: creator,
  2479. UpdateCreator: 0,
  2480. Status: 1,
  2481. Ctime: time.Now().Unix(),
  2482. Mtime: 0,
  2483. Price: warehouse.PackingPrice,
  2484. WarehousingDetailId: 0,
  2485. WarehouseOutDetailId: warehouseOutInfo.ID,
  2486. CancelOutDetailId: 0,
  2487. ProductDate: goods.ProductDate,
  2488. ExpireDate: goods.ExpiryDate,
  2489. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2490. SupplyWarehouseId: warehouseOut.SupplyWarehouseId,
  2491. }
  2492. //创建出库流水
  2493. CreateStockFlowOne(stockFlow)
  2494. maxNumber = goods.Count
  2495. if warehouse.StockCount < maxNumber {
  2496. return errors.New("库存数量不足")
  2497. }
  2498. warehouse.StockCount = warehouse.StockCount - maxNumber
  2499. warehouse.Mtime = time.Now().Unix()
  2500. //扣减库存
  2501. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2502. if errThree != nil {
  2503. return errThree
  2504. }
  2505. } else {
  2506. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2507. warehouseOutInfo := &models.WarehouseOutInfo{
  2508. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2509. WarehouseOutId: warehouseOut.ID,
  2510. WarehouseInfotId: warehouse.ID,
  2511. Status: 1,
  2512. Ctime: time.Now().Unix(),
  2513. Remark: goods.Remark,
  2514. OrgId: orgID,
  2515. Type: 1,
  2516. Manufacturer: goods.Manufacturer,
  2517. Dealer: goods.Dealer,
  2518. IsSys: 0,
  2519. SysRecordTime: record_time,
  2520. GoodTypeId: goods.GoodTypeId,
  2521. GoodId: goods.GoodId,
  2522. ExpiryDate: goods.ExpiryDate,
  2523. ProductDate: goods.ProductDate,
  2524. Number: warehouse.Number,
  2525. Price: warehouse.PackingPrice,
  2526. LicenseNumber: goods.LicenseNumber,
  2527. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2528. }
  2529. warehouseOutInfo.Count = stock_number
  2530. //查询是否已经生成出库单
  2531. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  2532. if errcodes == gorm.ErrRecordNotFound {
  2533. //创建出库单
  2534. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2535. if errOne != nil {
  2536. return errOne
  2537. }
  2538. } else {
  2539. warehouseOutInfo.Count = info.Count + stock_number
  2540. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  2541. }
  2542. stockFlow := models.VmStockFlow{
  2543. WarehousingId: warehouse.ID,
  2544. GoodId: goods.GoodId,
  2545. Number: warehouse.Number,
  2546. LicenseNumber: goods.LicenseNumber,
  2547. Count: stock_number,
  2548. UserOrgId: goods.OrgId,
  2549. PatientId: 0,
  2550. SystemTime: record_time,
  2551. ConsumableType: 2,
  2552. IsSys: 0,
  2553. WarehousingOrder: "",
  2554. WarehouseOutId: warehouseOut.ID,
  2555. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2556. IsEdit: 1,
  2557. CancelStockId: 0,
  2558. CancelOrderNumber: "",
  2559. Manufacturer: goods.Manufacturer,
  2560. Dealer: goods.Dealer,
  2561. Creator: creator,
  2562. UpdateCreator: 0,
  2563. Status: 1,
  2564. Ctime: time.Now().Unix(),
  2565. Mtime: 0,
  2566. Price: warehouse.PackingPrice,
  2567. WarehousingDetailId: 0,
  2568. WarehouseOutDetailId: warehouseOutInfo.ID,
  2569. CancelOutDetailId: 0,
  2570. ProductDate: goods.ProductDate,
  2571. ExpireDate: goods.ExpiryDate,
  2572. SupplyCancelOutId: warehouseOut.SupplyCancelOutId,
  2573. SupplyWarehouseId: warehouseOut.SupplyWarehouseId,
  2574. }
  2575. //创建出库明细
  2576. CreateStockFlowOne(stockFlow)
  2577. // 出库完成后,要将该批次库存清零
  2578. warehouse.StockCount = 0
  2579. warehouse.Mtime = time.Now().Unix()
  2580. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2581. if errThree != nil {
  2582. return errThree
  2583. }
  2584. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2585. goods.Count = deliver_number - stock_number
  2586. ConsumablesDeliveryNight(orgID, record_time, goods, warehouseOut, count, creator, warehouse_out_id, cancel_out_id)
  2587. }
  2588. return nil
  2589. }
  2590. func FindFirstWarehousingInfoByStockNight(good_id int64, good_type_id int64, warehouse_out_id int64) (info models.WarehousingInfo, err error) {
  2591. err = readDb.Model(&models.WarehousingInfo{}).Where("good_id = ? AND good_type_id = ? AND status = 1 and stock_count > 0 and supply_warehouse_id = ?", good_id, good_type_id, warehouse_out_id).Order("ctime").First(&info).Error
  2592. return info, err
  2593. }
  2594. // 药品出库 递归方式
  2595. func AutoDrugDeliverInfoNight(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  2596. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  2597. var deliver_number int64 = 0
  2598. var stock_number int64 = 0
  2599. if advice.CountUnit == drup.MaxUnit {
  2600. deliver_number = prescribingNumber * drup.MinNumber
  2601. } else {
  2602. deliver_number = prescribingNumber
  2603. }
  2604. // 根据先进先出原则,查询最先入库的批次,进行出库
  2605. // 如果没有对应的库存,则报错
  2606. //开启事物
  2607. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  2608. if err != nil {
  2609. return err
  2610. }
  2611. // 将该批次的剩余库存数量转换为拆零数量
  2612. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2613. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2614. if stock_number >= deliver_number {
  2615. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2616. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2617. WarehouseOutId: warehouseout.ID,
  2618. Status: 1,
  2619. Ctime: time.Now().Unix(),
  2620. Remark: advice.Remark,
  2621. OrgId: orgID,
  2622. Type: 1,
  2623. Manufacturer: advice.Manufacturer,
  2624. Dealer: warehouse.Dealer,
  2625. IsSys: 0,
  2626. SysRecordTime: advice.Ctime,
  2627. DrugId: advice.DrugId,
  2628. ExpiryDate: advice.ExpiryDate,
  2629. ProductDate: advice.ProductDate,
  2630. Number: advice.Number,
  2631. BatchNumber: warehouse.BatchNumber,
  2632. Count: deliver_number,
  2633. RetailPrice: advice.RetailPrice,
  2634. Price: advice.Price,
  2635. WarehouseInfoId: warehouse.ID,
  2636. CountUnit: drup.MinUnit,
  2637. AdviceId: advice.ID,
  2638. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  2639. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  2640. }
  2641. warehouseOutInfo.Count = prescribingNumber
  2642. warehouseOutInfo.CountUnit = advice.CountUnit
  2643. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2644. if errOne != nil {
  2645. return errOne
  2646. }
  2647. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  2648. drugflow := models.DrugFlow{
  2649. WarehouseOutId: warehouseout.ID,
  2650. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2651. DrugId: advice.DrugId,
  2652. Number: warehouse.Number,
  2653. ProductDate: advice.ProductDate,
  2654. ExpireDate: advice.ExpiryDate,
  2655. Count: deliver_number,
  2656. Price: advice.Price,
  2657. Status: 1,
  2658. Ctime: time.Now().Unix(),
  2659. UserOrgId: advice.OrgId,
  2660. Manufacturer: advice.Manufacturer,
  2661. Dealer: advice.Dealer,
  2662. BatchNumber: warehouse.BatchNumber,
  2663. MaxUnit: drup.MinUnit,
  2664. ConsumableType: 2,
  2665. IsEdit: 1,
  2666. Creator: 0,
  2667. IsSys: 0,
  2668. WarehouseOutDetailId: drugWareInfo.ID,
  2669. AdviceId: advice.ID,
  2670. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  2671. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  2672. }
  2673. CreateDrugFlowOne(drugflow)
  2674. // 出库完成后,要减去对应批次的库存数量
  2675. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  2676. var maxNumber int64 = 0
  2677. var minNumber int64 = 0
  2678. if advice.CountUnit == drup.MinUnit {
  2679. maxNumber = prescribingNumber / drup.MinNumber
  2680. minNumber = prescribingNumber % drup.MinNumber
  2681. } else {
  2682. maxNumber = prescribingNumber
  2683. }
  2684. if warehouse.StockMaxNumber < maxNumber {
  2685. return errors.New("库存数量不足")
  2686. }
  2687. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2688. warehouse.Mtime = time.Now().Unix()
  2689. if warehouse.StockMinNumber < minNumber {
  2690. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2691. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2692. } else {
  2693. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2694. }
  2695. if warehouse.StockMaxNumber < 0 {
  2696. return errors.New("库存数量不足")
  2697. }
  2698. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2699. if errThree != nil {
  2700. return errThree
  2701. }
  2702. return nil
  2703. } else {
  2704. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2705. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2706. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2707. WarehouseOutId: warehouseout.ID,
  2708. Status: 1,
  2709. Ctime: time.Now().Unix(),
  2710. Remark: advice.Remark,
  2711. OrgId: orgID,
  2712. Type: 1,
  2713. Manufacturer: advice.Manufacturer,
  2714. Dealer: warehouse.Dealer,
  2715. IsSys: 0,
  2716. SysRecordTime: advice.Ctime,
  2717. DrugId: advice.DrugId,
  2718. ExpiryDate: warehouse.ExpiryDate,
  2719. ProductDate: warehouse.ProductDate,
  2720. Number: warehouse.Number,
  2721. BatchNumber: warehouse.BatchNumber,
  2722. Count: stock_number,
  2723. RetailPrice: advice.RetailPrice,
  2724. Price: advice.Price,
  2725. WarehouseInfoId: warehouse.ID,
  2726. CountUnit: drup.MinUnit,
  2727. AdviceId: advice.ID,
  2728. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  2729. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  2730. }
  2731. warehouseOutInfo.Count = stock_number
  2732. //warehouseOutInfo.CountUnit = advice.CountUnit
  2733. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2734. if errOne != nil {
  2735. return errOne
  2736. }
  2737. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  2738. drugflow := models.DrugFlow{
  2739. WarehouseOutId: warehouseout.ID,
  2740. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2741. DrugId: advice.DrugId,
  2742. Number: warehouse.Number,
  2743. ProductDate: advice.ProductDate,
  2744. ExpireDate: advice.ExpiryDate,
  2745. Count: stock_number,
  2746. Price: advice.Price,
  2747. Status: 1,
  2748. Ctime: time.Now().Unix(),
  2749. UserOrgId: advice.OrgId,
  2750. Manufacturer: advice.Manufacturer,
  2751. Dealer: advice.Dealer,
  2752. BatchNumber: warehouse.BatchNumber,
  2753. MaxUnit: drup.MinUnit,
  2754. ConsumableType: 2,
  2755. IsEdit: 1,
  2756. Creator: 0,
  2757. IsSys: 0,
  2758. WarehouseOutDetailId: drugWareInfo.ID,
  2759. AdviceId: advice.ID,
  2760. SupplyCancelOutId: warehouseout.SupplyCancelOutId,
  2761. SupplyWarehouseId: warehouseout.SupplyWarehouseId,
  2762. }
  2763. CreateDrugFlowOne(drugflow)
  2764. // 出库完成后,要将该批次库存清零
  2765. warehouse.StockMaxNumber = 0
  2766. warehouse.StockMinNumber = 0
  2767. warehouse.Mtime = time.Now().Unix()
  2768. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2769. if errThree != nil {
  2770. return errThree
  2771. }
  2772. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2773. prescribingNumber_two_temp := deliver_number - stock_number
  2774. advice.CountUnit = drup.MinUnit
  2775. AutoDrugDeliverInfoNight(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  2776. }
  2777. return
  2778. }