warhouse_service.go 111KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149
  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. }
  2452. warehouseOutInfo.Count = goods.Count
  2453. //添加出库单详情
  2454. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2455. if errOne != nil {
  2456. return errOne
  2457. }
  2458. stockFlow := models.VmStockFlow{
  2459. WarehousingId: warehouse.ID,
  2460. GoodId: goods.GoodId,
  2461. Number: warehouse.Number,
  2462. LicenseNumber: goods.LicenseNumber,
  2463. Count: goods.Count,
  2464. UserOrgId: goods.OrgId,
  2465. PatientId: goods.PatientId,
  2466. SystemTime: record_time,
  2467. ConsumableType: 2,
  2468. IsSys: goods.IsSys,
  2469. WarehousingOrder: "",
  2470. WarehouseOutId: warehouseOut.ID,
  2471. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2472. IsEdit: 1,
  2473. CancelStockId: 0,
  2474. CancelOrderNumber: "",
  2475. Manufacturer: goods.Manufacturer,
  2476. Dealer: goods.Dealer,
  2477. Creator: creator,
  2478. UpdateCreator: 0,
  2479. Status: 1,
  2480. Ctime: time.Now().Unix(),
  2481. Mtime: 0,
  2482. Price: warehouse.PackingPrice,
  2483. WarehousingDetailId: 0,
  2484. WarehouseOutDetailId: warehouseOutInfo.ID,
  2485. CancelOutDetailId: 0,
  2486. ProductDate: goods.ProductDate,
  2487. ExpireDate: goods.ExpiryDate,
  2488. }
  2489. //创建出库流水
  2490. CreateStockFlowOne(stockFlow)
  2491. maxNumber = goods.Count
  2492. if warehouse.StockCount < maxNumber {
  2493. return errors.New("库存数量不足")
  2494. }
  2495. warehouse.StockCount = warehouse.StockCount - maxNumber
  2496. warehouse.Mtime = time.Now().Unix()
  2497. //扣减库存
  2498. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2499. if errThree != nil {
  2500. return errThree
  2501. }
  2502. } else {
  2503. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2504. warehouseOutInfo := &models.WarehouseOutInfo{
  2505. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2506. WarehouseOutId: warehouseOut.ID,
  2507. WarehouseInfotId: warehouse.ID,
  2508. Status: 1,
  2509. Ctime: time.Now().Unix(),
  2510. Remark: goods.Remark,
  2511. OrgId: orgID,
  2512. Type: 1,
  2513. Manufacturer: goods.Manufacturer,
  2514. Dealer: goods.Dealer,
  2515. IsSys: 0,
  2516. SysRecordTime: record_time,
  2517. GoodTypeId: goods.GoodTypeId,
  2518. GoodId: goods.GoodId,
  2519. ExpiryDate: goods.ExpiryDate,
  2520. ProductDate: goods.ProductDate,
  2521. Number: warehouse.Number,
  2522. Price: warehouse.PackingPrice,
  2523. LicenseNumber: goods.LicenseNumber,
  2524. }
  2525. warehouseOutInfo.Count = stock_number
  2526. //查询是否已经生成出库单
  2527. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  2528. if errcodes == gorm.ErrRecordNotFound {
  2529. //创建出库单
  2530. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  2531. if errOne != nil {
  2532. return errOne
  2533. }
  2534. } else {
  2535. warehouseOutInfo.Count = info.Count + stock_number
  2536. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  2537. }
  2538. stockFlow := models.VmStockFlow{
  2539. WarehousingId: warehouse.ID,
  2540. GoodId: goods.GoodId,
  2541. Number: warehouse.Number,
  2542. LicenseNumber: goods.LicenseNumber,
  2543. Count: stock_number,
  2544. UserOrgId: goods.OrgId,
  2545. PatientId: 0,
  2546. SystemTime: record_time,
  2547. ConsumableType: 2,
  2548. IsSys: 0,
  2549. WarehousingOrder: "",
  2550. WarehouseOutId: warehouseOut.ID,
  2551. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  2552. IsEdit: 1,
  2553. CancelStockId: 0,
  2554. CancelOrderNumber: "",
  2555. Manufacturer: goods.Manufacturer,
  2556. Dealer: goods.Dealer,
  2557. Creator: creator,
  2558. UpdateCreator: 0,
  2559. Status: 1,
  2560. Ctime: time.Now().Unix(),
  2561. Mtime: 0,
  2562. Price: warehouse.PackingPrice,
  2563. WarehousingDetailId: 0,
  2564. WarehouseOutDetailId: warehouseOutInfo.ID,
  2565. CancelOutDetailId: 0,
  2566. ProductDate: goods.ProductDate,
  2567. ExpireDate: goods.ExpiryDate,
  2568. }
  2569. //创建出库明细
  2570. CreateStockFlowOne(stockFlow)
  2571. // 出库完成后,要将该批次库存清零
  2572. warehouse.StockCount = 0
  2573. warehouse.Mtime = time.Now().Unix()
  2574. errThree := UpDateWarehouseInfoByStock(&warehouse)
  2575. if errThree != nil {
  2576. return errThree
  2577. }
  2578. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2579. goods.Count = deliver_number - stock_number
  2580. ConsumablesDeliveryNight(orgID, record_time, goods, warehouseOut, count, creator, warehouse_out_id, cancel_out_id)
  2581. }
  2582. return nil
  2583. }
  2584. func FindFirstWarehousingInfoByStockNight(good_id int64, good_type_id int64, warehouse_out_id int64) (info models.WarehousingInfo, err error) {
  2585. 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
  2586. return info, err
  2587. }
  2588. // 药品出库 递归方式
  2589. func AutoDrugDeliverInfoNight(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  2590. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  2591. var deliver_number int64 = 0
  2592. var stock_number int64 = 0
  2593. if advice.CountUnit == drup.MaxUnit {
  2594. deliver_number = prescribingNumber * drup.MinNumber
  2595. } else {
  2596. deliver_number = prescribingNumber
  2597. }
  2598. // 根据先进先出原则,查询最先入库的批次,进行出库
  2599. // 如果没有对应的库存,则报错
  2600. //开启事物
  2601. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  2602. if err != nil {
  2603. return err
  2604. }
  2605. // 将该批次的剩余库存数量转换为拆零数量
  2606. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  2607. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  2608. if stock_number >= deliver_number {
  2609. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2610. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2611. WarehouseOutId: warehouseout.ID,
  2612. Status: 1,
  2613. Ctime: time.Now().Unix(),
  2614. Remark: advice.Remark,
  2615. OrgId: orgID,
  2616. Type: 1,
  2617. Manufacturer: advice.Manufacturer,
  2618. Dealer: warehouse.Dealer,
  2619. IsSys: 0,
  2620. SysRecordTime: advice.Ctime,
  2621. DrugId: advice.DrugId,
  2622. ExpiryDate: advice.ExpiryDate,
  2623. ProductDate: advice.ProductDate,
  2624. Number: advice.Number,
  2625. BatchNumber: warehouse.BatchNumber,
  2626. Count: deliver_number,
  2627. RetailPrice: advice.RetailPrice,
  2628. Price: advice.Price,
  2629. WarehouseInfoId: warehouse.ID,
  2630. CountUnit: drup.MinUnit,
  2631. AdviceId: advice.ID,
  2632. }
  2633. warehouseOutInfo.Count = prescribingNumber
  2634. warehouseOutInfo.CountUnit = advice.CountUnit
  2635. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2636. if errOne != nil {
  2637. return errOne
  2638. }
  2639. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  2640. drugflow := models.DrugFlow{
  2641. WarehouseOutId: warehouseout.ID,
  2642. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2643. DrugId: advice.DrugId,
  2644. Number: warehouse.Number,
  2645. ProductDate: advice.ProductDate,
  2646. ExpireDate: advice.ExpiryDate,
  2647. Count: deliver_number,
  2648. Price: advice.Price,
  2649. Status: 1,
  2650. Ctime: time.Now().Unix(),
  2651. UserOrgId: advice.OrgId,
  2652. Manufacturer: advice.Manufacturer,
  2653. Dealer: advice.Dealer,
  2654. BatchNumber: warehouse.BatchNumber,
  2655. MaxUnit: drup.MinUnit,
  2656. ConsumableType: 2,
  2657. IsEdit: 1,
  2658. Creator: 0,
  2659. IsSys: 0,
  2660. WarehouseOutDetailId: drugWareInfo.ID,
  2661. AdviceId: advice.ID,
  2662. }
  2663. CreateDrugFlowOne(drugflow)
  2664. // 出库完成后,要减去对应批次的库存数量
  2665. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  2666. var maxNumber int64 = 0
  2667. var minNumber int64 = 0
  2668. if advice.CountUnit == drup.MinUnit {
  2669. maxNumber = prescribingNumber / drup.MinNumber
  2670. minNumber = prescribingNumber % drup.MinNumber
  2671. } else {
  2672. maxNumber = prescribingNumber
  2673. }
  2674. if warehouse.StockMaxNumber < maxNumber {
  2675. return errors.New("库存数量不足")
  2676. }
  2677. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  2678. warehouse.Mtime = time.Now().Unix()
  2679. if warehouse.StockMinNumber < minNumber {
  2680. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  2681. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  2682. } else {
  2683. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  2684. }
  2685. if warehouse.StockMaxNumber < 0 {
  2686. return errors.New("库存数量不足")
  2687. }
  2688. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2689. if errThree != nil {
  2690. return errThree
  2691. }
  2692. return nil
  2693. } else {
  2694. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  2695. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  2696. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2697. WarehouseOutId: warehouseout.ID,
  2698. Status: 1,
  2699. Ctime: time.Now().Unix(),
  2700. Remark: advice.Remark,
  2701. OrgId: orgID,
  2702. Type: 1,
  2703. Manufacturer: advice.Manufacturer,
  2704. Dealer: warehouse.Dealer,
  2705. IsSys: 0,
  2706. SysRecordTime: advice.Ctime,
  2707. DrugId: advice.DrugId,
  2708. ExpiryDate: warehouse.ExpiryDate,
  2709. ProductDate: warehouse.ProductDate,
  2710. Number: warehouse.Number,
  2711. BatchNumber: warehouse.BatchNumber,
  2712. Count: stock_number,
  2713. RetailPrice: advice.RetailPrice,
  2714. Price: advice.Price,
  2715. WarehouseInfoId: warehouse.ID,
  2716. CountUnit: drup.MinUnit,
  2717. AdviceId: advice.ID,
  2718. }
  2719. warehouseOutInfo.Count = stock_number
  2720. //warehouseOutInfo.CountUnit = advice.CountUnit
  2721. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  2722. if errOne != nil {
  2723. return errOne
  2724. }
  2725. drugWareInfo, _ := GetLastWarehouseOutInfoById(advice.DrugId)
  2726. drugflow := models.DrugFlow{
  2727. WarehouseOutId: warehouseout.ID,
  2728. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  2729. DrugId: advice.DrugId,
  2730. Number: warehouse.Number,
  2731. ProductDate: advice.ProductDate,
  2732. ExpireDate: advice.ExpiryDate,
  2733. Count: stock_number,
  2734. Price: advice.Price,
  2735. Status: 1,
  2736. Ctime: time.Now().Unix(),
  2737. UserOrgId: advice.OrgId,
  2738. Manufacturer: advice.Manufacturer,
  2739. Dealer: advice.Dealer,
  2740. BatchNumber: warehouse.BatchNumber,
  2741. MaxUnit: drup.MinUnit,
  2742. ConsumableType: 2,
  2743. IsEdit: 1,
  2744. Creator: 0,
  2745. IsSys: 0,
  2746. WarehouseOutDetailId: drugWareInfo.ID,
  2747. AdviceId: advice.ID,
  2748. }
  2749. CreateDrugFlowOne(drugflow)
  2750. // 出库完成后,要将该批次库存清零
  2751. warehouse.StockMaxNumber = 0
  2752. warehouse.StockMinNumber = 0
  2753. warehouse.Mtime = time.Now().Unix()
  2754. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  2755. if errThree != nil {
  2756. return errThree
  2757. }
  2758. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  2759. prescribingNumber_two_temp := deliver_number - stock_number
  2760. fmt.Println("剩余库存323323223232323232323323223", prescribingNumber_two_temp)
  2761. advice.CountUnit = drup.MinUnit
  2762. AutoDrugDeliverInfoNight(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  2763. }
  2764. return
  2765. }