contract.go 5.1 KB

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