package util
import (
"../logging"
"bytes"
"encoding/xml"
"fmt"
"github.com/pkg/errors"
"io/ioutil"
"net/http"
"strings"
"time"
)
//eas webservice
var (
LoginStr = `
userName?
password?
slnName?
dcName?
language?
dbType?
`
LogoutStr = `
userName?
slnName?
dcName?
language?
`
InsertPartsStr = `
SessionId?
strJson?
`
QureyPartsStr = `
SessionId?
{"number":"strJson?"}
`
InsertPartsuselaidStr = `
SessionId?
billType?
strJson?
2
`
QureyBill = `
SessionId?
billType?
{"number":"strJson?"}
`
)
var (
singelChan chan struct{}
lasttime time.Time
sessionid string
sessionidChan chan string
)
var user EASLoginInfo
type EASLoginInfo struct {
UserName string `json:"userName"`
Password string `json:"password"`
SlnName string `json:"slnName"`
DcName string `json:"dcName"`
Language string `json:"language"`
DbType string `json:"dbType"`
Url string `json:"dbType"`
}
type Response struct {
Body rspBody `xml:"Body" json:"body"`
}
type rspBody struct {
Record []rqRecord `xml:"multiRef" json:"multiRef"`
SynMaterialResponse SMReturn `xml:"synMaterialResponse" json:"SynMaterialResponse"`
ImportBillResponse ImportBillResponse `xml:"importBillResponse" json:"importBillResponse"`
QueryMaterialDataResponse QureyParts `xml:"queryMaterialDataResponse" json:"queryMaterialDataResponse"`
QueryScmBillDataResponse QureyBills `xml:"queryScmBillDataResponse" json:"queryScmBillDataResponse"`
}
type ImportBillResponse struct {
ImportBillReturn string `xml:"importBillReturn" json:"importBillReturn"`
}
type QureyParts struct {
QueryMaterialDataReturn string `xml:"queryMaterialDataReturn" json:"queryMaterialDataReturn"`
}
type QureyBills struct {
QueryScmBillDataReturn string `xml:"queryScmBillDataReturn" json:"queryScmBillDataReturn"`
}
type SMReturn struct {
SynMaterialReturn string `xml:"synMaterialReturn" json:"synMaterialReturn"`
}
type rqRecord struct {
SessionId string `xml:"sessionId" json:"sessionId"`
}
func InitWebS(use, pass, url string) {
user.Password = pass
user.UserName = use
user.DbType = "1"
user.DcName = "MASM"
user.Language = "L2"
user.SlnName = "eas"
user.Url = url
singelChan = make(chan struct{} ,100)
sessionidChan = make(chan string ,100)
lasttime = time.Now().Add(-6*time.Minute)
go Runsessionid()
}
func Runsessionid(){
for {
func() {
defer func() {
if err := recover();err != nil {
logging.Error("Runsessionid recover err",err)
}
}()
select {
case <- singelChan:
if time.Now().Sub(lasttime) > 5*time.Minute{ // 大于五分钟重新退出再登录
println("重新登录")
//EASWebServiceLogout()
sd, err := EASWebServiceLogin()
if err != nil {
sessionidChan <- "error: "+err.Error()
}else{
lasttime = time.Now()
sessionid = sd
sessionidChan <- sessionid
}
}else{
sessionidChan <- sessionid
}
}
}()
}
}
func eastest() {
sessionid, _ := EASWebServiceLogin()
//EASWebServicInsertParts(sessionid,"{}")
EASWebServicInsertPartsuselaid(sessionid, "{}", "007")
//EASWebServiceLogout()
}
func EASWebServiceLogin() (string, error) {
client := &http.Client{}
resstr := ReplaceStrWebSevice("login", user.UserName, user.Password, user.SlnName, user.DcName, user.Language, user.DbType, "", "", "")
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/EASLogin?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
return "", err
}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return "", err
}
defer resp.Body.Close()
result_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return "", err
}
v := Response{}
err = xml.Unmarshal([]byte(string(result_body)), &v)
if err != nil {
fmt.Println(err.Error())
}
if len(v.Body.Record) > 0 {
return v.Body.Record[0].SessionId, nil
}
return "", err
}
func EASWebServiceLogout() error {
client := &http.Client{}
resstr := ReplaceStrWebSevice("logout", user.UserName, "", user.SlnName, user.DcName, user.Language, "", "", "", "")
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/EASLogin?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
// handle error
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
return nil
//fmt.Println(string(result_body))
}
func EASWebServiceQureyParts(SessionId, PartCode string) error {
client := &http.Client{}
resstr := ReplaceStrWebSevice("QureyPartsStr", "", "", "", "", "", "", SessionId, PartCode, "")
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/WSReadEASDataFacade?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
// handle error
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
result_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
v := Response{}
err = xml.Unmarshal(result_body, &v)
if err != nil {
fmt.Println(err.Error())
}
resmap := make(map[string]interface{}, 0)
err = json.Unmarshal([]byte(v.Body.QueryMaterialDataResponse.QueryMaterialDataReturn), &resmap)
//fmt.Println("resmap===============", resmap,len(resmap["data"].([]interface{})))
switch resmap["data"].(type) {
case []interface{}:
if resmap["success"] != "1" || len(resmap["data"].([]interface{})) == 0 {
return errors.New("单据未查询到")
}
default:
return errors.New("单据未查询到")
}
return nil
}
func EASWebServiceQureyBill(SessionId, BillCode,billType string) error {
client := &http.Client{}
resstr := ReplaceStrWebSevice("QureyBill", "", "", "", "", "", "", SessionId, BillCode, billType)
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/WSReadEASDataFacade?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
return err
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
result_body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(result_body))
if err != nil {
fmt.Println(err)
return err
}
v := Response{}
err = xml.Unmarshal(result_body, &v)
if err != nil {
fmt.Println(err.Error())
}
resmap := make(map[string]interface{}, 0)
err = json.Unmarshal([]byte(v.Body.QueryScmBillDataResponse.QueryScmBillDataReturn), &resmap)
//fmt.Println("resmap===============", resmap,len(resmap["data"].([]interface{})))
switch resmap["data"].(type) {
case []interface{}:
if resmap["success"] != "1" || len(resmap["data"].([]interface{})) == 0 {
return errors.New("单据未查询到")
}
default:
return errors.New("单据未查询到")
}
return nil
}
func EASWebServicInsertParts(SessionId string, parts Parts) error {
client := &http.Client{}
soapencJson, err := json.Marshal(parts)
if err != nil {
return err
}
println(string(soapencJson))
resstr := ReplaceStrWebSevice("InsertParts", "", "", "", "", "", "", SessionId, string(soapencJson), "")
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/WSSynMasterDataFacade?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
// handle error
}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return err
}
defer resp.Body.Close()
result_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return err
}
v := Response{}
err = xml.Unmarshal(result_body, &v)
if err != nil {
fmt.Println(err.Error())
}
resmap := make(map[string]string, 0)
err = json.Unmarshal([]byte(v.Body.SynMaterialResponse.SynMaterialReturn), &resmap)
_,ok := resmap["success"]
if !ok {
return errors.New(string(result_body))
}
if resmap["success"] == "0" {
return errors.New(resmap["message"])
}
return nil
}
func EASWebServicInsertPartsuselaid(SessionId, strJson, billType string) error { //billType采购入库单:006 销售出库单:007 其他入库单:008 其他出库单:009 领料出库单:100 生产入库单:101
client := &http.Client{}
resstr := ReplaceStrWebSevice("InsertPartsuselaidStr", "", "", "", "", "", "", SessionId, strJson, billType)
body := bytes.NewBuffer([]byte(resstr))
req, err := http.NewRequest("POST",
user.Url+"/ormrpc/services/WSSCMWebServiceFacade?wsdl",
body,
)
req.Header.Set("Content-Type", "text/xml")
req.Header.Set("SOAPAction", "application/soap+xml")
if err != nil {
// handle error
}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return err
}
defer resp.Body.Close()
result_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return err
}
v := Response{}
err = xml.Unmarshal(result_body, &v)
if err != nil {
fmt.Println(err.Error())
}
resmap := make(map[string]interface{}, 0)
if v.Body.ImportBillResponse.ImportBillReturn != "" {
err = json.Unmarshal([]byte(v.Body.ImportBillResponse.ImportBillReturn), &resmap)
fmt.Println(v.Body.ImportBillResponse.ImportBillReturn)
//_,ok := resmap["billErrors"]
//if !ok {
// println(string(result_body))
// return errors.New(string(result_body))
//}
_,ok := resmap["status"]
if !ok {
println(string(result_body))
return errors.New(string(result_body))
}
//if len(resmap["billErrors"].([]interface{})) > 0 || resmap["status"] != "1" {
if resmap["status"] != "0" {
resmap := make(map[string]interface{}, 0)
err = json.Unmarshal([]byte(v.Body.ImportBillResponse.ImportBillReturn), &resmap)
switch resmap["billErrors"].(type) {
case []interface{}:
if len(resmap["billErrors"].([]interface{}))>0{
switch resmap["billErrors"].([]interface{})[0].(type) {
case map[string]interface{} :
str := resmap["billErrors"].([]interface{})[0].(map[string]interface{})["errorMsgs"]
switch str.(type) {
case []interface{}:
if len(str.([]interface{})) >0 {
s := str.([]interface{})[0]
switch s.(type) {
case string :
return errors.New(s.(string))
}
}
}
}
}
}
return errors.New(v.Body.ImportBillResponse.ImportBillReturn)
}
}
return nil
}
func ReplaceStrWebSevice(typeIn, userName, password, slnName, dcName, language, dbType, SessionId, strJson, billType string) string {
res := ""
switch typeIn {
case "login":
res = LoginStr
res = strings.ReplaceAll(res, "userName?", userName)
res = strings.ReplaceAll(res, "password?", password)
res = strings.ReplaceAll(res, "slnName?", slnName)
res = strings.ReplaceAll(res, "dcName?", dcName)
res = strings.ReplaceAll(res, "language?", language)
res = strings.ReplaceAll(res, "dbType?", dbType)
case "logout":
res = LogoutStr
res = strings.ReplaceAll(res, "userName?", userName)
res = strings.ReplaceAll(res, "slnName?", slnName)
res = strings.ReplaceAll(res, "dcName?", dcName)
res = strings.ReplaceAll(res, "language?", language)
case "InsertParts":
res = InsertPartsStr
res = strings.ReplaceAll(res, "SessionId?", SessionId)
res = strings.ReplaceAll(res, "strJson?", strJson)
case "QureyPartsStr":
res = QureyPartsStr
res = strings.ReplaceAll(res, "SessionId?", SessionId)
res = strings.ReplaceAll(res, "strJson?", strJson)
case "InsertPartsuselaidStr":
res = InsertPartsuselaidStr
res = strings.ReplaceAll(res, "SessionId?", SessionId)
res = strings.ReplaceAll(res, "strJson?", strJson)
res = strings.ReplaceAll(res, "billType?", billType)
case "QureyBill":
res = QureyBill
res = strings.ReplaceAll(res, "SessionId?", SessionId)
res = strings.ReplaceAll(res, "strJson?", strJson)
res = strings.ReplaceAll(res, "billType?", billType)
}
return res
}