|
@@ -1,10 +1,10 @@
|
|
package service
|
|
package service
|
|
|
|
|
|
import (
|
|
import (
|
|
- "encoding/json"
|
|
|
|
"fmt"
|
|
"fmt"
|
|
"strings"
|
|
"strings"
|
|
"sync"
|
|
"sync"
|
|
|
|
+ "time"
|
|
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
log "github.com/sirupsen/logrus"
|
|
"kpt.xdmy/apiserver/model"
|
|
"kpt.xdmy/apiserver/model"
|
|
@@ -14,7 +14,7 @@ import (
|
|
const (
|
|
const (
|
|
ContractToAspUrl = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
|
|
ContractToAspUrl = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
|
|
ContractToAspDestID = "EQMAN"
|
|
ContractToAspDestID = "EQMAN"
|
|
- ContractToAspBussTp = "MM007"
|
|
|
|
|
|
+ ContractToAspBussTp = "MM018"
|
|
ContractLimit = 10
|
|
ContractLimit = 10
|
|
)
|
|
)
|
|
|
|
|
|
@@ -28,15 +28,18 @@ var (
|
|
},
|
|
},
|
|
DATA: &http.ContractDataToASP{},
|
|
DATA: &http.ContractDataToASP{},
|
|
}
|
|
}
|
|
|
|
+ loc, _ = time.LoadLocation("Local")
|
|
|
|
+ timeLayout = "2006-01-02 15:04:05"
|
|
)
|
|
)
|
|
|
|
|
|
type ContractInfo struct {
|
|
type ContractInfo struct {
|
|
PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
|
|
PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
|
|
- Contract *model.Contract // 合同子表
|
|
|
|
|
|
+ Contract []*model.Contract // 合同子表
|
|
Provider *model.Provider // 供应商
|
|
Provider *model.Provider // 供应商
|
|
Pasture *model.Pasture // 牧场
|
|
Pasture *model.Pasture // 牧场
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// GetBigContractData 获取主合同信息
|
|
func GetBigContractData() []*model.BigContract {
|
|
func GetBigContractData() []*model.BigContract {
|
|
bigContractData := make([]*model.BigContract, ContractLimit)
|
|
bigContractData := make([]*model.BigContract, ContractLimit)
|
|
if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
|
|
if err := s.d.DB.Where("isToSap = ?", 0).Limit(ContractLimit).Find(&bigContractData).Debug().Error; err != nil {
|
|
@@ -74,13 +77,11 @@ func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.P
|
|
|
|
|
|
// 获取合同子表数据
|
|
// 获取合同子表数据
|
|
go func() {
|
|
go func() {
|
|
- contract := &model.Contract{}
|
|
|
|
- if err := s.d.DB.Where("bigId = ?", bigContract.ID).First(contract).Error; err != nil {
|
|
|
|
|
|
+ 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)
|
|
log.Errorf("AutoContractToASP contract Err:%v,bigContractData:%v", err, bigContract)
|
|
}
|
|
}
|
|
- if contract.ID > 0 {
|
|
|
|
- contractInfo.Contract = contract
|
|
|
|
- }
|
|
|
|
|
|
+ contractInfo.Contract = contract
|
|
wg.Done()
|
|
wg.Done()
|
|
}()
|
|
}()
|
|
|
|
|
|
@@ -101,7 +102,6 @@ func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.P
|
|
|
|
|
|
// AutoContractToASP 合同信息自动同步到ASP
|
|
// AutoContractToASP 合同信息自动同步到ASP
|
|
func AutoContractToASP() {
|
|
func AutoContractToASP() {
|
|
-
|
|
|
|
bigContractData := GetBigContractData()
|
|
bigContractData := GetBigContractData()
|
|
for _, bigContract := range bigContractData {
|
|
for _, bigContract := range bigContractData {
|
|
contractCode := bigContract.ContractCode
|
|
contractCode := bigContract.ContractCode
|
|
@@ -109,7 +109,6 @@ func AutoContractToASP() {
|
|
contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
|
|
contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
|
|
contractCode = contractCodeSlice[0]
|
|
contractCode = contractCodeSlice[0]
|
|
}
|
|
}
|
|
-
|
|
|
|
if _, ok := ContractCodeMap[contractCode]; ok {
|
|
if _, ok := ContractCodeMap[contractCode]; ok {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
@@ -121,33 +120,11 @@ func AutoContractToASP() {
|
|
for _, pastureBigContract := range pastureBigContractSlice {
|
|
for _, pastureBigContract := range pastureBigContractSlice {
|
|
// 获取合同相关数据集合
|
|
// 获取合同相关数据集合
|
|
contractInfo := GetContractInfo(bigContract, pastureBigContract)
|
|
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)
|
|
|
|
|
|
+ if len(contractInfo.Contract) == 0 {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+ // 发送数据至SAP
|
|
|
|
+ PushContractDataToSAP(bigContract, contractInfo)
|
|
ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
|
|
ContractCodeMap[contractCode] = append(ContractCodeMap[contractCode], pastureBigContract)
|
|
}
|
|
}
|
|
if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
|
|
if err = s.d.DB.Model(bigContract).Where("id = ?", bigContract.ID).Update("isToSap", 1).Error; err != nil {
|
|
@@ -156,3 +133,40 @@ func AutoContractToASP() {
|
|
}
|
|
}
|
|
log.Info("AutoContractToASP Success")
|
|
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)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|