contract.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. timeLayout = "2006-01-02 15:04:05"
  29. )
  30. type ContractInfo struct {
  31. PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
  32. Contract []*model.Contract // 合同子表
  33. Provider *model.Provider // 供应商
  34. Pasture *model.Pasture // 牧场
  35. }
  36. // GetBigContractData 获取主合同信息
  37. func GetBigContractData() []*model.BigContract {
  38. bigContractData := make([]*model.BigContract, ContractLimit)
  39. if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
  40. log.Errorf("AutoContractToASP Error:%v", err)
  41. }
  42. return bigContractData
  43. }
  44. func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) {
  45. pastureBigContract := make([]*model.PastureBigcontract, 0)
  46. SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s' AND enable = 1)", contractCode)
  47. if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil {
  48. return nil, err
  49. }
  50. return pastureBigContract, nil
  51. }
  52. // GetContractInfo 获取合同相关信息
  53. func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo {
  54. wg := sync.WaitGroup{}
  55. wg.Add(3)
  56. contractInfo := &ContractInfo{}
  57. // 获取牧场数据合同数据
  58. go func() {
  59. pasture := &model.Pasture{
  60. ID: pastureBigContract.PastureId,
  61. }
  62. if err := s.d.DB.First(pasture).Error; err != nil {
  63. log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract)
  64. }
  65. contractInfo.Pasture = pasture
  66. wg.Done()
  67. }()
  68. // 获取合同子表数据
  69. go func() {
  70. contract := make([]*model.Contract, 0)
  71. if err := s.d.DB.Where("bigId = ?", bigContract.ID).Find(&contract).Error; err != nil {
  72. log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
  73. }
  74. contractInfo.Contract = contract
  75. wg.Done()
  76. }()
  77. // 获取供应商数据
  78. go func() {
  79. provider := &model.Provider{
  80. ID: bigContract.ProviderID,
  81. }
  82. if err := s.d.DB.First(provider).Error; err != nil {
  83. log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract)
  84. }
  85. contractInfo.Provider = provider
  86. wg.Done()
  87. }()
  88. wg.Wait()
  89. return contractInfo
  90. }
  91. // AutoContractToASP 合同信息自动同步到ASP
  92. func AutoContractToASP() {
  93. bigContractData := GetBigContractData()
  94. for _, bigContract := range bigContractData {
  95. contractCode := bigContract.ContractCode
  96. if strings.Contains(bigContract.ContractCode, "-") {
  97. contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
  98. contractCode = contractCodeSlice[0]
  99. }
  100. if _, ok := ContractCodeMap[contractCode]; ok {
  101. continue
  102. }
  103. pastureBigContractSlice, err := GetPastureBigContract(contractCode)
  104. if err != nil {
  105. log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err)
  106. continue
  107. }
  108. for _, pastureBigContract := range pastureBigContractSlice {
  109. // 获取合同相关数据集合
  110. contractInfo := GetContractInfo(bigContract, pastureBigContract)
  111. if len(contractInfo.Contract) == 0 {
  112. continue
  113. }
  114. // 发送数据至SAP
  115. PushContractDataToSAP(bigContract, contractInfo)
  116. ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
  117. }
  118. if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
  119. log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
  120. }
  121. }
  122. log.Info("AutoContractToASP Success")
  123. }
  124. // PushContractDataToSAP 同步数据给SAP
  125. func PushContractDataToSAP(bigContract *model.BigContract, contractInfo *ContractInfo) {
  126. for _, contract := range contractInfo.Contract {
  127. LOEKZ := ""
  128. if contract.Enable == 0 {
  129. LOEKZ = "X"
  130. }
  131. startTime, _ := time.ParseInLocation(timeLayout, bigContract.StartTime, loc)
  132. stopTime, _ := time.ParseInLocation(timeLayout, bigContract.StopTime, loc)
  133. contractDataToASP := &http.ContractDataToASP{
  134. MATNR: contract.PartCode,
  135. LIFNR: contractInfo.Provider.SapCode,
  136. EKORG: contractInfo.Pasture.ParchaseOrganization,
  137. WERKS: contractInfo.Pasture.FactoryCode,
  138. WAERS: "CNY",
  139. PEINH: 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. }