warhouse_service.go 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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, 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: 0,
  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. if advice.PrescribingNumberUnit == drup.MaxUnit {
  80. deliver_number = count * drup.MinNumber
  81. } else {
  82. deliver_number = count
  83. }
  84. // 根据先进先出原则,查询最先入库的批次,进行出库
  85. // 如果没有对应的库存,则报错
  86. warehouse, err := FindLastDrugWarehousingInfoByID(advice.DrugId)
  87. fmt.Println("查询222222222222222222222222222222222222222222222222", err)
  88. if err != nil {
  89. return err
  90. }
  91. // 将该批次的剩余库存数量转换为拆零数量
  92. stock_number = warehouse.StockMaxNumber*drup.MinNumber + warehouse.StockMinNumber
  93. // 当库存数量大于或等于出库数量的话,则正常出库该批次
  94. if stock_number >= deliver_number {
  95. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  96. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  97. WarehouseOutId: warehouseout.ID,
  98. Status: 1,
  99. Ctime: time.Now().Unix(),
  100. Remark: "",
  101. OrgId: orgID,
  102. Type: 1,
  103. Manufacturer: 0,
  104. Dealer: 0,
  105. IsSys: 1,
  106. SysRecordTime: advice.RecordDate,
  107. DrugId: advice.DrugId,
  108. }
  109. warehouseOutInfo.Count = deliver_number
  110. warehouseOutInfo.CountUnit = drup.MinUnit
  111. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  112. if errOne != nil {
  113. return errOne
  114. } else {
  115. // prescribingNumber := strconv.FormatFloat(math.Abs(item.PrescribingNumber), 'f', 0, 64)
  116. // count, _ := strconv.ParseInt(prescribingNumber, 10, 64)
  117. details := &models.DrugAutomaticReduceDetail{
  118. WarehouseOutId: warehouseOutInfo.ID,
  119. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  120. PatientId: advice.PatientId,
  121. Ctime: time.Now().Unix(),
  122. Mtime: time.Now().Unix(),
  123. Status: 1,
  124. RecordTime: advice.RecordDate,
  125. OrgId: orgID,
  126. DrugId: advice.DrugId,
  127. Count: deliver_number,
  128. CountUnit: drup.MinUnit,
  129. }
  130. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  131. if errTwo != nil {
  132. return errTwo
  133. }
  134. }
  135. // 出库完成后,要减去对应批次的库存数量
  136. // 判断处方里药品单位是拆零单位还是包装单位, 如果是拆零单位,则根据规格,将拆零数量转为包装数量
  137. var maxNumber int64 = 0
  138. var minNumber int64 = 0
  139. if advice.PrescribingNumberUnit == drup.MinUnit {
  140. maxNumber = count / drup.MinNumber
  141. minNumber = count % drup.MinNumber
  142. } else {
  143. maxNumber = count
  144. }
  145. if warehouse.StockMaxNumber < maxNumber {
  146. return errors.New("库存数量不足")
  147. }
  148. warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
  149. warehouse.Mtime = time.Now().Unix()
  150. if warehouse.StockMinNumber < minNumber {
  151. warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
  152. warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
  153. } else {
  154. warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
  155. }
  156. if warehouse.StockMaxNumber < 0 {
  157. return errors.New("库存数量不足")
  158. }
  159. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  160. if errThree != nil {
  161. return errThree
  162. }
  163. return nil
  164. } else {
  165. // 当改批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
  166. warehouseOutInfo := &models.DrugWarehouseOutInfo{
  167. WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
  168. WarehouseOutId: warehouseout.ID,
  169. Status: 1,
  170. Ctime: time.Now().Unix(),
  171. Remark: "",
  172. OrgId: orgID,
  173. Type: 1,
  174. Manufacturer: 0,
  175. Dealer: 0,
  176. IsSys: 1,
  177. SysRecordTime: advice.RecordDate,
  178. DrugId: advice.DrugId,
  179. }
  180. // prescribingNumber := strconv.FormatFloat(math.Abs(item.PrescribingNumber), 'f', 0, 64)
  181. // count, _ := strconv.ParseInt(prescribingNumber, 10, 64)
  182. warehouseOutInfo.Count = stock_number
  183. warehouseOutInfo.CountUnit = drup.MinUnit
  184. errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
  185. if errOne != nil {
  186. return errOne
  187. } else {
  188. details := &models.DrugAutomaticReduceDetail{
  189. WarehouseOutId: warehouseOutInfo.ID,
  190. WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
  191. PatientId: advice.PatientId,
  192. Ctime: time.Now().Unix(),
  193. Mtime: time.Now().Unix(),
  194. Status: 1,
  195. RecordTime: advice.RecordDate,
  196. OrgId: orgID,
  197. DrugId: advice.DrugId,
  198. Count: stock_number,
  199. CountUnit: drup.MinUnit,
  200. }
  201. errTwo := AddSigleDrugAutoReduceRecordInfo(details)
  202. if errTwo != nil {
  203. return errTwo
  204. }
  205. }
  206. // 出库完成后,要将该批次库存清零
  207. warehouse.StockMaxNumber = 0
  208. warehouse.StockMinNumber = 0
  209. warehouse.Mtime = time.Now().Unix()
  210. errThree := UpDateDrugWarehouseInfoByStock(&warehouse)
  211. if errThree != nil {
  212. return errThree
  213. }
  214. // 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
  215. prescribingNumber_two_temp := deliver_number - stock_number
  216. advice.PrescribingNumber = float64(prescribingNumber_two_temp)
  217. advice.PrescribingNumberUnit = drup.MinUnit
  218. DrugDeliverInfo(orgID, prescribingNumber, warehouseout, drup, advice)
  219. }
  220. return
  221. }