warhouse_service.go 80KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192
  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. // creater := adminUserInfo.AdminUser.Id
  39. warehouseOut := models.DrugWarehouseOut{
  40. WarehouseOutOrderNumber: warehousing_out_order,
  41. OperationTime: time.Now().Unix(),
  42. OrgId: orgID,
  43. Creater: creater,
  44. Ctime: time.Now().Unix(),
  45. Status: 1,
  46. WarehouseOutTime: record_time,
  47. Dealer: 0,
  48. Manufacturer: 0,
  49. Type: 1,
  50. IsSys: 1,
  51. }
  52. err := AddSigleDrugWarehouseOut(&warehouseOut)
  53. if err != nil {
  54. utils.TraceLog("创建出库单失败 err = %v", err)
  55. return err
  56. } else {
  57. out = warehouseOut
  58. }
  59. }
  60. // 出库流程
  61. // 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  62. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  63. if drup.ID > 0 {
  64. prescribingNumber := advice.PrescribingNumber
  65. DrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  66. } else {
  67. return errors.New("药品信息不存在")
  68. }
  69. }
  70. return
  71. }
  72. // 药品出库 递归方式
  73. func DrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DoctorAdvice) (err error) {
  74. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  75. var deliver_number int64 = 0
  76. var stock_number int64 = 0
  77. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  78. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  79. fmt.Println("单位1", advice.PrescribingNumber)
  80. fmt.Println("单位2", drup.MaxUnit)
  81. var drug_price float64
  82. if advice.PrescribingNumberUnit == drup.MaxUnit {
  83. deliver_number = count * drup.MinNumber
  84. } else {
  85. deliver_number = count
  86. }
  87. if advice.PrescribingNumberUnit == drup.MaxUnit {
  88. drug_price = drup.RetailPrice
  89. }
  90. if advice.PrescribingNumberUnit == drup.MinUnit {
  91. drug_price = drup.MinPrice
  92. }
  93. if advice.PrescribingNumberUnit != drup.MaxUnit || advice.PrescribingNumberUnit != drup.MinUnit {
  94. drug_price = drup.RetailPrice
  95. }
  96. fmt.Println("hhhh233232322333232323332323323232323232323223", drug_price)
  97. // 根据先进先出原则,查询最先入库的批次,进行出库
  98. // 如果没有对应的库存,则报错
  99. //开启事物
  100. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  101. if err != nil {
  102. return err
  103. }
  104. // 将该批次的剩余库存数量转换为拆零数量
  105. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  106. fmt.Println("stock_number999999999999", stock_number)
  107. fmt.Println("deliver_number88888888888", deliver_number)
  108. //查找药品信息
  109. //baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  110. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  111. if stock_number >= deliver_number {
  112. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  113. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  114. WarehouseOutId: warehouseout.ID,
  115. Status: 1,
  116. Ctime: time.Now().Unix(),
  117. Remark: warehouse.Remark,
  118. OrgId: orgID,
  119. Type: 1,
  120. Manufacturer: warehouse.Manufacturer,
  121. Dealer: warehouse.Dealer,
  122. IsSys: 1,
  123. SysRecordTime: advice.RecordDate,
  124. DrugId: advice.DrugId,
  125. Number: warehouse.Number,
  126. BatchNumber: warehouse.BatchNumber,
  127. Price: drug_price,
  128. CountUnit: advice.PrescribingNumberUnit,
  129. RetailPrice: drug_price,
  130. ProductDate: warehouse.ProductDate,
  131. ExpiryDate: warehouse.ExpiryDate,
  132. PatientId: advice.PatientId,
  133. Count: count,
  134. WarehouseInfoId: warehouse.ID,
  135. }
  136. fmt.Println("单据号2232322323232323232323232323232323", warehouseout.WarehouseOutOrderNumber)
  137. drugflow := models.DrugFlow{
  138. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  139. WarehouseOutId: warehouseout.ID,
  140. DrugId: advice.DrugId,
  141. Number: warehouse.Number,
  142. ProductDate: warehouse.ProductDate,
  143. ExpireDate: warehouse.ExpiryDate,
  144. Count: count,
  145. Price: drug_price,
  146. Status: 1,
  147. Ctime: time.Now().Unix(),
  148. UserOrgId: orgID,
  149. Manufacturer: warehouse.Manufacturer,
  150. Dealer: warehouse.Dealer,
  151. BatchNumber: warehouse.BatchNumber,
  152. MaxUnit: advice.PrescribingNumberUnit,
  153. ConsumableType: 3,
  154. IsEdit: 1,
  155. Creator: advice.ExecutionStaff,
  156. IsSys: 1,
  157. PatientId: advice.PatientId,
  158. }
  159. CreateDrugFlowOne(drugflow)
  160. //查询是否存在数据
  161. _, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  162. if errcodes == gorm.ErrRecordNotFound {
  163. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  164. if errOne != nil {
  165. return errOne
  166. }
  167. } else if errcodes == nil {
  168. UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  169. }
  170. details := &models.DrugAutomaticReduceDetail{
  171. WarehouseOutId: warehouseout.ID,
  172. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  173. PatientId: advice.PatientId,
  174. Ctime: time.Now().Unix(),
  175. Mtime: time.Now().Unix(),
  176. Status: 1,
  177. RecordTime: advice.RecordDate,
  178. OrgId: orgID,
  179. DrugId: advice.DrugId,
  180. Count: count,
  181. CountUnit: advice.PrescribingNumberUnit,
  182. }
  183. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  184. if errTwo != nil {
  185. return errTwo
  186. }
  187. // 出库完成后,要减去对应批次的库存数量
  188. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  189. var maxNumber int64 = 0
  190. var minNumber int64 = 0
  191. fmt.Println("单位1111111111", advice.PrescribingNumberUnit)
  192. fmt.Println("单位222222222222222", drup.MaxUnit)
  193. if advice.PrescribingNumberUnit == drup.MaxUnit {
  194. maxNumber = count / drup.MinNumber
  195. minNumber = count % drup.MinNumber
  196. } else {
  197. minNumber = count
  198. }
  199. fmt.Println("maxNumber0000000000000", maxNumber)
  200. fmt.Println("minNumber999999999999999", minNumber)
  201. if warehouse.StockMaxNumber < maxNumber {
  202. return errors.New("库存数量不足")
  203. }
  204. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  205. warehouse.Mtime = time.Now().Unix()
  206. if warehouse.StockMinNumber < minNumber {
  207. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  208. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  209. } else {
  210. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  211. }
  212. if warehouse.StockMaxNumber < 0 {
  213. return errors.New("库存数量不足")
  214. }
  215. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  216. if errThree != nil {
  217. return errThree
  218. }
  219. return nil
  220. } else {
  221. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  222. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  223. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  224. WarehouseOutId: warehouseout.ID,
  225. Status: 1,
  226. Ctime: time.Now().Unix(),
  227. Remark: warehouse.Remark,
  228. OrgId: orgID,
  229. Type: 1,
  230. Manufacturer: warehouse.Manufacturer,
  231. Dealer: warehouse.Dealer,
  232. IsSys: 1,
  233. SysRecordTime: advice.RecordDate,
  234. DrugId: advice.DrugId,
  235. Number: warehouse.Number,
  236. BatchNumber: warehouse.BatchNumber,
  237. Price: drug_price,
  238. CountUnit: advice.PrescribingNumberUnit,
  239. ProductDate: warehouse.ProductDate,
  240. ExpiryDate: warehouse.ExpiryDate,
  241. PatientId: advice.PatientId,
  242. Count: count,
  243. WarehouseInfoId: warehouse.ID,
  244. }
  245. //查询是否存在数据
  246. _, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  247. if errcodes == gorm.ErrRecordNotFound {
  248. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  249. if errOne != nil {
  250. return errOne
  251. }
  252. } else if errcodes == nil {
  253. UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  254. }
  255. details := &models.DrugAutomaticReduceDetail{
  256. WarehouseOutId: warehouseout.ID,
  257. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  258. PatientId: advice.PatientId,
  259. Ctime: time.Now().Unix(),
  260. Mtime: time.Now().Unix(),
  261. Status: 1,
  262. RecordTime: advice.RecordDate,
  263. OrgId: orgID,
  264. DrugId: advice.DrugId,
  265. Count: stock_number,
  266. CountUnit: advice.PrescribingNumberUnit,
  267. }
  268. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  269. if errTwo != nil {
  270. return errTwo
  271. }
  272. // 出库完成后,要将该批次库存清零
  273. warehouse.StockMaxNumber = 0
  274. warehouse.StockMinNumber = 0
  275. warehouse.Mtime = time.Now().Unix()
  276. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  277. if errThree != nil {
  278. return errThree
  279. }
  280. drugflow := models.DrugFlow{
  281. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  282. WarehouseOutId: warehouseout.ID,
  283. DrugId: advice.DrugId,
  284. Number: warehouse.Number,
  285. ProductDate: warehouse.ProductDate,
  286. ExpireDate: warehouse.ExpiryDate,
  287. Count: stock_number,
  288. Price: drug_price,
  289. Status: 1,
  290. Ctime: time.Now().Unix(),
  291. UserOrgId: orgID,
  292. Manufacturer: warehouse.Manufacturer,
  293. Dealer: warehouse.Dealer,
  294. BatchNumber: warehouse.BatchNumber,
  295. MaxUnit: advice.PrescribingNumberUnit,
  296. ConsumableType: 3,
  297. IsEdit: 1,
  298. Creator: advice.ExecutionStaff,
  299. IsSys: 1,
  300. PatientId: advice.PatientId,
  301. }
  302. CreateDrugFlowOne(drugflow)
  303. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  304. prescribingNumber_two_temp := deliver_number - stock_number
  305. overPlusNumber := float64(prescribingNumber_two_temp)
  306. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  307. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  308. DrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  309. }
  310. return
  311. }
  312. // 药品出库
  313. func HisDrugsDelivery(orgID int64, creater int64, advice *models.HisDoctorAdviceInfo) (err error) {
  314. // 1.判断药品是否来自专用字典的药品库
  315. // 2.判断当天当前机构有没有创建出库单,没有则创建
  316. // 3.创建出库流程
  317. // 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
  318. isHasWay := false
  319. record_time := int64(0)
  320. isHasWay = true
  321. record_time = advice.RecordDate
  322. if isHasWay {
  323. //判断当天当前机构有没有创建出库单,没有则创建
  324. out, err := FindDrugStockOutByIsSys(orgID, 1, record_time)
  325. if err == gorm.ErrRecordNotFound {
  326. timeStr := time.Now().Format("2006-01-02")
  327. timeArr := strings.Split(timeStr, "-")
  328. total, _ := FindAllDrugWarehouseOut(orgID)
  329. total = total + 1
  330. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  331. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  332. number = number + total
  333. warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
  334. // creater := adminUserInfo.AdminUser.Id
  335. warehouseOut := models.DrugWarehouseOut{
  336. WarehouseOutOrderNumber: warehousing_out_order,
  337. OperationTime: time.Now().Unix(),
  338. OrgId: orgID,
  339. Creater: creater,
  340. Ctime: time.Now().Unix(),
  341. Status: 1,
  342. WarehouseOutTime: record_time,
  343. Dealer: 0,
  344. Manufacturer: 0,
  345. Type: 1,
  346. IsSys: 1,
  347. }
  348. err := AddSigleDrugWarehouseOut(&warehouseOut)
  349. if err != nil {
  350. utils.TraceLog("创建出库单失败 err = %v", err)
  351. return err
  352. } else {
  353. out = warehouseOut
  354. }
  355. }
  356. // 出库流程
  357. // 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
  358. drup, _ := FindBaseDrugLibRecord(orgID, advice.DrugId)
  359. if drup.ID > 0 {
  360. prescribingNumber := advice.PrescribingNumber
  361. HisDrugDeliverInfo(orgID, prescribingNumber, &out, &drup, advice)
  362. } else {
  363. return errors.New("药品信息不存在")
  364. }
  365. }
  366. return
  367. }
  368. // 药品出库 递归方式
  369. func HisDrugDeliverInfo(orgID int64, prescribingNumber float64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.HisDoctorAdviceInfo) (err error) {
  370. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  371. var deliver_number int64 = 0
  372. var stock_number int64 = 0
  373. prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
  374. count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
  375. if advice.PrescribingNumberUnit == drup.MaxUnit {
  376. deliver_number = count * drup.MinNumber
  377. } else {
  378. deliver_number = count
  379. }
  380. var min_price float64
  381. if advice.PrescribingNumberUnit == drup.MaxUnit {
  382. min_price = drup.RetailPrice
  383. }
  384. if advice.PrescribingNumberUnit == drup.MinUnit {
  385. min_price = drup.MinPrice
  386. }
  387. if advice.PrescribingNumberUnit != drup.MaxUnit && advice.PrescribingNumberUnit != drup.MinUnit {
  388. min_price = drup.RetailPrice
  389. }
  390. // 根据先进先出原则,查询最先入库的批次,进行出库
  391. // 如果没有对应的库存,则报错
  392. //开启事物
  393. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  394. //查找药品信息
  395. baseInfo, _ := FindBaseDrugLibRecord(advice.UserOrgId, advice.DrugId)
  396. if err != nil {
  397. return err
  398. }
  399. // 将该批次的剩余库存数量转换为拆零数量
  400. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  401. fmt.Println("拆零数量2222222222222222222", stock_number)
  402. fmt.Println("出库数量55555555555555555555", deliver_number)
  403. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  404. if stock_number >= deliver_number {
  405. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  406. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  407. WarehouseOutId: warehouseout.ID,
  408. Status: 1,
  409. Ctime: time.Now().Unix(),
  410. Remark: warehouse.Remark,
  411. OrgId: orgID,
  412. Type: 1,
  413. Manufacturer: warehouse.Manufacturer,
  414. Dealer: warehouse.Dealer,
  415. IsSys: 1,
  416. SysRecordTime: advice.RecordDate,
  417. DrugId: advice.DrugId,
  418. Number: warehouse.Number,
  419. BatchNumber: warehouse.BatchNumber,
  420. Price: min_price,
  421. CountUnit: baseInfo.MaxUnit,
  422. RetailPrice: min_price,
  423. ProductDate: warehouse.ProductDate,
  424. ExpiryDate: warehouse.ExpiryDate,
  425. PatientId: advice.PatientId,
  426. WarehouseInfoId: warehouse.ID,
  427. }
  428. warehouseOutInfo.Count = count
  429. warehouseOutInfo.CountUnit = advice.PrescribingNumberUnit
  430. drugflow := models.DrugFlow{
  431. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  432. WarehouseOutId: warehouseout.ID,
  433. DrugId: advice.DrugId,
  434. Number: warehouse.Number,
  435. ProductDate: warehouse.ProductDate,
  436. ExpireDate: warehouse.ExpiryDate,
  437. Count: count,
  438. Price: min_price,
  439. Status: 1,
  440. Ctime: time.Now().Unix(),
  441. UserOrgId: orgID,
  442. Manufacturer: warehouse.Manufacturer,
  443. Dealer: warehouse.Dealer,
  444. BatchNumber: warehouse.BatchNumber,
  445. MaxUnit: advice.PrescribingNumberUnit,
  446. ConsumableType: 3,
  447. IsEdit: 1,
  448. Creator: advice.ExecutionStaff,
  449. IsSys: 1,
  450. PatientId: advice.PatientId,
  451. }
  452. CreateDrugFlowOne(drugflow)
  453. //查询是否存在数据
  454. _, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  455. if errcodes == gorm.ErrRecordNotFound {
  456. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  457. if errOne != nil {
  458. return errOne
  459. }
  460. } else if errcodes == nil {
  461. UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  462. }
  463. details := &models.DrugAutomaticReduceDetail{
  464. WarehouseOutId: warehouseout.ID,
  465. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  466. PatientId: advice.PatientId,
  467. Ctime: time.Now().Unix(),
  468. Mtime: time.Now().Unix(),
  469. Status: 1,
  470. RecordTime: advice.RecordDate,
  471. OrgId: orgID,
  472. DrugId: advice.DrugId,
  473. Count: count,
  474. CountUnit: advice.PrescribingNumberUnit,
  475. }
  476. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  477. if errTwo != nil {
  478. return errTwo
  479. }
  480. // 出库完成后,要减去对应批次的库存数量
  481. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  482. var maxNumber int64 = 0
  483. var minNumber int64 = 0
  484. if advice.PrescribingNumberUnit == drup.MinUnit {
  485. maxNumber = count / drup.MinNumber
  486. minNumber = count % drup.MinNumber
  487. } else {
  488. maxNumber = count
  489. }
  490. if warehouse.StockMaxNumber < maxNumber {
  491. return errors.New("库存数量不足")
  492. }
  493. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  494. warehouse.Mtime = time.Now().Unix()
  495. if warehouse.StockMinNumber < minNumber {
  496. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  497. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  498. } else {
  499. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  500. }
  501. if warehouse.StockMaxNumber < 0 {
  502. return errors.New("库存数量不足")
  503. }
  504. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  505. if errThree != nil {
  506. return errThree
  507. }
  508. return nil
  509. } else {
  510. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  511. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  512. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  513. WarehouseOutId: warehouseout.ID,
  514. Status: 1,
  515. Ctime: time.Now().Unix(),
  516. Remark: warehouse.Remark,
  517. OrgId: orgID,
  518. Type: 1,
  519. Manufacturer: warehouse.Manufacturer,
  520. Dealer: warehouse.Dealer,
  521. IsSys: 1,
  522. SysRecordTime: advice.RecordDate,
  523. DrugId: advice.DrugId,
  524. Number: warehouse.Number,
  525. BatchNumber: warehouse.BatchNumber,
  526. Price: min_price,
  527. RetailPrice: min_price,
  528. ProductDate: warehouse.ProductDate,
  529. ExpiryDate: warehouse.ExpiryDate,
  530. PatientId: advice.PatientId,
  531. WarehouseInfoId: warehouse.ID,
  532. }
  533. warehouseOutInfo.Count = count
  534. warehouseOutInfo.CountUnit = advice.PrescribingNumberUnit
  535. drugflow := models.DrugFlow{
  536. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  537. WarehouseOutId: warehouseout.ID,
  538. DrugId: advice.DrugId,
  539. Number: warehouse.Number,
  540. ProductDate: warehouse.ProductDate,
  541. ExpireDate: warehouse.ExpiryDate,
  542. Count: stock_number,
  543. Price: min_price,
  544. Status: 1,
  545. Ctime: time.Now().Unix(),
  546. UserOrgId: orgID,
  547. Manufacturer: warehouse.Manufacturer,
  548. Dealer: warehouse.Dealer,
  549. BatchNumber: warehouse.BatchNumber,
  550. MaxUnit: advice.PrescribingNumberUnit,
  551. ConsumableType: 3,
  552. IsEdit: 1,
  553. Creator: advice.ExecutionStaff,
  554. IsSys: 1,
  555. PatientId: advice.PatientId,
  556. }
  557. CreateDrugFlowOne(drugflow)
  558. //查询是否存在数据
  559. _, errcodes := GetDrugWarehouseOutInfoIsExit(advice.DrugId, advice.PatientId, advice.RecordDate)
  560. if errcodes == gorm.ErrRecordNotFound {
  561. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  562. if errOne != nil {
  563. return errOne
  564. }
  565. } else if errcodes == nil {
  566. UpdatedDrugWarehouseOutInfo(warehouseOutInfo, advice.DrugId, advice.PatientId, advice.RecordDate, advice.UserOrgId)
  567. }
  568. details := &models.DrugAutomaticReduceDetail{
  569. WarehouseOutId: warehouseout.ID,
  570. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  571. PatientId: advice.PatientId,
  572. Ctime: time.Now().Unix(),
  573. Mtime: time.Now().Unix(),
  574. Status: 1,
  575. RecordTime: advice.RecordDate,
  576. OrgId: orgID,
  577. DrugId: advice.DrugId,
  578. Count: count,
  579. CountUnit: advice.PrescribingNumberUnit,
  580. }
  581. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  582. if errTwo != nil {
  583. return errTwo
  584. }
  585. // 出库完成后,要将该批次库存清零
  586. warehouse.StockMaxNumber = 0
  587. warehouse.StockMinNumber = 0
  588. warehouse.Mtime = time.Now().Unix()
  589. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  590. if errThree != nil {
  591. return errThree
  592. }
  593. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  594. prescribingNumber_two_temp := deliver_number - stock_number
  595. overPlusNumber := float64(prescribingNumber_two_temp)
  596. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  597. advice.PrescribingNumberUnit = advice.PrescribingNumberUnit
  598. HisDrugDeliverInfo(orgID, overPlusNumber, warehouseout, drup, advice)
  599. }
  600. return
  601. }
  602. // 药品出库 递归方式
  603. func AutoDrugDeliverInfo(orgID int64, prescribingNumber int64, warehouseout *models.DrugWarehouseOut, drup *models.BaseDrugLib, advice *models.DrugWarehouseOutInfo) (err error) {
  604. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  605. var deliver_number int64 = 0
  606. var stock_number int64 = 0
  607. fmt.Println("单位1", advice.CountUnit)
  608. fmt.Println("单位2", drup.MaxUnit)
  609. if advice.CountUnit == drup.MaxUnit {
  610. deliver_number = prescribingNumber * drup.MinNumber
  611. } else {
  612. deliver_number = prescribingNumber
  613. }
  614. // 根据先进先出原则,查询最先入库的批次,进行出库
  615. // 如果没有对应的库存,则报错
  616. //开启事物
  617. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  618. if err != nil {
  619. return err
  620. }
  621. // 将该批次的剩余库存数量转换为拆零数量
  622. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  623. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  624. if stock_number >= deliver_number {
  625. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  626. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  627. WarehouseOutId: warehouseout.ID,
  628. Status: 1,
  629. Ctime: time.Now().Unix(),
  630. Remark: advice.Remark,
  631. OrgId: orgID,
  632. Type: 1,
  633. Manufacturer: advice.Manufacturer,
  634. Dealer: advice.Dealer,
  635. IsSys: 0,
  636. SysRecordTime: advice.Ctime,
  637. DrugId: advice.DrugId,
  638. ExpiryDate: advice.ExpiryDate,
  639. ProductDate: advice.ProductDate,
  640. Number: advice.Number,
  641. BatchNumber: advice.BatchNumber,
  642. Count: advice.Count,
  643. RetailPrice: advice.RetailPrice,
  644. Price: advice.Price,
  645. WarehouseInfoId: advice.WarehouseInfoId,
  646. }
  647. warehouseOutInfo.Count = prescribingNumber
  648. warehouseOutInfo.CountUnit = advice.CountUnit
  649. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  650. if errOne != nil {
  651. return errOne
  652. }
  653. // 出库完成后,要减去对应批次的库存数量
  654. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  655. var maxNumber int64 = 0
  656. var minNumber int64 = 0
  657. if advice.CountUnit == drup.MinUnit {
  658. maxNumber = prescribingNumber / drup.MinNumber
  659. minNumber = prescribingNumber % drup.MinNumber
  660. } else {
  661. maxNumber = prescribingNumber
  662. }
  663. if warehouse.StockMaxNumber < maxNumber {
  664. return errors.New("库存数量不足")
  665. }
  666. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  667. warehouse.Mtime = time.Now().Unix()
  668. if warehouse.StockMinNumber < minNumber {
  669. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  670. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  671. } else {
  672. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  673. }
  674. if warehouse.StockMaxNumber < 0 {
  675. return errors.New("库存数量不足")
  676. }
  677. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  678. if errThree != nil {
  679. return errThree
  680. }
  681. return nil
  682. } else {
  683. // 当该批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  684. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  685. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  686. WarehouseOutId: warehouseout.ID,
  687. Status: 1,
  688. Ctime: time.Now().Unix(),
  689. Remark: advice.Remark,
  690. OrgId: orgID,
  691. Type: 1,
  692. Manufacturer: advice.Manufacturer,
  693. Dealer: advice.Dealer,
  694. IsSys: 0,
  695. SysRecordTime: advice.Ctime,
  696. DrugId: advice.DrugId,
  697. ExpiryDate: advice.ExpiryDate,
  698. ProductDate: advice.ProductDate,
  699. Number: advice.Number,
  700. BatchNumber: advice.BatchNumber,
  701. Count: advice.Count,
  702. RetailPrice: advice.RetailPrice,
  703. Price: advice.Price,
  704. }
  705. warehouseOutInfo.Count = prescribingNumber
  706. warehouseOutInfo.CountUnit = advice.CountUnit
  707. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  708. if errOne != nil {
  709. return errOne
  710. }
  711. // 出库完成后,要将该批次库存清零
  712. warehouse.StockMaxNumber = 0
  713. warehouse.StockMinNumber = 0
  714. warehouse.Mtime = time.Now().Unix()
  715. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  716. if errThree != nil {
  717. return errThree
  718. }
  719. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  720. prescribingNumber_two_temp := deliver_number - stock_number
  721. advice.CountUnit = drup.MinUnit
  722. AutoDrugDeliverInfo(orgID, prescribingNumber_two_temp, warehouseout, drup, advice)
  723. }
  724. return
  725. }
  726. // 耗材出库
  727. func ConsumablesDeliveryTotal(orgID int64, patient_id int64, record_time int64, goods []*models.DialysisBeforePrepareGoods, goodOne []*models.NewDialysisBeforePrepareGoods, creator int64) (err error) {
  728. //查询该患者当天已经出库的耗材信息
  729. goods_yc, _ := FindConsumablesByDateTwo(orgID, patient_id, record_time)
  730. // 和新请求的出库数据进行对比,分出那些是继续出库的,那些是需要删除出库的
  731. for i := len(goods_yc) - 1; i >= 0; i-- {
  732. goods_yc_temp := goods_yc[i]
  733. for j := len(goods) - 1; j >= 0; j-- {
  734. goods_temp := goods[j]
  735. // 已经出库和新请求出库都存在该耗材,则判断出库数量,分成是继续出库,还是删除出库
  736. if goods_yc_temp.GoodTypeId == goods_temp.GoodTypeId && goods_yc_temp.GoodId == goods_temp.GoodId {
  737. // 已经出库和新请求出库的出库数量一致,则清除两个结构体里的数据(既不出库,也不删除出库)
  738. if goods_yc_temp.Count == goods_temp.Count {
  739. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  740. goods = append(goods[:j], goods[j+1:]...)
  741. break
  742. }
  743. // 如果已经出库的数量 大于 新请求出库的数量,则代表需要删除出库
  744. if goods_yc_temp.Count > goods_temp.Count {
  745. temp_count := goods_yc_temp.Count - goods_temp.Count
  746. goods_yc[i].Count = temp_count
  747. goods = append(goods[:j], goods[j+1:]...)
  748. break
  749. }
  750. // 如果已经出库的数量 小于 新请求出库的梳理,则代表需要增加出库
  751. if goods_yc_temp.Count < goods_temp.Count {
  752. temp_count := goods_temp.Count - goods_yc_temp.Count
  753. //fmt.Println("988888888888888", temp_count)
  754. goods[j].Count = temp_count
  755. goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  756. //fmt.Println("888888888", goods_yc)
  757. break
  758. }
  759. }
  760. }
  761. }
  762. // goods_yc 这个数据就是需要已经出库了,但是现在需要删除出库的耗材数据
  763. // goods 这个数据就是需要出库的耗材的数据(新增的数据)
  764. fmt.Println("goods222222222222", goods)
  765. fmt.Println("goodsy999999999999", goods_yc)
  766. if len(goods) > 0 {
  767. out, err := FindStockOutByIsSys(orgID, 1, record_time)
  768. if err == gorm.ErrRecordNotFound {
  769. //没有记录,则创建出库单
  770. timeStr := time.Now().Format("2006-01-02")
  771. timeArr := strings.Split(timeStr, "-")
  772. total, _ := FindAllWarehouseOut(orgID)
  773. total = total + 1
  774. warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
  775. number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
  776. number = number + total
  777. warehousing_out_order = "CKD" + strconv.FormatInt(number, 10)
  778. warehouseOut := models.WarehouseOut{
  779. WarehouseOutOrderNumber: warehousing_out_order,
  780. OperationTime: time.Now().Unix(),
  781. OrgId: orgID,
  782. Creater: creator,
  783. Ctime: time.Now().Unix(),
  784. Status: 1,
  785. WarehouseOutTime: record_time,
  786. Dealer: 0,
  787. Manufacturer: 0,
  788. Type: 1,
  789. IsSys: 1,
  790. }
  791. err := AddSigleWarehouseOut(&warehouseOut)
  792. if err != nil {
  793. utils.TraceLog("创建出库单失败 err = %v", err)
  794. return err
  795. } else {
  796. out = warehouseOut
  797. }
  798. }
  799. for _, item := range goods {
  800. var newCount int64 = 0
  801. for _, it := range goodOne {
  802. if item.GoodTypeId == it.GoodTypeId && item.GoodId == it.GoodId {
  803. newCount = it.Count
  804. }
  805. }
  806. prepare := models.DialysisBeforePrepare{
  807. GoodTypeId: item.GoodTypeId,
  808. GoodId: item.GoodId,
  809. Count: item.Count,
  810. }
  811. ConsumablesDelivery(orgID, patient_id, record_time, &prepare, &out, newCount)
  812. }
  813. }
  814. if len(goods_yc) > 0 {
  815. for _, good_yc := range goods_yc {
  816. out, _ := FindStockOutByIsSys(orgID, 1, record_time)
  817. ConsumablesDeliveryDelete(orgID, patient_id, record_time, good_yc, &out)
  818. }
  819. }
  820. return nil
  821. }
  822. //耗材出库
  823. func ConsumablesDelivery(orgID int64, patient_id int64, record_time int64, goods *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut, count int64) (err error) {
  824. fmt.Println("count23232323232323232323232323", count)
  825. fmt.Println("hhhh2h3h3h2h23h32hh23h32h23", goods.Count)
  826. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  827. var deliver_number int64 = 0
  828. var stock_number int64 = 0
  829. var maxNumber int64 = 0
  830. deliver_number = goods.Count
  831. // 根据先进先出原则,查询最先入库的批次,进行出库
  832. // 如果没有对应的库存,则报错
  833. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId)
  834. if err != nil {
  835. return errors.New("库存数量不足")
  836. }
  837. // 将该批次的剩余库存数量转换为拆零数量
  838. stock_number = warehouse.StockCount
  839. //获取耗材信息
  840. info, _ := GetGoodInformationByGoodId(goods.GoodId)
  841. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  842. if stock_number >= deliver_number {
  843. warehouseOutInfo := &models.WarehouseOutInfo{
  844. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  845. WarehouseOutId: warehouseOut.ID,
  846. WarehouseInfotId: warehouse.ID,
  847. Status: 1,
  848. Ctime: time.Now().Unix(),
  849. Remark: warehouse.Remark,
  850. OrgId: orgID,
  851. Type: 1,
  852. Manufacturer: warehouse.Manufacturer,
  853. Dealer: warehouse.Dealer,
  854. IsSys: 1,
  855. SysRecordTime: record_time,
  856. GoodTypeId: goods.GoodTypeId,
  857. GoodId: goods.GoodId,
  858. PatientId: patient_id,
  859. Number: warehouse.Number,
  860. LicenseNumber: warehouse.LicenseNumber,
  861. Price: info.PackingPrice,
  862. ExpiryDate: warehouse.ExpiryDate,
  863. ProductDate: warehouse.ProductDate,
  864. }
  865. warehouseOutInfo.Count = count
  866. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, patient_id, record_time)
  867. if errcodes == gorm.ErrRecordNotFound {
  868. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  869. if errOne != nil {
  870. return errOne
  871. }
  872. } else if errcodes == nil {
  873. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, patient_id, record_time)
  874. }
  875. details := models.BloodAutomaticReduceDetail{
  876. WarehouseOutId: warehouseOutInfo.ID,
  877. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  878. PatientId: patient_id,
  879. Ctime: time.Now().Unix(),
  880. Mtime: time.Now().Unix(),
  881. Status: 1,
  882. RecordTime: record_time,
  883. OrgId: orgID,
  884. GoodId: goods.GoodId,
  885. GoodTypeId: goods.GoodTypeId,
  886. Count: count,
  887. }
  888. //查询当天耗材是否已经存在数据
  889. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  890. if errcode == gorm.ErrRecordNotFound {
  891. errTwo := CreateAutoReduceRecord(&details)
  892. if errTwo != nil {
  893. return errTwo
  894. }
  895. //插入库存流水表
  896. flow := models.VmStockFlow{
  897. WarehouseOutId: warehouseOut.ID,
  898. WarehousingId: warehouse.ID,
  899. GoodId: goods.GoodId,
  900. Number: warehouse.Number,
  901. ProductDate: warehouse.ProductDate,
  902. ExpireDate: warehouse.ExpiryDate,
  903. Count: deliver_number,
  904. Price: info.PackingPrice,
  905. Status: 1,
  906. Ctime: time.Now().Unix(),
  907. UserOrgId: orgID,
  908. Manufacturer: info.Manufacturer,
  909. Dealer: info.Dealer,
  910. LicenseNumber: warehouse.LicenseNumber,
  911. IsEdit: 2,
  912. Creator: warehouseOut.Creater,
  913. SystemTime: record_time,
  914. ConsumableType: 3,
  915. WarehouseOutDetailId: warehouseOutInfo.ID,
  916. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  917. IsSys: 1,
  918. PatientId: patient_id,
  919. }
  920. //查询流水是否存在
  921. exsit, errflow := GetStockFlowIsExsit(warehouseOut.ID, patient_id, record_time, goods.GoodId)
  922. fmt.Println("什么数据233232323", errflow)
  923. if errflow == gorm.ErrRecordNotFound {
  924. errThre := CreateStockFlowOne(flow)
  925. if errThre != nil {
  926. return errThre
  927. }
  928. } else if errflow == nil {
  929. flow := models.VmStockFlow{
  930. ID: exsit.ID,
  931. WarehouseOutId: warehouseOut.ID,
  932. WarehousingId: warehouse.ID,
  933. GoodId: goods.GoodId,
  934. Number: warehouse.Number,
  935. ProductDate: warehouse.ProductDate,
  936. ExpireDate: warehouse.ExpiryDate,
  937. Count: exsit.Count + goods.Count,
  938. Price: info.PackingPrice,
  939. Status: 1,
  940. Ctime: time.Now().Unix(),
  941. UserOrgId: orgID,
  942. Manufacturer: info.Manufacturer,
  943. Dealer: info.Dealer,
  944. LicenseNumber: warehouse.LicenseNumber,
  945. IsEdit: 2,
  946. Creator: warehouseOut.Creater,
  947. SystemTime: record_time,
  948. ConsumableType: 3,
  949. WarehouseOutDetailId: warehouseOutInfo.ID,
  950. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  951. IsSys: 1,
  952. PatientId: patient_id,
  953. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  954. }
  955. errFour := UpdatedStockFlow(flow)
  956. if errFour != nil {
  957. return errFour
  958. }
  959. }
  960. } else if errcode == nil {
  961. flow := models.VmStockFlow{
  962. WarehouseOutId: warehouseOut.ID,
  963. WarehousingId: warehouse.ID,
  964. GoodId: goods.GoodId,
  965. Number: warehouse.Number,
  966. ProductDate: warehouse.ProductDate,
  967. ExpireDate: warehouse.ExpiryDate,
  968. Count: deliver_number,
  969. Price: info.PackingPrice,
  970. Status: 1,
  971. Ctime: time.Now().Unix(),
  972. UserOrgId: orgID,
  973. Manufacturer: info.Manufacturer,
  974. Dealer: info.Dealer,
  975. LicenseNumber: warehouse.LicenseNumber,
  976. IsEdit: 2,
  977. Creator: warehouseOut.Creater,
  978. SystemTime: record_time,
  979. ConsumableType: 3,
  980. WarehouseOutDetailId: warehouseOutInfo.ID,
  981. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  982. IsSys: 1,
  983. PatientId: patient_id,
  984. }
  985. //查询流水是否存在
  986. exsit, errflow := GetStockFlowIsExsit(warehouseOut.ID, patient_id, record_time, goods.GoodId)
  987. if errflow == gorm.ErrRecordNotFound {
  988. CreateStockFlowOne(flow)
  989. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  990. CreateAutoReduceRecord(&details)
  991. } else if errflow == nil {
  992. flow := models.VmStockFlow{
  993. ID: exsit.ID,
  994. WarehouseOutId: warehouseOut.ID,
  995. WarehousingId: warehouse.ID,
  996. GoodId: goods.GoodId,
  997. Number: warehouse.Number,
  998. ProductDate: warehouse.ProductDate,
  999. ExpireDate: warehouse.ExpiryDate,
  1000. Count: exsit.Count + goods.Count,
  1001. Price: info.PackingPrice,
  1002. Status: 1,
  1003. Ctime: time.Now().Unix(),
  1004. UserOrgId: orgID,
  1005. Manufacturer: info.Manufacturer,
  1006. Dealer: info.Dealer,
  1007. LicenseNumber: warehouse.LicenseNumber,
  1008. IsEdit: 2,
  1009. Creator: warehouseOut.Creater,
  1010. SystemTime: record_time,
  1011. ConsumableType: 3,
  1012. WarehouseOutDetailId: warehouseOutInfo.ID,
  1013. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1014. IsSys: 1,
  1015. PatientId: patient_id,
  1016. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1017. }
  1018. UpdatedStockFlow(flow)
  1019. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, goods.GoodId, goods.GoodTypeId)
  1020. CreateAutoReduceRecord(&details)
  1021. }
  1022. }
  1023. maxNumber = goods.Count
  1024. if warehouse.StockCount < maxNumber {
  1025. return errors.New("库存数量不足")
  1026. }
  1027. warehouse.StockCount = warehouse.StockCount - maxNumber
  1028. warehouse.Mtime = time.Now().Unix()
  1029. if warehouse.StockCount < 0 {
  1030. return errors.New("库存数量不足")
  1031. }
  1032. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1033. if errThree != nil {
  1034. return errThree
  1035. }
  1036. return nil
  1037. } else {
  1038. fmt.Println("不进来22323232323232323232233223323223322323")
  1039. // 当刚批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1040. warehouseOutInfo := &models.WarehouseOutInfo{
  1041. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1042. WarehouseOutId: warehouseOut.ID,
  1043. WarehouseInfotId: warehouse.ID,
  1044. Status: 1,
  1045. Ctime: time.Now().Unix(),
  1046. Remark: warehouse.Remark,
  1047. OrgId: orgID,
  1048. Type: 1,
  1049. Manufacturer: warehouse.Manufacturer,
  1050. Dealer: warehouse.Dealer,
  1051. IsSys: 1,
  1052. SysRecordTime: record_time,
  1053. GoodTypeId: goods.GoodTypeId,
  1054. GoodId: goods.GoodId,
  1055. PatientId: patient_id,
  1056. Number: warehouse.Number,
  1057. LicenseNumber: warehouse.LicenseNumber,
  1058. Price: info.PackingPrice,
  1059. ExpiryDate: warehouse.ExpiryDate,
  1060. ProductDate: warehouse.ProductDate,
  1061. }
  1062. warehouseOutInfo.Count = stock_number
  1063. _, errcodes := GetWarehouseOutInfoIsExistOne(goods.GoodId, goods.PatientId, record_time)
  1064. fmt.Println("hhhhh2h323233223232323", errcodes)
  1065. if errcodes == gorm.ErrRecordNotFound {
  1066. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1067. if errOne != nil {
  1068. return errOne
  1069. }
  1070. //插入库存流水表
  1071. flow := models.VmStockFlow{
  1072. WarehouseOutId: warehouseOut.ID,
  1073. WarehousingId: warehouse.ID,
  1074. GoodId: goods.GoodId,
  1075. Number: warehouse.Number,
  1076. ProductDate: warehouse.ProductDate,
  1077. ExpireDate: warehouse.ExpiryDate,
  1078. Count: stock_number,
  1079. Price: info.PackingPrice,
  1080. Status: 1,
  1081. Ctime: time.Now().Unix(),
  1082. UserOrgId: orgID,
  1083. Manufacturer: info.Manufacturer,
  1084. Dealer: info.Dealer,
  1085. LicenseNumber: warehouse.LicenseNumber,
  1086. IsEdit: 2,
  1087. Creator: warehouseOut.Creater,
  1088. SystemTime: record_time,
  1089. ConsumableType: 3,
  1090. WarehouseOutDetailId: warehouseOutInfo.ID,
  1091. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1092. IsSys: 1,
  1093. PatientId: patient_id,
  1094. }
  1095. //查询流水是否存在
  1096. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1097. if errflows == gorm.ErrRecordNotFound {
  1098. CreateStockFlowOne(flow)
  1099. } else if errflows == nil {
  1100. flow := models.VmStockFlow{
  1101. ID: exsit.ID,
  1102. WarehouseOutId: warehouseOut.ID,
  1103. WarehousingId: warehouse.ID,
  1104. GoodId: goods.GoodId,
  1105. Number: warehouse.Number,
  1106. ProductDate: warehouse.ProductDate,
  1107. ExpireDate: warehouse.ExpiryDate,
  1108. Count: exsit.Count + goods.Count,
  1109. Price: info.PackingPrice,
  1110. Status: 1,
  1111. Ctime: time.Now().Unix(),
  1112. UserOrgId: orgID,
  1113. Manufacturer: info.Manufacturer,
  1114. Dealer: info.Dealer,
  1115. LicenseNumber: warehouse.LicenseNumber,
  1116. IsEdit: 2,
  1117. Creator: warehouseOut.Creater,
  1118. SystemTime: record_time,
  1119. ConsumableType: 3,
  1120. WarehouseOutDetailId: warehouseOutInfo.ID,
  1121. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1122. IsSys: 1,
  1123. PatientId: patient_id,
  1124. ReturnCount: exsit.Count + (exsit.Count + deliver_number),
  1125. }
  1126. UpdatedStockFlow(flow)
  1127. }
  1128. } else if errcodes == nil {
  1129. fmt.Println("尽力3323232322323232323232323232323")
  1130. goods.Count = deliver_number - stock_number
  1131. //更新数量为 该批次剩余数量 + 还有未出的数量
  1132. warehouseOutInfo.Count = stock_number
  1133. UpdatedWarehouseOutInfo(warehouseOutInfo, goods.GoodId, goods.PatientId, record_time)
  1134. //插入库存流水表
  1135. flow := models.VmStockFlow{
  1136. WarehouseOutId: warehouseOut.ID,
  1137. WarehousingId: warehouse.ID,
  1138. GoodId: goods.GoodId,
  1139. Number: warehouse.Number,
  1140. ProductDate: warehouse.ProductDate,
  1141. ExpireDate: warehouse.ExpiryDate,
  1142. Count: stock_number,
  1143. Price: info.PackingPrice,
  1144. Status: 1,
  1145. Ctime: time.Now().Unix(),
  1146. UserOrgId: orgID,
  1147. Manufacturer: info.Manufacturer,
  1148. Dealer: info.Dealer,
  1149. LicenseNumber: warehouse.LicenseNumber,
  1150. IsEdit: 2,
  1151. Creator: warehouseOut.Creater,
  1152. SystemTime: record_time,
  1153. ConsumableType: 3,
  1154. WarehouseOutDetailId: warehouseOutInfo.ID,
  1155. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1156. IsSys: 1,
  1157. PatientId: patient_id,
  1158. }
  1159. //查询流水是否存在
  1160. exsit, errflows := GetStockFlowIsExsit(warehouse.ID, patient_id, record_time, goods.GoodId)
  1161. if errflows == gorm.ErrRecordNotFound {
  1162. CreateStockFlowOne(flow)
  1163. } else if errflows == nil {
  1164. fmt.Println("尽力3323232322323232323232323232323", exsit.Count+goods.Count)
  1165. flow := models.VmStockFlow{
  1166. ID: exsit.ID,
  1167. WarehouseOutId: warehouseOut.ID,
  1168. WarehousingId: warehouse.ID,
  1169. GoodId: goods.GoodId,
  1170. Number: warehouse.Number,
  1171. ProductDate: warehouse.ProductDate,
  1172. ExpireDate: warehouse.ExpiryDate,
  1173. Count: exsit.Count + goods.Count,
  1174. Price: info.PackingPrice,
  1175. Status: 1,
  1176. Ctime: time.Now().Unix(),
  1177. UserOrgId: orgID,
  1178. Manufacturer: info.Manufacturer,
  1179. Dealer: info.Dealer,
  1180. LicenseNumber: warehouse.LicenseNumber,
  1181. IsEdit: 2,
  1182. Creator: warehouseOut.Creater,
  1183. SystemTime: record_time,
  1184. ConsumableType: 3,
  1185. WarehouseOutDetailId: warehouseOutInfo.ID,
  1186. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1187. IsSys: 1,
  1188. PatientId: patient_id,
  1189. }
  1190. UpdatedStockFlow(flow)
  1191. }
  1192. }
  1193. // 出库完成后,要将该批次库存清零
  1194. warehouse.StockCount = 0
  1195. warehouse.Mtime = time.Now().Unix()
  1196. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1197. if errThree != nil {
  1198. return errThree
  1199. }
  1200. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1201. goods.Count = deliver_number - stock_number
  1202. ConsumablesDelivery(orgID, patient_id, record_time, goods, warehouseOut, count)
  1203. }
  1204. return nil
  1205. }
  1206. //耗材出库删除
  1207. func ConsumablesDeliveryDelete(orgID int64, patient_id int64, record_time int64, good_yc *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut) (err error) {
  1208. // 先根据相关信息查询当天该耗材的出库信息
  1209. warehouseOutInfos, err := FindStockOutInfoByStock(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time, patient_id)
  1210. if err != nil {
  1211. return err
  1212. }
  1213. var delete_count int64 = 0
  1214. for _, ware := range warehouseOutInfos {
  1215. // 判断当前出库的数据和删除出库数量
  1216. if good_yc.Count <= ware.Count {
  1217. delete_count = good_yc.Count
  1218. } else {
  1219. delete_count = ware.Count
  1220. }
  1221. // 在出库记录表里记录退库详情
  1222. warehouseOutInfo := &models.WarehouseOutInfo{
  1223. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1224. WarehouseOutId: warehouseOut.ID,
  1225. //WarehouseInfoId: warehouse.ID,
  1226. Status: 1,
  1227. Ctime: time.Now().Unix(),
  1228. Remark: "",
  1229. OrgId: orgID,
  1230. Type: 1,
  1231. Manufacturer: 0,
  1232. Dealer: 0,
  1233. IsSys: 2,
  1234. SysRecordTime: record_time,
  1235. GoodTypeId: good_yc.GoodTypeId,
  1236. GoodId: good_yc.GoodId,
  1237. PatientId: patient_id,
  1238. }
  1239. warehouseOutInfo.Count = ware.Count - delete_count
  1240. stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1241. warehouseOutInfo.Price = stockInInfo.Price
  1242. errOne := UpdateAutoMaticReduceDetail(good_yc.GoodId, good_yc.GoodTypeId, record_time, patient_id, orgID, warehouseOutInfo)
  1243. if errOne != nil {
  1244. return errOne
  1245. } else {
  1246. details := &models.AutomaticReduceDetail{
  1247. WarehouseOutId: warehouseOutInfo.ID,
  1248. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1249. PatientId: patient_id,
  1250. Ctime: time.Now().Unix(),
  1251. Mtime: time.Now().Unix(),
  1252. Status: 1,
  1253. RecordTime: record_time,
  1254. OrgId: orgID,
  1255. GoodId: good_yc.GoodId,
  1256. GoodTypeId: good_yc.GoodTypeId,
  1257. Count: warehouseOutInfo.Count,
  1258. Type: 2,
  1259. }
  1260. //查询是否当天已经存在数据
  1261. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1262. if errcode == gorm.ErrRecordNotFound {
  1263. errTwo := AddSigleAutoReduceRecordInfo(details)
  1264. if errTwo != nil {
  1265. return errTwo
  1266. }
  1267. } else if errcode == nil {
  1268. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1269. AddSigleAutoReduceRecordInfo(details)
  1270. }
  1271. }
  1272. // 删除出库完成后,要增加对应批次的库存数量
  1273. errThree := UpDateWarehouseInfoByStockDelete(ware.WarehouseInfotId, delete_count)
  1274. if errThree != nil {
  1275. return errThree
  1276. }
  1277. // 增加了对应的库存后,看看还有多少需要退库的
  1278. good_yc.Count = good_yc.Count - delete_count
  1279. if good_yc.Count == 0 {
  1280. return nil
  1281. }
  1282. }
  1283. if good_yc.Count == 0 {
  1284. return nil
  1285. } else {
  1286. return errors.New("退库和出库数据不匹配")
  1287. }
  1288. }
  1289. func GetAutoReduceRecordInfoByPatientId(orgid int64, patient_id int64, recordTime int64) (autoReduce []*models.AutomaticReduceDetail, err error) {
  1290. err = XTReadDB().Model(&autoReduce).Where("org_id = ? and patient_id = ? and record_time = ? and status = 1", orgid, patient_id, recordTime).Find(&autoReduce).Error
  1291. return autoReduce, err
  1292. }
  1293. func DeleteDialysisBefor(orgid int64, patient_id int64, record_date int64, goodid int64, goodtypeid int64) error {
  1294. prepare := models.DialysisBeforePrepare{}
  1295. 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
  1296. return err
  1297. }
  1298. func DeleteDialysisBeforThree(orgid int64, patient_id int64, record_date int64) error {
  1299. prepare := models.DialysisBeforePrepare{}
  1300. 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
  1301. return err
  1302. }
  1303. //耗材出库
  1304. func ConsumablesDeliveryOne(orgID int64, record_time int64, goods *models.WarehouseOutInfo, warehouseOut *models.WarehouseOut, count int64, creator int64) (err error) {
  1305. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  1306. var deliver_number int64 = 0
  1307. var stock_number int64 = 0
  1308. var maxNumber int64 = 0
  1309. deliver_number = goods.Count
  1310. fmt.Println("添加数量", deliver_number)
  1311. // 根据先进先出原则,查询最先入库的批次,进行出库
  1312. // 如果没有对应的库存,则报错
  1313. warehouse, err := FindFirstWarehousingInfoByStock(goods.GoodId, goods.GoodTypeId)
  1314. fmt.Println("err222222222222222222222", warehouse.StockCount)
  1315. if err != nil {
  1316. return err
  1317. }
  1318. // 将该批次的剩余库存数量转换为拆零数量
  1319. stock_number = warehouse.StockCount
  1320. fmt.Println("3434343434343434", stock_number)
  1321. fmt.Println("8888888888888888888", deliver_number)
  1322. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1323. if stock_number >= deliver_number {
  1324. fmt.Println("g2332232332323232232323322332", goods.Price)
  1325. warehouseOutInfo := &models.WarehouseOutInfo{
  1326. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1327. WarehouseOutId: warehouseOut.ID,
  1328. WarehouseInfotId: warehouse.ID,
  1329. Status: 1,
  1330. Ctime: time.Now().Unix(),
  1331. Remark: goods.Remark,
  1332. OrgId: orgID,
  1333. Type: 1,
  1334. Manufacturer: goods.Manufacturer,
  1335. Dealer: goods.Dealer,
  1336. IsSys: 0,
  1337. SysRecordTime: record_time,
  1338. GoodTypeId: goods.GoodTypeId,
  1339. GoodId: goods.GoodId,
  1340. ExpiryDate: goods.ExpiryDate,
  1341. ProductDate: goods.ProductDate,
  1342. Number: goods.Number,
  1343. Price: goods.Price,
  1344. LicenseNumber: goods.LicenseNumber,
  1345. }
  1346. warehouseOutInfo.Count = goods.Count
  1347. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1348. if errOne != nil {
  1349. return errOne
  1350. }
  1351. stockFlow := models.VmStockFlow{
  1352. WarehousingId: warehouse.ID,
  1353. GoodId: goods.GoodId,
  1354. Number: goods.Number,
  1355. LicenseNumber: goods.LicenseNumber,
  1356. Count: goods.Count,
  1357. UserOrgId: goods.OrgId,
  1358. PatientId: goods.PatientId,
  1359. SystemTime: record_time,
  1360. ConsumableType: 2,
  1361. IsSys: goods.IsSys,
  1362. WarehousingOrder: "",
  1363. WarehouseOutId: warehouseOut.ID,
  1364. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1365. IsEdit: 1,
  1366. CancelStockId: 0,
  1367. CancelOrderNumber: "",
  1368. Manufacturer: goods.Manufacturer,
  1369. Dealer: goods.Dealer,
  1370. Creator: creator,
  1371. UpdateCreator: 0,
  1372. Status: 1,
  1373. Ctime: time.Now().Unix(),
  1374. Mtime: 0,
  1375. Price: goods.Price,
  1376. WarehousingDetailId: 0,
  1377. WarehouseOutDetailId: warehouseOutInfo.ID,
  1378. CancelOutDetailId: 0,
  1379. ProductDate: goods.ProductDate,
  1380. ExpireDate: goods.ExpiryDate,
  1381. }
  1382. //创建出库明细
  1383. CreateStockFlowOne(stockFlow)
  1384. maxNumber = goods.Count
  1385. if warehouse.StockCount < maxNumber {
  1386. return errors.New("库存数量不足")
  1387. }
  1388. warehouse.StockCount = warehouse.StockCount - maxNumber
  1389. warehouse.Mtime = time.Now().Unix()
  1390. if warehouse.StockCount < 0 {
  1391. return errors.New("库存数量不足")
  1392. }
  1393. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1394. if errThree != nil {
  1395. return errThree
  1396. }
  1397. } else {
  1398. // 当改批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1399. warehouseOutInfo := &models.WarehouseOutInfo{
  1400. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1401. WarehouseOutId: warehouseOut.ID,
  1402. WarehouseInfotId: warehouse.ID,
  1403. Status: 1,
  1404. Ctime: time.Now().Unix(),
  1405. Remark: goods.Remark,
  1406. OrgId: orgID,
  1407. Type: 1,
  1408. Manufacturer: goods.Manufacturer,
  1409. Dealer: goods.Dealer,
  1410. IsSys: 0,
  1411. SysRecordTime: record_time,
  1412. GoodTypeId: goods.GoodTypeId,
  1413. GoodId: goods.GoodId,
  1414. ExpiryDate: goods.ExpiryDate,
  1415. ProductDate: goods.ProductDate,
  1416. Number: goods.Number,
  1417. Price: goods.Price,
  1418. LicenseNumber: goods.LicenseNumber,
  1419. }
  1420. warehouseOutInfo.Count = stock_number
  1421. info, errcodes := GetStockInRecoredByGoodIdOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId)
  1422. if errcodes == gorm.ErrRecordNotFound {
  1423. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1424. if errOne != nil {
  1425. return errOne
  1426. }
  1427. } else {
  1428. warehouseOutInfo.Count = info.Count + stock_number
  1429. UpdateAutoMaticReduceDetailOne(goods.GoodId, goods.GoodTypeId, goods.SysRecordTime, goods.OrgId, warehouseOutInfo)
  1430. }
  1431. stockFlow := models.VmStockFlow{
  1432. WarehousingId: warehouse.ID,
  1433. GoodId: goods.GoodId,
  1434. Number: goods.Number,
  1435. LicenseNumber: goods.LicenseNumber,
  1436. Count: goods.Count,
  1437. UserOrgId: goods.OrgId,
  1438. PatientId: 0,
  1439. SystemTime: record_time,
  1440. ConsumableType: 2,
  1441. IsSys: 0,
  1442. WarehousingOrder: "",
  1443. WarehouseOutId: warehouseOut.ID,
  1444. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1445. IsEdit: 1,
  1446. CancelStockId: 0,
  1447. CancelOrderNumber: "",
  1448. Manufacturer: goods.Manufacturer,
  1449. Dealer: goods.Dealer,
  1450. Creator: creator,
  1451. UpdateCreator: 0,
  1452. Status: 1,
  1453. Ctime: time.Now().Unix(),
  1454. Mtime: 0,
  1455. Price: goods.Price,
  1456. WarehousingDetailId: 0,
  1457. WarehouseOutDetailId: warehouseOutInfo.ID,
  1458. CancelOutDetailId: 0,
  1459. ProductDate: goods.ProductDate,
  1460. ExpireDate: goods.ExpiryDate,
  1461. }
  1462. //创建出库明细
  1463. CreateStockFlowOne(stockFlow)
  1464. // 出库完成后,要将该批次库存清零
  1465. warehouse.StockCount = 0
  1466. warehouse.Mtime = time.Now().Unix()
  1467. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1468. if errThree != nil {
  1469. return errThree
  1470. }
  1471. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1472. goods.Count = deliver_number - stock_number
  1473. fmt.Println("goods3333333333333333333333", goods.Count)
  1474. ConsumablesDeliveryOne(orgID, record_time, goods, warehouseOut, count, creator)
  1475. }
  1476. return nil
  1477. }
  1478. //耗材出库删除
  1479. func ConsumablesDeliveryDeleteOne(orgID int64, record_time int64, good_yc *models.DialysisBeforePrepare, warehouseOut *models.WarehouseOut) (err error) {
  1480. // 先根据相关信息查询当天该耗材的出库信息
  1481. warehouseOutInfos, err := FindStockOutInfoByStockOne(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time)
  1482. if err != nil {
  1483. return err
  1484. }
  1485. var delete_count int64 = 0
  1486. for _, ware := range warehouseOutInfos {
  1487. // 判断当前出库的数据和删除出库数量
  1488. if good_yc.Count <= ware.Count {
  1489. delete_count = good_yc.Count
  1490. } else {
  1491. delete_count = ware.Count
  1492. }
  1493. // 在出库记录表里记录退库详情
  1494. warehouseOutInfo := &models.WarehouseOutInfo{
  1495. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1496. WarehouseOutId: warehouseOut.ID,
  1497. //WarehouseInfoId: warehouse.ID,
  1498. Status: 1,
  1499. Ctime: time.Now().Unix(),
  1500. Remark: "",
  1501. OrgId: orgID,
  1502. Type: 1,
  1503. Manufacturer: 0,
  1504. Dealer: 0,
  1505. IsSys: 0,
  1506. SysRecordTime: record_time,
  1507. GoodTypeId: good_yc.GoodTypeId,
  1508. GoodId: good_yc.GoodId,
  1509. }
  1510. warehouseOutInfo.Count = delete_count
  1511. stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1512. warehouseOutInfo.Price = stockInInfo.Price
  1513. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1514. if errOne != nil {
  1515. return errOne
  1516. }
  1517. // 删除出库完成后,要增加对应批次的库存数量
  1518. errThree := UpDateWarehouseInfoByStockDelete(ware.WarehouseInfotId, delete_count)
  1519. if errThree != nil {
  1520. return errThree
  1521. }
  1522. // 增加了对应的库存后,看看还有多少需要退库的
  1523. good_yc.Count = good_yc.Count - delete_count
  1524. if good_yc.Count == 0 {
  1525. return nil
  1526. }
  1527. }
  1528. if good_yc.Count == 0 {
  1529. return nil
  1530. } else {
  1531. return errors.New("退库和出库数据不匹配")
  1532. }
  1533. }
  1534. //退库逻辑
  1535. func ConsumablesDeliveryTwo(orgID int64, goods *models.WarehouseOutInfo, count int64) (err error) {
  1536. // 判断处方里药品单位是拆零单位还是包装单位, 如果是包装单位,则根据规格,将包装数量转为拆零数量
  1537. var deliver_number int64 = 0
  1538. var stock_number int64 = 0
  1539. var maxNumber int64 = 0
  1540. deliver_number = goods.Count
  1541. fmt.Println("添加数量", deliver_number)
  1542. // 根据先进先出原则,查询最先入库的批次,进行出库
  1543. // 查询除自己以为的库存
  1544. warehouse, err := FindFirstWarehousingInfoByGoodId(goods.GoodId, goods.ID)
  1545. if err != nil {
  1546. return err
  1547. }
  1548. // 将该批次的剩余库存数量转换为拆零数量
  1549. stock_number = warehouse.StockCount
  1550. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  1551. if stock_number >= deliver_number {
  1552. warehouseOutInfo := &models.WarehouseOutInfo{
  1553. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  1554. WarehouseOutId: goods.ID,
  1555. WarehouseInfotId: warehouse.ID,
  1556. Status: 1,
  1557. Ctime: time.Now().Unix(),
  1558. Remark: goods.Remark,
  1559. OrgId: orgID,
  1560. Type: 1,
  1561. Manufacturer: goods.Manufacturer,
  1562. Dealer: goods.Dealer,
  1563. IsSys: 0,
  1564. GoodTypeId: goods.GoodTypeId,
  1565. GoodId: goods.GoodId,
  1566. ExpiryDate: goods.ExpiryDate,
  1567. ProductDate: goods.ProductDate,
  1568. Number: goods.Number,
  1569. Price: goods.Price,
  1570. LicenseNumber: goods.LicenseNumber,
  1571. ConsumableType: 2,
  1572. }
  1573. warehouseOutInfo.Count = goods.Count
  1574. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1575. if errOne != nil {
  1576. return errOne
  1577. }
  1578. maxNumber = goods.Count
  1579. if warehouse.StockCount < maxNumber {
  1580. return errors.New("库存数量不足")
  1581. }
  1582. warehouse.StockCount = warehouse.StockCount - maxNumber
  1583. warehouse.Mtime = time.Now().Unix()
  1584. if warehouse.StockCount < 0 {
  1585. return errors.New("库存数量不足")
  1586. }
  1587. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1588. if errThree != nil {
  1589. return errThree
  1590. }
  1591. } else {
  1592. // 当改批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  1593. warehouseOutInfo := &models.WarehouseOutInfo{
  1594. WarehouseOutOrderNumber: goods.WarehouseOutOrderNumber,
  1595. WarehouseOutId: goods.ID,
  1596. WarehouseInfotId: warehouse.ID,
  1597. Status: 1,
  1598. Ctime: time.Now().Unix(),
  1599. Remark: goods.Remark,
  1600. OrgId: orgID,
  1601. Type: 1,
  1602. Manufacturer: goods.Manufacturer,
  1603. Dealer: goods.Dealer,
  1604. IsSys: 0,
  1605. GoodTypeId: goods.GoodTypeId,
  1606. GoodId: goods.GoodId,
  1607. ExpiryDate: goods.ExpiryDate,
  1608. ProductDate: goods.ProductDate,
  1609. Number: goods.Number,
  1610. Price: goods.Price,
  1611. LicenseNumber: goods.LicenseNumber,
  1612. ConsumableType: 2,
  1613. }
  1614. warehouseOutInfo.Count = stock_number
  1615. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1616. if errOne != nil {
  1617. return errOne
  1618. }
  1619. // 出库完成后,要将该批次库存清零
  1620. warehouse.StockCount = 0
  1621. warehouse.Mtime = time.Now().Unix()
  1622. errThree := UpDateWarehouseInfoByStock(&warehouse)
  1623. if errThree != nil {
  1624. return errThree
  1625. }
  1626. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  1627. goods.Count = deliver_number - stock_number
  1628. ConsumablesDeliveryTwo(orgID, goods, count)
  1629. }
  1630. return nil
  1631. }
  1632. func DeleteWarehouseInfo(id int64) error {
  1633. err := XTWriteDB().Model(models.WarehousingInfo{}).Where("id = ? and status = 1", id).Updates(map[string]interface{}{"stock_count": 0}).Error
  1634. return err
  1635. }
  1636. //
  1637. ////当前数据比上一次出库数据少
  1638. //func ConsumablesDeliveryTotalSeven(orgID int64, patient_id int64, record_time int64, goods []*models.DialysisBeforePrepareGoods,creater int64,count int64) (err error) {
  1639. //
  1640. // fmt.Println("w我的中国馆公共区发电房阿道夫安抚安抚安抚安抚安抚安抚阿道夫阿道夫阿凡达阿道夫a",count)
  1641. // //查询该患者当天已经出库的耗材信息
  1642. // goods_yc, _ := FindConsumablesByDateThree(orgID, patient_id, record_time)
  1643. // // 和新请求的出库数据进行对比,分出那些是继续出库的,那些是需要删除出库的
  1644. // for i := len(goods_yc) - 1; i >= 0; i-- {
  1645. // goods_yc_temp := goods_yc[i]
  1646. // for j := len(goods) - 1; j >= 0; j-- {
  1647. // goods_temp := goods[j]
  1648. // // 已经出库和新请求出库都存在该耗材,则判断出库数量,分成是继续出库,还是删除出库
  1649. // if goods_yc_temp.GoodTypeId == goods_temp.GoodTypeId && goods_yc_temp.GoodId == goods_temp.GoodId {
  1650. // // 已经出库和新请求出库的出库数量一致,则清除两个结构体里的数据(既不出库,也不删除出库)
  1651. // if goods_yc_temp.Count == goods_temp.Count {
  1652. // goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  1653. // goods = append(goods[:j], goods[j+1:]...)
  1654. // break
  1655. // }
  1656. // // 如果已经出库的数量 大于 新请求出库的数量,则代表需要删除出库
  1657. // if goods_yc_temp.Count > goods_temp.Count {
  1658. //
  1659. // temp_count := goods_yc_temp.Count - goods_temp.Count
  1660. // goods_yc[i].Count = temp_count
  1661. // goods = append(goods[:j], goods[j+1:]...)
  1662. // break
  1663. // }
  1664. // // 如果已经出库的数量 小于 新请求出库的梳理,则代表需要增加出库
  1665. // if goods_yc_temp.Count < goods_temp.Count {
  1666. // temp_count := goods_temp.Count - goods_yc_temp.Count
  1667. // //fmt.Println("988888888888888", temp_count)
  1668. // goods[j].Count = temp_count
  1669. // goods_yc = append(goods_yc[:i], goods_yc[i+1:]...)
  1670. // //fmt.Println("888888888", goods_yc)
  1671. // break
  1672. // }
  1673. // }
  1674. // }
  1675. // }
  1676. //
  1677. // // goods_yc 这个数据就是需要已经出库了,但是现在需要删除出库的耗材数据
  1678. // // goods 这个数据就是需要出库的耗材的数据(新增的数据)
  1679. // fmt.Println("goodsy999999999999", goods_yc)
  1680. //
  1681. //
  1682. //
  1683. // //退库
  1684. // if len(goods_yc) > 0 {
  1685. // for _, good_yc := range goods_yc {
  1686. // out, _ := FindStockOutByIsSys(orgID, 1, record_time)
  1687. // ConsumablesDeliveryDeleteFour(orgID, record_time, good_yc, &out,patient_id,creater,count)
  1688. // }
  1689. // }
  1690. //
  1691. // return nil
  1692. //}
  1693. ////耗材出库删除
  1694. //func ConsumablesDeliveryDeleteFour(orgID int64, record_time int64, good_yc *models.BloodAutomaticReduceDetail, warehouseOut *models.WarehouseOut,patient_id int64,creater int64,count int64) (err error) {
  1695. //
  1696. // fmt.Println("count2323223884584854854854u5454785487547845785478758487545475475487,count",count)
  1697. // // 先根据相关信息查询当天该耗材的出库信息
  1698. // warehouseOutInfos, err := FindStockOutInfoByStockTwo(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time,good_yc.PatientId)
  1699. // fmt.Println("errr232323232323232323232323232",err)
  1700. // if err != nil {
  1701. // return err
  1702. // }
  1703. //
  1704. // var delete_count int64 = 0
  1705. //
  1706. // delete_count = warehouseOutInfos.Count - count
  1707. //
  1708. // fmt.Println("delete_count2323232",delete_count)
  1709. // // 在出库记录表里记录退库详情
  1710. // warehouseOutInfo := &models.WarehouseOutInfo{
  1711. // WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1712. // WarehouseOutId: warehouseOut.ID,
  1713. // Status: 1,
  1714. // Ctime: time.Now().Unix(),
  1715. // OrgId: orgID,
  1716. // Type: 1,
  1717. // IsSys: 1,
  1718. // SysRecordTime: record_time,
  1719. // GoodTypeId: good_yc.GoodTypeId,
  1720. // GoodId: good_yc.GoodId,
  1721. // PatientId:good_yc.PatientId,
  1722. // ConsumableType:2,
  1723. //
  1724. // }
  1725. // warehouseOutInfo.Count = count
  1726. //
  1727. // stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1728. // warehouseOutInfo.Price = stockInInfo.Price
  1729. // warehouseOutInfo.Dealer = stockInInfo.Dealer
  1730. // warehouseOutInfo.Manufacturer = stockInInfo.Manufacturer
  1731. // warehouseOutInfo.ExpiryDate = stockInInfo.ExpiryDate
  1732. // warehouseOutInfo.ProductDate = stockInInfo.ProductDate
  1733. // warehouseOutInfo.Number = stockInInfo.Number
  1734. // warehouseOutInfo.LicenseNumber = stockInInfo.LicenseNumber
  1735. // warehouseOutInfo.WarehouseInfotId = stockInInfo.ID
  1736. // //查找当天是否存在出库记录
  1737. //
  1738. // _, errcod := GetWarehouseOutInfoIsExistOne(good_yc.GoodId, good_yc.PatientId, record_time)
  1739. // fmt.Println("errcode2323223255556652324242424242424242424242424242242",errcod)
  1740. // if errcod == gorm.ErrRecordNotFound{
  1741. // errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1742. // //插入详情明细表
  1743. // stockFlow := models.VmStockFlow{
  1744. // WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1745. // WarehouseOutId: warehouseOut.ID,
  1746. // GoodId: good_yc.GoodId,
  1747. // Number: stockInInfo.Number,
  1748. // ProductDate: stockInInfo.ProductDate,
  1749. // ExpireDate: stockInInfo.ExpiryDate,
  1750. // Count: count,
  1751. // Price: stockInInfo.Price,
  1752. // Status: 1,
  1753. // Ctime: time.Now().Unix(),
  1754. // UserOrgId: good_yc.OrgId,
  1755. // Manufacturer: stockInInfo.Manufacturer,
  1756. // Dealer: stockInInfo.Dealer,
  1757. // LicenseNumber: stockInInfo.LicenseNumber,
  1758. // IsEdit: 2,
  1759. // Creator: creater,
  1760. // SystemTime: record_time,
  1761. // ConsumableType: 2,
  1762. // WarehousingDetailId:0,
  1763. // IsSys:1,
  1764. // UpdateCreator:creater,
  1765. // }
  1766. // //创建流水表
  1767. // err := CreateStockFlowOne(stockFlow)
  1768. // fmt.Println("h2h3h2323342i24i242i4u2i4242u42424",err)
  1769. // if errOne != nil {
  1770. // return errOne
  1771. // }
  1772. // }else if errcod == nil{
  1773. // UpdatedWarehouseOutInfo(warehouseOutInfo,good_yc.GoodId,good_yc.PatientId,record_time)
  1774. // //插入详情明细表
  1775. // stockFlow := models.VmStockFlow{
  1776. // WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1777. // WarehouseOutId: warehouseOut.ID,
  1778. // GoodId: good_yc.GoodId,
  1779. // Number: stockInInfo.Number,
  1780. // ProductDate: stockInInfo.ProductDate,
  1781. // ExpireDate: stockInInfo.ExpiryDate,
  1782. // Count: count,
  1783. // Price: stockInInfo.Price,
  1784. // Status: 1,
  1785. // Ctime: time.Now().Unix(),
  1786. // UserOrgId: good_yc.OrgId,
  1787. // Manufacturer: stockInInfo.Manufacturer,
  1788. // Dealer: stockInInfo.Dealer,
  1789. // LicenseNumber: stockInInfo.LicenseNumber,
  1790. // IsEdit: 2,
  1791. // Creator: creater,
  1792. // SystemTime: record_time,
  1793. // ConsumableType: 2,
  1794. // WarehousingDetailId:0,
  1795. // IsSys:1,
  1796. // UpdateCreator:creater,
  1797. // }
  1798. // //创建流水表
  1799. // CreateStockFlowOne(stockFlow)
  1800. // }
  1801. //
  1802. //
  1803. //
  1804. // //更改自动出库的表格
  1805. // details := models.BloodAutomaticReduceDetail{
  1806. // WarehouseOutId: warehouseOutInfo.ID,
  1807. // WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1808. // PatientId: patient_id,
  1809. // Ctime: time.Now().Unix(),
  1810. // Mtime: time.Now().Unix(),
  1811. // Status: 1,
  1812. // RecordTime: record_time,
  1813. // OrgId: orgID,
  1814. // GoodId: good_yc.GoodId,
  1815. // GoodTypeId: good_yc.GoodTypeId,
  1816. // Count: count,
  1817. // }
  1818. // //查询当天耗材是否已经存在数据
  1819. // _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1820. //
  1821. // if errcode == gorm.ErrRecordNotFound {
  1822. // errTwo := CreateAutoReduceRecord(&details)
  1823. // if errTwo != nil {
  1824. // return errTwo
  1825. // }
  1826. // } else if errcode == nil {
  1827. // DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1828. // CreateAutoReduceRecord(&details)
  1829. // }
  1830. // // 删除出库完成后,要增加对应批次的库存数量
  1831. // fmt.Println("deletecount2323232323232323232323232323",delete_count)
  1832. // errThree := UpDateWarehouseInfoByStockDelete(warehouseOutInfos.WarehouseInfotId, delete_count)
  1833. //
  1834. // if errThree != nil {
  1835. // return errThree
  1836. // }
  1837. //
  1838. //
  1839. // if good_yc.Count == 0 {
  1840. // return nil
  1841. // } else {
  1842. // return errors.New("退库和出库数据不匹配")
  1843. // }
  1844. //}
  1845. //耗材出库删除
  1846. func ConsumablesDeliveryDeleteFive(orgID int64, record_time int64, good_yc *models.BloodAutomaticReduceDetail, warehouseOut *models.WarehouseOut, patient_id int64, creater int64, count int64) (err error) {
  1847. fmt.Println("count23232323232323232323232323223223", count)
  1848. // 先根据相关信息查询当天该耗材的出库信息
  1849. warehouseOutInfos, err := FindStockOutInfoByStockTwo(orgID, good_yc.GoodTypeId, good_yc.GoodId, record_time, good_yc.PatientId)
  1850. fmt.Println("errr232323232323232323232323232", err)
  1851. if err != nil {
  1852. return err
  1853. }
  1854. var delete_count int64 = 0
  1855. delete_count = count - warehouseOutInfos.Count
  1856. // 判断当前出库的数据和删除出库数量
  1857. // 在出库记录表里记录退库详情
  1858. warehouseOutInfo := &models.WarehouseOutInfo{
  1859. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1860. WarehouseOutId: warehouseOut.ID,
  1861. Status: 1,
  1862. Ctime: time.Now().Unix(),
  1863. OrgId: orgID,
  1864. Type: 1,
  1865. IsSys: 1,
  1866. SysRecordTime: record_time,
  1867. GoodTypeId: good_yc.GoodTypeId,
  1868. GoodId: good_yc.GoodId,
  1869. PatientId: good_yc.PatientId,
  1870. ConsumableType: 2,
  1871. }
  1872. warehouseOutInfo.Count = count
  1873. stockInInfo, _ := FindLastStockInInfoRecord(good_yc.GoodId, orgID)
  1874. warehouseOutInfo.Price = stockInInfo.Price
  1875. warehouseOutInfo.Dealer = stockInInfo.Dealer
  1876. warehouseOutInfo.Manufacturer = stockInInfo.Manufacturer
  1877. warehouseOutInfo.ExpiryDate = stockInInfo.ExpiryDate
  1878. warehouseOutInfo.ProductDate = stockInInfo.ProductDate
  1879. warehouseOutInfo.Number = stockInInfo.Number
  1880. warehouseOutInfo.LicenseNumber = stockInInfo.LicenseNumber
  1881. warehouseOutInfo.WarehouseInfotId = stockInInfo.ID
  1882. //查找当天是否存在出库记录
  1883. _, errcod := GetWarehouseOutInfoIsExistOne(good_yc.GoodId, good_yc.PatientId, record_time)
  1884. fmt.Println("errcode2323223255556652324242424242424242424242424242242", errcod)
  1885. if errcod == gorm.ErrRecordNotFound {
  1886. errOne := AddSigleWarehouseOutInfo(warehouseOutInfo)
  1887. //插入详情明细表
  1888. stockFlow := models.VmStockFlow{
  1889. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1890. WarehouseOutId: warehouseOut.ID,
  1891. GoodId: good_yc.GoodId,
  1892. Number: stockInInfo.Number,
  1893. ProductDate: stockInInfo.ProductDate,
  1894. ExpireDate: stockInInfo.ExpiryDate,
  1895. Count: count,
  1896. Price: stockInInfo.Price,
  1897. Status: 1,
  1898. Ctime: time.Now().Unix(),
  1899. UserOrgId: good_yc.OrgId,
  1900. Manufacturer: stockInInfo.Manufacturer,
  1901. Dealer: stockInInfo.Dealer,
  1902. LicenseNumber: stockInInfo.LicenseNumber,
  1903. IsEdit: 2,
  1904. Creator: creater,
  1905. SystemTime: record_time,
  1906. ConsumableType: 3,
  1907. WarehousingDetailId: 0,
  1908. IsSys: 1,
  1909. UpdateCreator: creater,
  1910. }
  1911. //创建流水表
  1912. err := CreateStockFlowOne(stockFlow)
  1913. fmt.Println("h2h3h2323342i24i242i4u2i4242u42424", err)
  1914. if errOne != nil {
  1915. return errOne
  1916. }
  1917. } else if errcod == nil {
  1918. UpdatedWarehouseOutInfo(warehouseOutInfo, good_yc.GoodId, good_yc.PatientId, record_time)
  1919. //插入详情明细表
  1920. stockFlow := models.VmStockFlow{
  1921. WarehouseOutOrderNumber: warehouseOut.WarehouseOutOrderNumber,
  1922. WarehouseOutId: warehouseOut.ID,
  1923. GoodId: good_yc.GoodId,
  1924. Number: stockInInfo.Number,
  1925. ProductDate: stockInInfo.ProductDate,
  1926. ExpireDate: stockInInfo.ExpiryDate,
  1927. Count: count,
  1928. Price: stockInInfo.Price,
  1929. Status: 1,
  1930. Ctime: time.Now().Unix(),
  1931. UserOrgId: good_yc.OrgId,
  1932. Manufacturer: stockInInfo.Manufacturer,
  1933. Dealer: stockInInfo.Dealer,
  1934. LicenseNumber: stockInInfo.LicenseNumber,
  1935. IsEdit: 2,
  1936. Creator: creater,
  1937. SystemTime: record_time,
  1938. ConsumableType: 3,
  1939. WarehousingDetailId: 0,
  1940. IsSys: 1,
  1941. UpdateCreator: creater,
  1942. }
  1943. //创建流水表
  1944. err := CreateStockFlowOne(stockFlow)
  1945. fmt.Println("h2h3h2323342i24i242i4u2i4242u42424", err)
  1946. }
  1947. //更改自动出库的表格
  1948. details := models.BloodAutomaticReduceDetail{
  1949. WarehouseOutId: warehouseOutInfo.ID,
  1950. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  1951. PatientId: patient_id,
  1952. Ctime: time.Now().Unix(),
  1953. Mtime: time.Now().Unix(),
  1954. Status: 1,
  1955. RecordTime: record_time,
  1956. OrgId: orgID,
  1957. GoodId: good_yc.GoodId,
  1958. GoodTypeId: good_yc.GoodTypeId,
  1959. Count: count,
  1960. }
  1961. //查询当天耗材是否已经存在数据
  1962. _, errcode := GetAutoMaticReduceDetail(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1963. if errcode == gorm.ErrRecordNotFound {
  1964. errTwo := CreateAutoReduceRecord(&details)
  1965. if errTwo != nil {
  1966. return errTwo
  1967. }
  1968. } else if errcode == nil {
  1969. DeleteAutoRedeceDetailTwo(orgID, patient_id, record_time, good_yc.GoodId, good_yc.GoodTypeId)
  1970. CreateAutoReduceRecord(&details)
  1971. }
  1972. // 删除出库完成后,要增加对应批次的库存数量
  1973. errThree := UpDateWarehouseInfoByStockDeleteOne(warehouseOutInfos.WarehouseInfotId, delete_count)
  1974. fmt.Println("sql2323234343434343434343434343434343434343343434")
  1975. if errThree != nil {
  1976. return errThree
  1977. }
  1978. if good_yc.Count == 0 {
  1979. return nil
  1980. } else {
  1981. return errors.New("退库和出库数据不匹配")
  1982. }
  1983. }