123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- 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
- }
- 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
- }
- 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)
- 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
- }
- log.Infof("AutoContractToASP SyncSap Success:%v", rp)
- if rp.Data.Status != "S" {
- log.Errorf("AutoContractToASP SyncSap Data:%v", rp.Data)
- continue
- }
- ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
- }
- if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
- log.Errorf("AutoContractToASP SQLUpdate Error:%v", err)
- }
- }
- log.Info("AutoContractToASP Success")
- }
|