package util import ( "../logging" "bytes" "encoding/xml" "fmt" "github.com/pkg/errors" "github.com/robfig/cron" "io/ioutil" "log" "net/http" "strings" "time" "../../models" ) //eas webservice 目前使用字符串拼接的方式模拟xml发送 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" //正式环境是 XDMY ,备件先手动改为XDMY,后面全部切换正式环境后统一修改 user.DcName = "XDMY" //正式环境是 XDMY ,备件先手动改为XDMY,后面全部切换正式环境后统一修改 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() } // sessionId 获取,本次请求与上次间隔5分钟以上 就重新登录 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 EASWebServiceLogin(url string ) (string, error) { client := &http.Client{} resstr := ReplaceStrWebSevice("login", user.UserName, user.Password, user.SlnName, user.DcName, user.Language, user.DbType, "", "", "") if url == ""{ url = user.Url }else{ resstr = strings.ReplaceAll(resstr, "MASM", "XDMY") // dcname正式和测试环境不一致 } body := bytes.NewBuffer([]byte(resstr)) req, err := http.NewRequest("POST", 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,url string) error { client := &http.Client{} soapencJson, err := json.Marshal(parts) if err != nil { return err } if url == ""{ url = user.Url } println(string(soapencJson)) resstr := ReplaceStrWebSevice("InsertParts", "", "", "", "", "", "", SessionId, string(soapencJson), "") body := bytes.NewBuffer([]byte(resstr)) req, err := http.NewRequest("POST", 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 } func CronServer(){ c := cron.New() log.Println("Starting CronWXwork...") _, err := c.AddFunc("0 1 1 * *", Pastures) // 每月1号1点 _, err = c.AddFunc("1 1 1 * *", PartClass) // 每月1号1点1分 if err != nil{ log.Print("定时任务出错___",err.Error()) } c.Start() } func Pastures(){ //fmt.Println("Dingshi") tx := models.Engine.NewSession() err1 := tx.Begin() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } if tx != nil { tx.Close() } }() queryPasture,err := tx.SQL("select sum(p_r.reportery) reportery, w2.pastureId,DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime " + " from part_repertory p_r "+ " left join warehouse w2 on w2.id = p_r.locationId "+ " GROUP BY w2.pastureId ").Query().List() fmt.Println(queryPasture) if len(queryPasture)>0{ for i:=0;i0{ for i:=0;i DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') " + " GROUP BY w1.pastureId ").Query().List() fmt.Println(queryPartYcRK) if len(queryPartYcRK)>0{ for i:=0;i DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') ) "+ " GROUP BY bpu.pastureId ").Query().List() fmt.Println(queryPartYcCK) if len(queryPartYcCK)>0{ //fmt.Println("jinglaile") fmt.Printf("%T\n",queryPartYcCK[0]["yuechuchuku"]) for i:=0;i DATE_FORMAT(now(),'%Y-%m') ) "+ " GROUP BY bpu.pastureId").Query().List() // if len(queryPartYmCK)>0{ for i:=0;i DATE_FORMAT(now(),'%Y-%m') "+ " GROUP BY w1.pastureId ").Query().List() // if len(queryPartYmRK)>0{ for i:=0;i DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') "+ " GROUP BY p1.categoryId2 , w1.pastureId ").Query().List() if len(queryPartYcRK)>0{ for i:=0;i DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') ) "+ " GROUP BY bpu.pastureId,p1.categoryId2 ").Query().List() if len(queryPartYcCK)>0{ //fmt.Println("jinglaile") //fmt.Printf("%T\n",queryPartYcCK[0]["yuechuchuku"]) for i:=0;i DATE_FORMAT(now(),'%Y-%m') ) "+ "GROUP BY bpu.pastureId,p1.categoryId2 ").Query().List() if len(queryPartYmCK)>0{ for i:=0;i DATE_FORMAT(now(),'%Y-%m') GROUP BY p1.categoryId2,w1.pastureId ").Query().List() // if len(queryPartYmRK)>0{ for i:=0;i