package service import ( "encoding/json" "fmt" "strings" "sync" log "github.com/sirupsen/logrus" "kpt.xdmy/apiserver/model" "kpt.xdmy/apiserver/model/http" ) const ( ContractToAspUrl = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo" ContractToAspDestID = "EQMAN" ContractToAspBussTp = "MM007" ContractLimit = 10 ) var ( ContractCodeMap = make(map[string][]*model.PastureBigcontract, 0) sapContractReq = &http.SapContractReq{ Dest: &http.Dest{ DestID: ContractToAspDestID, BussTp: ContractToAspBussTp, Url: ContractToAspUrl, }, DATA: &http.ContractDataToASP{}, } ) type ContractInfo struct { PastureBigContract *model.PastureBigcontract // 牧场和合同关联表 Contract *model.Contract // 合同子表 Provider *model.Provider // 供应商 Pasture *model.Pasture // 牧场 } func GetBigContractData() []*model.BigContract { bigContractData := make([]*model.BigContract, ContractLimit) if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil { log.Errorf("AutoContractToASP Error:%v", err) } return bigContractData } func GetPastureBigContract(contractCode string) ([]*model.PastureBigcontract, error) { pastureBigContract := make([]*model.PastureBigcontract, 0) SQL := fmt.Sprintf("SELECT * FROM pasture_bigcontract WHERE bigcontract_id IN (SELECT id FROM bigcontract WHERE contractCode LIKE '%s%' AND enable = 1", contractCode) if err := s.d.DB.Raw(SQL).Find(&pastureBigContract).Error; err != nil { return nil, err } return pastureBigContract, nil } // GetContractInfo 获取合同相关信息 func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.PastureBigcontract) *ContractInfo { wg := sync.WaitGroup{} wg.Add(3) contractInfo := &ContractInfo{} // 获取牧场数据合同数据 go func() { pasture := &model.Pasture{ ID: pastureBigContract.PastureId, } if err := s.d.DB.First(pasture).Error; err != nil { log.Errorf("AutoContractToASP Pasture Err:%v,bigContractData:%v", err, bigContract) } contractInfo.Pasture = pasture wg.Done() }() // 获取合同子表数据 go func() { contract := &model.Contract{} if err := s.d.DB.Where("bigId = ?", bigContract.ID).First(contract).Error; err != nil { log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract) } if contract.ID > 0 { contractInfo.Contract = contract } wg.Done() }() // 获取供应商数据 go func() { provider := &model.Provider{ ID: bigContract.ProviderID, } if err := s.d.DB.First(provider).Error; err != nil { log.Errorf("AutoContractToASP Provider Err:%v,bigContractData:%v", err, bigContract) } contractInfo.Provider = provider wg.Done() }() wg.Wait() return contractInfo } // AutoContractToASP 合同信息自动同步到ASP func AutoContractToASP() { bigContractData := GetBigContractData() for _, bigContract := range bigContractData { contractCode := bigContract.ContractCode if strings.Contains(bigContract.ContractCode, "-") { contractCodeSlice := strings.Split(bigContract.ContractCode, "-") contractCode = contractCodeSlice[0] } if _, ok := ContractCodeMap[contractCode]; ok { continue } pastureBigContractSlice, err := GetPastureBigContract(contractCode) if err != nil { log.Errorf("AutoContractToASP pastureBigContractSlice Err:%v", err) continue } for _, pastureBigContract := range pastureBigContractSlice { // 获取合同相关数据集合 contractInfo := GetContractInfo(bigContract, pastureBigContract) ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract) contractDataToASP := &http.ContractDataToASP{ MATNR: contractInfo.Contract.PartCode, LIFNR: contractInfo.Provider.SapCode, EKORG: contractInfo.Pasture.ParchaseOrganization, WERKS: contractInfo.Pasture.FactoryCode, NETPR: "", WAERS: "CNY", BPRME: "", PEINH: "", MWSKZ: "J0", EKGRP: contractInfo.Pasture.PurchasingGroup, DATAB: bigContract.StartTime, DATBI: bigContract.StopTime, LOEKZ: "", } sapContractReq.DATA = contractDataToASP bodyByte, _ := json.Marshal(sapContractReq.DATA) rp := &http.OrderResp{} if err = s.SyncSap(sapContractReq, rp, bodyByte); err != nil { log.Errorf("AutoContractToASP SyncSap Err:%v", err) continue } if rp.Data.Status != "S" { log.Errorf("AutoContractToASP SyncSap Data:%v", rp.Data) continue } } if err = s.d.DB.Model(bigContract).Where(fmt.Sprintf("like %s", contractCode)).Update("isToSap", 1).Error; err != nil { log.Errorf("AutoContractToASP SQLUpdate Error:%v", err) } } log.Info("AutoContractToASP Success") }