purchase.go 4.8 KB

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