123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- package service
- import (
- "fmt"
- "strings"
- "sync"
- "time"
- 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 = "MM018"
- 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{},
- }
- loc, _ = time.LoadLocation("Local")
- timeLayout = "2006-01-02 15:04:05"
- )
- type ContractInfo struct {
- PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
- Contract []*model.Contract // 合同子表
- Provider *model.Provider // 供应商
- Pasture *model.Pasture // 牧场
- }
- // GetBigContractData 获取主合同信息
- 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 := make([]*model.Contract, 0)
- if err := s.d.DB.Where("bigId = ?", bigContract.ID).Find(&contract).Error; err != nil {
- log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
- }
- 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)
- if len(contractInfo.Contract) == 0 {
- continue
- }
- // 发送数据至SAP
- PushContractDataToSAP(bigContract, contractInfo)
- 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")
- }
- // PushContractDataToSAP 同步数据给SAP
- func PushContractDataToSAP(bigContract *model.BigContract, contractInfo *ContractInfo) {
- for _, contract := range contractInfo.Contract {
- LOEKZ := ""
- if contract.Enable == 0 {
- LOEKZ = "X"
- }
- startTime, _ := time.ParseInLocation(timeLayout, bigContract.StartTime, loc)
- stopTime, _ := time.ParseInLocation(timeLayout, bigContract.StopTime, loc)
- contractDataToASP := &http.ContractDataToASP{
- MATNR: contract.PartCode,
- LIFNR: contractInfo.Provider.SapCode,
- EKORG: contractInfo.Pasture.ParchaseOrganization,
- WERKS: contractInfo.Pasture.FactoryCode,
- WAERS: "CNY",
- PEINH: fmt.Sprintf("%f", contract.Price),
- MWSKZ: "J0",
- EKGRP: contractInfo.Pasture.PurchasingGroup,
- DATAB: startTime.Format("20060102"),
- DATBI: stopTime.Format("20060102"),
- LOEKZ: LOEKZ,
- ESOKZ: fmt.Sprintf("%d", contract.IsZeroStock),
- MEINS: contract.Unit,
- }
- sapContractReq.DATA = contractDataToASP
- rp := &http.SapContractResp{}
- if err := s.SyncSap(sapContractReq, rp, sapContractReq); err != nil {
- log.Errorf("AutoContractToASP SyncSap Err:%v contract:%v", err, contract)
- continue
- }
- if rp.Dest.Status != "S" {
- log.Errorf("AutoContractToASP SyncSap Error:%v,contract:%v", rp, contract)
- }
- }
- }
|