contract.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package service
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. "time"
  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 = "MM018"
  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. loc, _ = time.LoadLocation("Local")
  28. )
  29. type ContractInfo struct {
  30. PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
  31. Contract []*model.Contract // 合同子表
  32. Provider *model.Provider // 供应商
  33. Pasture *model.Pasture // 牧场
  34. }
  35. // GetBigContractData 获取主合同信息
  36. func GetBigContractData() []*model.BigContract {
  37. bigContractData := make([]*model.BigContract, ContractLimit)
  38. if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
  39. log.Errorf("AutoContractToASP Error:%v", err)
  40. }
  41. return bigContractData
  42. }
  43. func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) {
  44. pastureBigContract := make([]*model.PastureBigcontract, 0)
  45. SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s' AND enable = 1)", contractCode)
  46. if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil {
  47. return nil, err
  48. }
  49. return pastureBigContract, nil
  50. }
  51. // GetContractInfo 获取合同相关信息
  52. func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo {
  53. wg := sync.WaitGroup{}
  54. wg.Add(3)
  55. contractInfo := &ContractInfo{}
  56. // 获取牧场数据合同数据
  57. go func() {
  58. pasture := &model.Pasture{
  59. ID: pastureBigContract.PastureId,
  60. }
  61. if err := s.d.DB.First(pasture).Error; err != nil {
  62. log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
  63. }
  64. contractInfo.Pasture = pasture
  65. wg.Done()
  66. }()
  67. // 获取合同子表数据
  68. go func() {
  69. contract := make([]*model.Contract, 0)
  70. if err := s.d.DB.Where("bigId = ?", bigContract.ID).Find(&contract).Error; err != nil {
  71. log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
  72. }
  73. contractInfo.Contract = contract
  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. if len(contractInfo.Contract) == 0 || pastureBigContract.PastureId == 18 {
  111. continue
  112. }
  113. // 发送数据至SAP
  114. PushContractDataToSAP(bigContract, contractInfo)
  115. ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
  116. }
  117. if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
  118. log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
  119. }
  120. }
  121. log.Info("AutoContractToASP Success")
  122. }
  123. // PushContractDataToSAP 同步数据给SAP
  124. func PushContractDataToSAP(bigContract *model.BigContract, contractInfo *ContractInfo) {
  125. for _, contract := range contractInfo.Contract {
  126. LOEKZ := ""
  127. if contract.Enable == 0 {
  128. LOEKZ = "X"
  129. }
  130. startTime, _ := time.ParseInLocation(time.RFC3339, bigContract.StartTime, loc)
  131. stopTime, _ := time.ParseInLocation(time.RFC3339, bigContract.StopTime, loc)
  132. contractDataToASP := &http.ContractDataToASP{
  133. MATNR: contract.PartCode,
  134. LIFNR: contractInfo.Provider.SapCode,
  135. EKORG: contractInfo.Pasture.ParchaseOrganization,
  136. WERKS: contractInfo.Pasture.FactoryCode,
  137. WAERS: "CNY",
  138. PEINH: fmt.Sprintf("%f", contract.Price),
  139. NETPR: fmt.Sprintf("%f", contract.Price),
  140. MWSKZ: "J0",
  141. EKGRP: contractInfo.Pasture.PurchasingGroup,
  142. DATAB: startTime.Format("20060102"),
  143. DATBI: stopTime.Format("20060102"),
  144. LOEKZ: LOEKZ,
  145. ESOKZ: fmt.Sprintf("%d", contract.IsZeroStock),
  146. MEINS: contract.Unit,
  147. }
  148. sapContractReq.DATA = contractDataToASP
  149. rp := &http.SapContractResp{}
  150. if err := s.SyncSap(sapContractReq, rp, sapContractReq); err != nil {
  151. log.Errorf("AutoContractToASP SyncSap Err:%v contract:%v", err, contract)
  152. continue
  153. }
  154. if rp.Dest.Status != "S" {
  155. log.Errorf("AutoContractToASP SyncSap Error:%v,contract:%v", rp, contract)
  156. }
  157. }
  158. }