package util import ( "bytes" "encoding/xml" "fmt" "io/ioutil" "log" "net/http" "strings" "time" "github.com/pkg/errors" "github.com/robfig/cron" "kpt.xdmy/apiserver/routers/restful" "kpt.xdmy/pkg/logging" ) //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正式和测试环境不一致 } log.Default().Println("resstr:", resstr) 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 CronWXworkkpt.xdmy/pkg.") 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, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() queryPasture, err := restful.MapStrListTx(tx, "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 ") fmt.Println(queryPasture) if len(queryPasture) > 0 { for i := 0; i < len(queryPasture); i++ { reportery := queryPasture[i]["reportery"] pastureId := queryPasture[i]["pastureId"] dateTime := queryPasture[i]["dateTime"] _, err = tx.Exec("insert into inventory_temporary(currentInventory,pastureId,inventoryDate) VALUES(?,?,?)", reportery, pastureId, dateTime) } } go YuechuRuku() go Yuechuchuku() go Yuemochuku() go Yuemoruku() if err != nil { logging.Error("查询当前的不同牧场的库存__error:", err.Error()) } } func PartClass() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() queryPasture, err := restful.MapStrListTx(tx, "select sum(pr.reportery) reportery,ps.categoryId2,w2.pastureId,DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime "+ " from part_repertory pr "+ " left join warehouse w2 on w2.id = pr.locationId "+ " INNER JOIN parts ps ON ps.id = pr.partId "+ " GROUP BY ps.categoryId2,w2.pastureId") if len(queryPasture) > 0 { for i := 0; i < len(queryPasture); i++ { reportery := queryPasture[i]["reportery"] pastureId := queryPasture[i]["pastureId"] categoryId2 := queryPasture[i]["categoryId2"] dateTime := queryPasture[i]["dateTime"] _, err = tx.Exec("insert into inventory_temporary(currentInventory,pastureId,inventoryDate,partClassId) VALUES(?,?,?,?)", reportery, pastureId, dateTime, categoryId2) } } go YuechuPasture() go YuechuchukuPasture() go YuemochukuPasture() go YuemorukuPasture() if err != nil { fmt.Println(err.Error()) } } func YuechuRuku() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() // 用于月初入库的备件数量根据牧场 queryPartYcRK, err := restful.MapStrListTx(tx, "select sum(storageAmount) yuechusum,w1.pastureId,DATE_FORMAT(DATE_SUB(now()"+ " ,INTERVAL 1 MONTH),'%Y-%m') dateTime from partlaid pl "+ " inner JOIN bigpartlaid bpl ON bpl.`id` = pl.`bigId` left join warehouse w1 on w1.id = pl.locationId "+ " where DATE_FORMAT(bpl.storageTime,'%Y-%m') > DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') "+ " GROUP BY w1.pastureId ") fmt.Println(queryPartYcRK) if len(queryPartYcRK) > 0 { for i := 0; i < len(queryPartYcRK); i++ { yuechusum := queryPartYcRK[i]["yuechusum"] pastureId := queryPartYcRK[i]["pastureId"] dateTime := queryPartYcRK[i]["dateTime"] _, err = tx.Exec("update inventory_temporary set beginningInventoryRK = ? where pastureId =? and inventoryDate =? and partClassId is null", yuechusum, pastureId, dateTime) } } if err != nil { fmt.Println(err.Error()) } } func Yuechuchuku() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月初出库的备件数量根据牧场 queryPartYcCK, err := restful.MapStrListTx(tx, "select sum(pu.`checkoutNumber` - pu.`quitNumber`) yuechuchuku, bpu.pastureId,"+ " DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime from partuse pu "+ " inner JOIN bigpartuse bpu ON pu.`bigId` =bpu.`id` "+ " where (DATE_FORMAT(bpu.receiveTime,'%Y-%m') > DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') ) "+ " GROUP BY bpu.pastureId ") fmt.Println(queryPartYcCK) if len(queryPartYcCK) > 0 { //fmt.Println("jinglaile") fmt.Printf("%T\n", queryPartYcCK[0]["yuechuchuku"]) for i := 0; i < len(queryPartYcCK); i++ { yuechuchuku := queryPartYcCK[i]["yuechuchuku"] pastureId := queryPartYcCK[i]["pastureId"] dateTime := queryPartYcCK[i]["dateTime"] fmt.Println(pastureId) _, err = tx.Exec("update inventory_temporary set beginningInventoryCK = ? where pastureId =? and inventoryDate =? and partClassId is null", yuechuchuku, pastureId, dateTime) } } if err != nil { fmt.Println(err.Error()) } } func Yuemochuku() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月末出库的备件数量根据牧场 queryPartYmCK, err := restful.MapStrListTx(tx, "select sum(pu.`checkoutNumber` - pu.`quitNumber`) yumochuku, bpu.pastureId ,"+ " DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime "+ "from partuse pu "+ " inner JOIN bigpartuse bpu ON pu.`bigId` =bpu.`id` where (DATE_FORMAT(bpu.receiveTime,'%Y-%m') > DATE_FORMAT(now(),'%Y-%m') ) "+ " GROUP BY bpu.pastureId") // if len(queryPartYmCK) > 0 { for i := 0; i < len(queryPartYmCK); i++ { yumochuku := queryPartYmCK[i]["yumochuku"] pastureId := queryPartYmCK[i]["pastureId"] dateTime := queryPartYmCK[i]["dateTime"] _, err = tx.Exec("update inventory_temporary set endInventoryCK = ? where pastureId =? and inventoryDate =? and partClassId is null", yumochuku, pastureId, dateTime) } } if err != nil { fmt.Println(err.Error()) } } func Yuemoruku() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月末入库的备件数量根据牧场 queryPartYmRK, err := restful.MapStrListTx(tx, "select sum(storageAmount)yumoruku,w1.pastureId, DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') "+ " from partlaid pl inner JOIN bigpartlaid bpl ON bpl.`id` = pl.`bigId` left join warehouse w1 on w1.id = pl.locationId "+ " where DATE_FORMAT(bpl.storageTime,'%Y-%m') > DATE_FORMAT(now(),'%Y-%m') "+ " GROUP BY w1.pastureId ") // if len(queryPartYmRK) > 0 { for i := 0; i < len(queryPartYmRK); i++ { yumoruku := queryPartYmRK[i]["yumoruku"] pastureId := queryPartYmRK[i]["pastureId"] dateTime := queryPartYmRK[i]["dateTime"] _, err = tx.Exec("update inventory_temporary set endInventoryRK = ? where pastureId =? and inventoryDate =? and partClassId is null ", yumoruku, pastureId, dateTime) } } if err != nil { fmt.Println(err.Error()) } } func YuechuPasture() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() // 用于月初入库的备件数量根据牧场 queryPartYcRK, err := restful.MapStrListTx(tx, " select sum(storageAmount) storageAmount,p1.categoryId2,w1.pastureId,DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime "+ "from partlaid pl inner JOIN bigpartlaid bpl ON bpl.`id` = pl.`bigId` left join parts p1 on p1.id = pl.partId left join warehouse w1 "+ " on w1.id = pl.locationId "+ " where DATE_FORMAT(bpl.storageTime,'%Y-%m') > DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') "+ " GROUP BY p1.categoryId2 , w1.pastureId ") if len(queryPartYcRK) > 0 { for i := 0; i < len(queryPartYcRK); i++ { storageAmount := queryPartYcRK[i]["storageAmount"] pastureId := queryPartYcRK[i]["pastureId"] dateTime := queryPartYcRK[i]["dateTime"] categoryId2 := queryPartYcRK[i]["categoryId2"] _, err = tx.Exec("update inventory_temporary set beginningInventoryRK = ? where pastureId =? and inventoryDate =? and partClassId =?", storageAmount, pastureId, dateTime, categoryId2) } } if err != nil { fmt.Println(err.Error()) } } func YuechuchukuPasture() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月初出库的备件数量根据牧场 queryPartYcCK, err := restful.MapStrListTx(tx, "select sum(pu.`checkoutNumber` - pu.`quitNumber`) yuechuchuku,bpu.pastureId, "+ "p1.categoryId2,DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') dateTime from partuse pu "+ " inner JOIN bigpartuse bpu ON pu.`bigId` =bpu.`id` left join parts p1 on p1.id = pu.partId "+ " where (DATE_FORMAT(bpu.receiveTime,'%Y-%m') > DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 MONTH),'%Y-%m') ) "+ " GROUP BY bpu.pastureId,p1.categoryId2 ") if len(queryPartYcCK) > 0 { //fmt.Println("jinglaile") //fmt.Printf("%T\n",queryPartYcCK[0]["yuechuchuku"]) for i := 0; i < len(queryPartYcCK); i++ { yuechuchuku := queryPartYcCK[i]["yuechuchuku"] pastureId := queryPartYcCK[i]["pastureId"] dateTime := queryPartYcCK[i]["dateTime"] categoryId2 := queryPartYcCK[i]["categoryId2"] fmt.Println(pastureId) _, err = tx.Exec("update inventory_temporary set beginningInventoryCK = ? where pastureId =? and inventoryDate =? and partClassId =?", yuechuchuku, pastureId, dateTime, categoryId2) } } if err != nil { fmt.Println(err.Error()) } } func YuemochukuPasture() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月末出库的备件数量根据牧场 queryPartYmCK, err := restful.MapStrListTx(tx, "select sum(pu.`checkoutNumber` - pu.`quitNumber`) yumochuku,bpu.pastureId, "+ " p1.categoryId2,DATE_FORMAT(now(),'%Y-%m') dateTime "+ " from partuse pu inner JOIN bigpartuse bpu ON pu.`bigId` =bpu.`id` left join parts p1 on p1.id = pu.partId "+ " where (DATE_FORMAT(bpu.receiveTime,'%Y-%m') > DATE_FORMAT(now(),'%Y-%m') ) "+ "GROUP BY bpu.pastureId,p1.categoryId2 ") if len(queryPartYmCK) > 0 { for i := 0; i < len(queryPartYmCK); i++ { yumochuku := queryPartYmCK[i]["yumochuku"] pastureId := queryPartYmCK[i]["pastureId"] dateTime := queryPartYmCK[i]["dateTime"] categoryId2 := queryPartYmCK[i]["categoryId2"] _, err = tx.Exec("update inventory_temporary set endInventoryCK = ? where pastureId =? and inventoryDate =? and partClassId =?", yumochuku, pastureId, dateTime, categoryId2) } } if err != nil { fmt.Println(err.Error()) } } func YuemorukuPasture() { tx, err1 := restful.Dbs.Beginx() defer func() { switch { case err1 != nil: println("tx.Begin 事务启动失败__error:", err1.Error()) if tx != nil { tx.Rollback() } default: if tx != nil { err1 = tx.Commit() } } }() //// 用于月末入库的备件数量根据牧场 queryPartYmRK, err := restful.MapStrListTx(tx, "select sum(storageAmount) yumoruku, p1.categoryId2,w1.pastureId , DATE_FORMAT(now(),'%Y-%m') dateTime"+ " from partlaid pl inner JOIN bigpartlaid bpl "+ " ON bpl.`id` = pl.`bigId` left join warehouse w1 on w1.id = pl.locationId left join parts p1 on p1.id = pl.partId "+ " where DATE_FORMAT(bpl.storageTime,'%Y-%m') > DATE_FORMAT(now(),'%Y-%m') GROUP BY p1.categoryId2,w1.pastureId ") // if len(queryPartYmRK) > 0 { for i := 0; i < len(queryPartYmRK); i++ { yumoruku := queryPartYmRK[i]["yumoruku"] pastureId := queryPartYmRK[i]["pastureId"] dateTime := queryPartYmRK[i]["dateTime"] categoryId2 := queryPartYmRK[i]["categoryId2"] _, err = tx.Exec("update inventory_temporary set endInventoryRK = ? where pastureId =? and inventoryDate =? and partClassId=? ", yumoruku, pastureId, dateTime, categoryId2) } } if err != nil { fmt.Println(err.Error()) } }