stock.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package services
  2. import (
  3. "Medical_ERP/common/global"
  4. db "Medical_ERP/common/initialize"
  5. model2 "Medical_ERP/common/model"
  6. "Medical_ERP/dto"
  7. "Medical_ERP/models"
  8. "errors"
  9. "github.com/beego/beego/v2/core/logs"
  10. "gorm.io/gorm"
  11. )
  12. type Stock struct {
  13. }
  14. // StockIn 入库
  15. func (e *Stock) StockIn(c *dto.StockInInsertReq) error {
  16. var err error
  17. // 检查药品信息是否已存在
  18. medicineInfo, err := e.GetMedicineInfo(c.ProductID, c.EnterpriseID, c.SpecID, c.ApprovalNumber, c.ExpiryDate)
  19. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  20. logs.Error("db error: %s", err)
  21. return global.CreateFailedErr
  22. }
  23. tx := db.DB.Begin()
  24. // 如果药品信息不存在,则创建新的药品信息
  25. if errors.Is(err, gorm.ErrRecordNotFound) {
  26. medicineInfo = models.MedicineInfo{
  27. ProductID: c.ProductID,
  28. EnterpriseID: c.EnterpriseID,
  29. SpecID: c.SpecID,
  30. UnitID: c.UnitID,
  31. DosageFormID: c.DosageFormID,
  32. ApprovalNumber: c.ApprovalNumber,
  33. QualificationNumber: c.QualificationNumber,
  34. ProductionDate: c.ProductionDate,
  35. ExpiryDate: c.ExpiryDate,
  36. BatchNumber: c.BatchNumber,
  37. }
  38. medicineInfo.SetDeptId(c.DeptId)
  39. medicineInfo.SetCreateBy(c.CreateBy)
  40. err = tx.Create(&medicineInfo).Error
  41. if err != nil {
  42. tx.Rollback()
  43. logs.Error("db error: %s", err)
  44. return global.CreateFailedErr
  45. }
  46. }
  47. // 进行入库操作
  48. stockInRecord := models.StockIn{
  49. MedicineID: medicineInfo.Id,
  50. Quantity: c.Quantity,
  51. UnitPrice: c.UnitPrice,
  52. Operator: c.Operator,
  53. ForwardingUnit: c.ForwardingUnit,
  54. Date: c.Date,
  55. }
  56. err = tx.Create(&stockInRecord).Error
  57. if err != nil {
  58. tx.Rollback()
  59. logs.Error("db error: %s", err)
  60. return global.CreateFailedErr
  61. }
  62. c.Id = stockInRecord.Id
  63. var inventory models.MedicineInventory
  64. err = tx.First(&inventory, "medicine_id = ?", medicineInfo.Id).Error
  65. if err != nil {
  66. tx.Rollback()
  67. logs.Error("db error: %s", err)
  68. return global.CreateFailedErr
  69. }
  70. // 添加库存记录
  71. inventory = models.MedicineInventory{
  72. MedicineID: medicineInfo.Id,
  73. TotalIn: c.Quantity,
  74. StockInID: stockInRecord.Id,
  75. TotalOut: 0,
  76. StockOutID: 0,
  77. Balance: c.Quantity,
  78. ForwardingUnit: c.ForwardingUnit,
  79. }
  80. inventory.Balance += c.Quantity
  81. err = tx.Create(&inventory).Error
  82. if err != nil {
  83. tx.Rollback()
  84. logs.Error("db error: %s", err)
  85. return global.CreateFailedErr
  86. }
  87. return nil
  88. }
  89. // 出库
  90. func (e *Stock) StockInStockInList(c *dto.StockInInsertReq) error {
  91. var err error
  92. // 检查药品信息是否已存在
  93. medicineInfo, err := e.GetMedicineInfo(c.ProductID, c.EnterpriseID, c.SpecID, c.ApprovalNumber, c.ExpiryDate)
  94. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  95. logs.Error("db error: %s", err)
  96. return global.CreateFailedErr
  97. }
  98. tx := db.DB.Begin()
  99. // 如果药品信息不存在,则创建新的药品信息
  100. if errors.Is(err, gorm.ErrRecordNotFound) {
  101. medicineInfo = models.MedicineInfo{
  102. ProductID: c.ProductID,
  103. EnterpriseID: c.EnterpriseID,
  104. SpecID: c.SpecID,
  105. UnitID: c.UnitID,
  106. DosageFormID: c.DosageFormID,
  107. ApprovalNumber: c.ApprovalNumber,
  108. QualificationNumber: c.QualificationNumber,
  109. ProductionDate: c.ProductionDate,
  110. ExpiryDate: c.ExpiryDate,
  111. BatchNumber: c.BatchNumber,
  112. }
  113. medicineInfo.SetDeptId(c.DeptId)
  114. medicineInfo.SetCreateBy(c.CreateBy)
  115. err = tx.Create(&medicineInfo).Error
  116. if err != nil {
  117. tx.Rollback()
  118. logs.Error("db error: %s", err)
  119. return global.CreateFailedErr
  120. }
  121. }
  122. // 进行入库操作
  123. stockInRecord := models.StockIn{
  124. MedicineID: medicineInfo.Id,
  125. Quantity: c.Quantity,
  126. UnitPrice: c.UnitPrice,
  127. Operator: c.Operator,
  128. ForwardingUnit: c.ForwardingUnit,
  129. Date: c.Date,
  130. }
  131. err = tx.Create(&stockInRecord).Error
  132. if err != nil {
  133. tx.Rollback()
  134. logs.Error("db error: %s", err)
  135. return global.CreateFailedErr
  136. }
  137. c.Id = stockInRecord.Id
  138. var inventory models.MedicineInventory
  139. err = tx.First(&inventory, "medicine_id = ?", medicineInfo.Id).Error
  140. if err != nil {
  141. tx.Rollback()
  142. logs.Error("db error: %s", err)
  143. return global.CreateFailedErr
  144. }
  145. // 添加库存记录
  146. inventory = models.MedicineInventory{
  147. MedicineID: medicineInfo.Id,
  148. TotalIn: c.Quantity,
  149. StockInID: stockInRecord.Id,
  150. TotalOut: 0,
  151. StockOutID: 0,
  152. Balance: c.Quantity,
  153. }
  154. inventory.Balance += c.Quantity
  155. err = tx.Create(&inventory).Error
  156. if err != nil {
  157. tx.Rollback()
  158. logs.Error("db error: %s", err)
  159. return global.CreateFailedErr
  160. }
  161. return nil
  162. }
  163. func (e *Stock) StockOut(c *dto.StockOutInsertReq) error {
  164. var err error
  165. // 检查药品信息是否已存在
  166. medicineInfo, err := e.GetMedicineInfo(c.ProductID, c.EnterpriseID, c.SpecID, c.ApprovalNumber, c.ExpiryDate)
  167. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  168. logs.Error("db error: %s", err)
  169. return global.CreateFailedErr
  170. }
  171. // 如果药品信息不存在,提示错误,不能出库
  172. if errors.Is(err, gorm.ErrRecordNotFound) {
  173. logs.Error("db error: %s", err)
  174. return errors.New("药品信息不存在")
  175. }
  176. tx := db.DB.Begin()
  177. // 进行入库操作
  178. stockOutRecord := models.StockOut{
  179. MedicineID: medicineInfo.Id,
  180. Quantity: c.Quantity,
  181. UnitPrice: c.UnitPrice,
  182. Operator: c.Operator,
  183. ReceivingUnit: c.ReceivingUnit,
  184. Date: c.Date,
  185. }
  186. err = tx.Create(&stockOutRecord).Error
  187. if err != nil {
  188. tx.Rollback()
  189. logs.Error("db error: %s", err)
  190. return global.CreateFailedErr
  191. }
  192. c.Id = stockOutRecord.Id
  193. var inventory models.MedicineInventory
  194. err = tx.First(&inventory, "medicine_id = ?", medicineInfo.Id).Error
  195. if err != nil {
  196. tx.Rollback()
  197. logs.Error("db error: %s", err)
  198. return global.CreateFailedErr
  199. }
  200. // 添加库存记录
  201. inventory = models.MedicineInventory{
  202. MedicineID: medicineInfo.Id,
  203. TotalIn: 0,
  204. StockInID: 0,
  205. TotalOut: c.Quantity,
  206. StockOutID: stockOutRecord.Id,
  207. Balance: c.Quantity,
  208. ReceivingUnit: c.ReceivingUnit,
  209. Operator: c.Operator,
  210. Date: c.Date,
  211. ControlBy: model2.ControlBy{
  212. DeptId: c.DeptId,
  213. CreateBy: c.CreateBy,
  214. },
  215. }
  216. inventory.Balance -= c.Quantity
  217. err = tx.Create(&inventory).Error
  218. if err != nil {
  219. tx.Rollback()
  220. logs.Error("db error: %s", err)
  221. return global.CreateFailedErr
  222. }
  223. return nil
  224. }
  225. func (e *Stock) GetMedicineInfo(productId, enterpriseId, specId int, approvalNumber, expiryDate string) (medicineInfo models.MedicineInfo, err error) {
  226. err = db.DB.Where("product_id = ? AND enterprise_id = ? AND spec_id = ?"+
  227. "AND approval_number = ? AND expiry_date", productId, enterpriseId, specId, approvalNumber, expiryDate).
  228. First(&medicineInfo).Error
  229. return
  230. }
  231. func (e *Stock) InsertMedicineInfo(c *dto.StockInInsertReq) (medicineInfo models.MedicineInfo, err error) {
  232. data := models.MedicineInfo{
  233. ProductID: c.ProductID,
  234. EnterpriseID: c.EnterpriseID,
  235. SpecID: c.SpecID,
  236. UnitID: c.UnitID,
  237. DosageFormID: c.DosageFormID,
  238. ApprovalNumber: c.ApprovalNumber,
  239. QualificationNumber: c.QualificationNumber,
  240. ProductionDate: c.ProductionDate,
  241. ExpiryDate: c.ExpiryDate,
  242. BatchNumber: c.BatchNumber,
  243. }
  244. data.SetDeptId(c.DeptId)
  245. data.SetCreateBy(c.CreateBy)
  246. err = db.DB.Create(&data).Error
  247. if err != nil {
  248. logs.Error("db error: %s", err)
  249. return data, global.CreateFailedErr
  250. }
  251. return data, nil
  252. }