contract.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "sync"
  7. log "github.com/sirupsen/logrus"
  8. "kpt.xdmy/apiserver/model"
  9. "kpt.xdmy/apiserver/model/http"
  10. )
  11. const (
  12. ContractToAspUrl = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
  13. ContractToAspDestID = "EQMAN"
  14. ContractToAspBussTp = "MM007"
  15. ContractLimit = 10
  16. )
  17. var (
  18. ContractCodeMap = make(map[string][]*model.PastureBigcontract, 0)
  19. sapContractReq = &http.SapContractReq{
  20. Dest: &http.Dest{
  21. DestID: ContractToAspDestID,
  22. BussTp: ContractToAspBussTp,
  23. Url: ContractToAspUrl,
  24. },
  25. DATA: &http.ContractDataToASP{},
  26. }
  27. )
  28. type ContractInfo struct {
  29. PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
  30. Contract *model.Contract // 合同子表
  31. Provider *model.Provider // 供应商
  32. Pasture *model.Pasture // 牧场
  33. }
  34. func GetBigContractData() []*model.BigContract {
  35. bigContractData := make([]*model.BigContract, ContractLimit)
  36. if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
  37. log.Errorf("AutoContractToASP Error:%v", err)
  38. }
  39. return bigContractData
  40. }
  41. func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) {
  42. pastureBigContract := make([]*model.PastureBigcontract, 0)
  43. SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s' AND enable = 1)", contractCode)
  44. if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil {
  45. return nil, err
  46. }
  47. return pastureBigContract, nil
  48. }
  49. // GetContractInfo 获取合同相关信息
  50. func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo {
  51. wg := sync.WaitGroup{}
  52. wg.Add(3)
  53. contractInfo := &ContractInfo{}
  54. // 获取牧场数据合同数据
  55. go func() {
  56. pasture := &model.Pasture{
  57. ID: pastureBigContract.PastureId,
  58. }
  59. if err := s.d.DB.First(pasture).Error; err != nil {
  60. log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
  61. }
  62. contractInfo.Pasture = pasture
  63. wg.Done()
  64. }()
  65. // 获取合同子表数据
  66. go func() {
  67. contract := &model.Contract{}
  68. if err := s.d.DB.Where("bigId = ?", bigContract.ID).First(contract).Error; err != nil {
  69. log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
  70. }
  71. if contract.ID > 0 {
  72. contractInfo.Contract = contract
  73. }
  74. wg.Done()
  75. }()
  76. // 获取供应商数据
  77. go func() {
  78. provider := &model.Provider{
  79. ID: bigContract.ProviderID,
  80. }
  81. if err := s.d.DB.First(provider).Error; err != nil {
  82. log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract)
  83. }
  84. contractInfo.Provider = provider
  85. wg.Done()
  86. }()
  87. wg.Wait()
  88. return contractInfo
  89. }
  90. // AutoContractToASP 合同信息自动同步到ASP
  91. func AutoContractToASP() {
  92. bigContractData := GetBigContractData()
  93. for _, bigContract := range bigContractData {
  94. contractCode := bigContract.ContractCode
  95. if strings.Contains(bigContract.ContractCode, "-") {
  96. contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
  97. contractCode = contractCodeSlice[0]
  98. }
  99. if _, ok := ContractCodeMap[contractCode]; ok {
  100. continue
  101. }
  102. pastureBigContractSlice, err := GetPastureBigContract(contractCode)
  103. if err != nil {
  104. log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err)
  105. continue
  106. }
  107. for _, pastureBigContract := range pastureBigContractSlice {
  108. // 获取合同相关数据集合
  109. contractInfo := GetContractInfo(bigContract, pastureBigContract)
  110. contractDataToASP := &http.ContractDataToASP{
  111. MATNR: contractInfo.Contract.PartCode,
  112. LIFNR: contractInfo.Provider.SapCode,
  113. EKORG: contractInfo.Pasture.ParchaseOrganization,
  114. WERKS: contractInfo.Pasture.FactoryCode,
  115. NETPR: "",
  116. WAERS: "CNY",
  117. BPRME: "",
  118. PEINH: "",
  119. MWSKZ: "J0",
  120. EKGRP: contractInfo.Pasture.PurchasingGroup,
  121. DATAB: bigContract.StartTime,
  122. DATBI: bigContract.StopTime,
  123. LOEKZ: "",
  124. }
  125. sapContractReq.DATA = contractDataToASP
  126. bodyByte, _ := json.Marshal(sapContractReq.DATA)
  127. rp := &http.OrderResp{}
  128. if err = s.SyncSap(sapContractReq, rp, bodyByte); err != nil {
  129. log.Errorf("AutoContractToASP SyncSap Err:%v", err)
  130. continue
  131. }
  132. log.Infof("AutoContractToASP SyncSap Success:%v", rp)
  133. if rp.Data.Status != "S" {
  134. log.Errorf("AutoContractToASP SyncSap Data:%v", rp.Data)
  135. continue
  136. }
  137. ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
  138. }
  139. if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
  140. log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
  141. }
  142. }
  143. log.Info("AutoContractToASP Success")
  144. }