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 }