purchase.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. modernPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/xdmy"
  6. "gitee.com/xuyiping_admin/pkg/xerr"
  7. "github.com/pkg/errors"
  8. "gorm.io/gorm"
  9. "kpt.xdmy/apiserver/model"
  10. "strconv"
  11. )
  12. // CreateSpecialtyPurchase 创建特殊申购信息
  13. func CreateSpecialtyPurchase(ctx context.Context, req *modernPb.SparePartsRequisitionsRequest) error {
  14. var bigPartPurchaseId int64 = 0
  15. // 赠品
  16. defer func() {
  17. if req.PurchaseType == modernPb.PurchaseType_Complimentary_Item {
  18. if err := SpecialtyToProcure(bigPartPurchaseId); err != nil {
  19. fmt.Println("SpecialtyToProcure===>", bigPartPurchaseId)
  20. }
  21. }
  22. }()
  23. return s.d.DB.Transaction(func(tx *gorm.DB) error {
  24. newBigPartPurchase := model.NewBigPartPurchase(
  25. int64(req.PastureId), int64(req.DepartmentId), int64(req.EmployeId),
  26. int64(req.ProviderId), req.PurchaseType, req.OrderNumber, req.CreateTime, req.ProviderName,
  27. )
  28. if err := tx.Model(new(model.BigPartPurchase)).Create(newBigPartPurchase).Error; err != nil {
  29. return xerr.WithStack(err)
  30. }
  31. partPurchaseList := make([]*model.PartPurchase, 0)
  32. for _, v := range req.SpotList {
  33. amount, _ := strconv.Atoi(v.Amount)
  34. partPurchaseList = append(partPurchaseList, model.NewPartPurchase(
  35. newBigPartPurchase.Id, int64(req.PastureId), int64(v.PartId), int64(v.BrandId), int64(amount),
  36. int64(v.ContractId), v.PartCode, v.PartName, v.Specification, v.Unit, v.Purpose, v.Price,
  37. float64(v.StorageAmount)))
  38. }
  39. if len(partPurchaseList) > 0 {
  40. if err := tx.Model(new(model.PartPurchase)).Create(partPurchaseList).Error; err != nil {
  41. return xerr.WithStack(err)
  42. }
  43. }
  44. bigPartPurchaseId = newBigPartPurchase.Id
  45. return nil
  46. })
  47. }
  48. // SpecialtyToProcure 特殊申购-自动流转采购单
  49. func SpecialtyToProcure(id int64) error {
  50. // 获取特殊申购单信息
  51. newBigPartPurchase := &model.BigPartPurchase{Id: id}
  52. if err := s.d.DB.Model(new(model.BigPartPurchase)).First(newBigPartPurchase).Error; err != nil {
  53. return xerr.WithStack(err)
  54. }
  55. // 过滤掉非特殊申购的数据
  56. if newBigPartPurchase.PurchaseType <= 0 {
  57. return nil
  58. }
  59. newPartPurchase := make([]*model.PartPurchase, 0)
  60. if err := s.d.DB.Model(new(model.PartPurchase)).Where("bigId = ?", newBigPartPurchase.Id).Find(&newPartPurchase).Error; err != nil {
  61. return xerr.WithStack(err)
  62. }
  63. return s.d.DB.Transaction(func(tx *gorm.DB) error {
  64. // 获取申购单号
  65. var orderCode string
  66. if err := tx.Raw(fmt.Sprintf("CALL createCodeN(%d,'%s')", newBigPartPurchase.PastureId, "CG")).Scan(&orderCode).Error; err != nil {
  67. return xerr.WithStack(err)
  68. }
  69. historyBigBuyDetail := &model.BigBuyDetail{}
  70. if err := tx.Model(new(model.BigBuyDetail)).Where("buyeCode = ?", orderCode).First(historyBigBuyDetail).Error; err != nil {
  71. if !errors.Is(err, gorm.ErrRecordNotFound) {
  72. return xerr.WithStack(err)
  73. }
  74. }
  75. // 避免重复提交
  76. if historyBigBuyDetail.BuyeCode == orderCode {
  77. return xerr.Customf("该申购单号已经存在:%s", orderCode)
  78. }
  79. newBigBuyDetail := model.NewBigBuyDetail(
  80. orderCode, newBigPartPurchase.OrderNumber, newBigPartPurchase.PastureId,
  81. newBigPartPurchase.ProviderId, newBigPartPurchase.EmployeId, newBigPartPurchase.PurchaseType)
  82. if err := tx.Model(new(model.BigBuyDetail)).Create(newBigBuyDetail).Error; err != nil {
  83. return xerr.WithStack(err)
  84. }
  85. buyDetailList := make([]*model.BuyDetail, 0)
  86. var allAmount int64 = 0
  87. for _, v := range newPartPurchase {
  88. contractId, _ := strconv.Atoi(v.ContractId)
  89. newContract := &model.Contract{}
  90. if err := tx.Model(new(model.Contract)).Where("id = ?", contractId).First(newContract).Error; err != nil {
  91. fmt.Println("newContract", err)
  92. }
  93. bigContract := &model.BigContract{}
  94. if err := tx.Model(new(model.BigContract)).Where("id = ?", newContract.BigID).First(bigContract).Error; err != nil {
  95. fmt.Println("CreateSpecialtyPurchase", err)
  96. }
  97. department := &model.Department{}
  98. if err := tx.Model(new(model.Department)).Where("pastureId = ?", newBigPartPurchase.PastureId).
  99. Where("id = ?", newBigPartPurchase.DepartmentId).First(department).Error; err != nil {
  100. return xerr.WithStack(err)
  101. }
  102. price, _ := strconv.ParseFloat(v.Price, 64)
  103. buyDetailList = append(buyDetailList, model.NewBuyDetail(int64(newBigBuyDetail.ID), int64(newBigBuyDetail.PastureID),
  104. v.Amount, int64(contractId), v.BrandId, newContract.PartCode, bigContract.ContractCode, v.Purpose, department.Name, price))
  105. allAmount += v.Amount
  106. }
  107. if err := s.d.DB.Model(new(model.BigBuyDetail)).Where("id = ?", newBigBuyDetail.ID).Updates(map[string]interface{}{
  108. "zeroCou": allAmount,
  109. }).Error; err != nil {
  110. return xerr.WithStack(err)
  111. }
  112. if len(buyDetailList) > 0 {
  113. if err := tx.Model(new(model.BuyDetail)).Create(buyDetailList).Error; err != nil {
  114. return xerr.WithStack(err)
  115. }
  116. }
  117. return nil
  118. })
  119. }