Преглед изворни кода

Merge branch 'feature_sap_contracts' of baishaojie/kpt_xdmy into master

xuyiping пре 1 година
родитељ
комит
31a3ba774a
3 измењених фајлова са 66 додато и 37 уклоњено
  1. 16 1
      apiserver/model/http/sap.go
  2. 49 35
      apiserver/service/contract.go
  3. 1 1
      apiserver/service/job.go

+ 16 - 1
apiserver/model/http/sap.go

@@ -27,6 +27,19 @@ type SapRespMsg struct {
 	EqNumber    string `json:"EXT03"`
 }
 
+type SapContractResp struct {
+	Dest `json:"DEST"`
+	Data SapContractRespMsg `json:"DATA"`
+}
+
+type SapContractRespMsg struct {
+	HMSGR struct {
+		MSGTY string `json:"MSGTY"`
+		MSGTX string `json:"MSGTX"`
+		EXT01 string `json:"EXT01"`
+	} `json:"HMSGR"`
+}
+
 var SapAuth *http.Auth
 
 type SapQueryReq struct {
@@ -58,7 +71,7 @@ type SrmResp struct {
 }
 
 type ContractDataToASP struct {
-	MATNR string `json:"MATNR "` // 物编码
+	MATNR string `json:"MATNR "` // 物编码
 	LIFNR string `json:"LIFNR"`  // 供应商编码
 	EKORG string `json:"EKORG"`  // 采购组织
 	WERKS string `json:"WERKS"`  // 工厂
@@ -71,4 +84,6 @@ type ContractDataToASP struct {
 	DATAB string `json:"DATAB"`  // 生效起始时间
 	DATBI string `json:"DATBI"`  // 生效结束时间
 	LOEKZ string `json:"LOEKZ"`  // 删除标识
+	ESOKZ string `json:"ESOKZ"`
+	MEINS string `json:"MEINS"` // 订单价格单位
 }

+ 49 - 35
apiserver/service/contract.go

@@ -1,10 +1,10 @@
 package service
 
 import (
-	"encoding/json"
 	"fmt"
 	"strings"
 	"sync"
+	"time"
 
 	log "github.com/sirupsen/logrus"
 	"kpt.xdmy/apiserver/model"
@@ -14,7 +14,7 @@ import (
 const (
 	ContractToAspUrl    = "http://192.168.61.117/SAPQ0/SRM/MM018/PurchaseInfo"
 	ContractToAspDestID = "EQMAN"
-	ContractToAspBussTp = "MM007"
+	ContractToAspBussTp = "MM018"
 	ContractLimit       = 10
 )
 
@@ -28,15 +28,18 @@ var (
 		},
 		DATA: &http.ContractDataToASP{},
 	}
+	loc, _     = time.LoadLocation("Local")
+	timeLayout = "2006-01-02 15:04:05"
 )
 
 type ContractInfo struct {
 	PastureBigContract *model.PastureBigcontract // 牧场和合同关联表
-	Contract           *model.Contract           // 合同子表
+	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 {
@@ -74,13 +77,11 @@ func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.P
 
 	// 获取合同子表数据
 	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)
 		}
-		if contract.ID > 0 {
-			contractInfo.Contract = contract
-		}
+		contractInfo.Contract = contract
 		wg.Done()
 	}()
 
@@ -101,7 +102,6 @@ func GetContractInfo(bigContract *model.BigContract, pastureBigContract *model.P
 
 // AutoContractToASP 合同信息自动同步到ASP
 func AutoContractToASP() {
-
 	bigContractData := GetBigContractData()
 	for _, bigContract := range bigContractData {
 		contractCode := bigContract.ContractCode
@@ -109,7 +109,6 @@ func AutoContractToASP() {
 			contractCodeSlice := strings.Split(bigContract.ContractCode, "-")
 			contractCode = contractCodeSlice[0]
 		}
-
 		if _, ok := ContractCodeMap[contractCode]; ok {
 			continue
 		}
@@ -121,33 +120,11 @@ func AutoContractToASP() {
 		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)
+			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 {
@@ -156,3 +133,40 @@ func AutoContractToASP() {
 	}
 	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)
+		}
+	}
+}

+ 1 - 1
apiserver/service/job.go

@@ -77,7 +77,7 @@ func SapJobInit() {
 	})
 
 	// 合同信息同步SAP 5分钟同步一次,一次同步limit条数据
-	timeLocalSub, _ := time.ParseInLocation("15:04:05", "00:05:00", time.Local)
+	timeLocalSub, _ := time.ParseInLocation("15:04:05", "00:01:00", time.Local)
 	timeLocal, _ := time.ParseInLocation("15:04:05", "00:00:00", time.Local)
 	c1.AddFunc(fmt.Sprintf("@every %v", timeLocalSub.Sub(timeLocal)), func() {
 		AutoContractToASP()