package api import ( "../../pkg/logging" "../../pkg/util" "../../routers/restful" "encoding/json" "fmt" "github.com/Anderson-Lu/gofasion/gofasion" "github.com/gin-gonic/gin" "github.com/hequan2017/go-admin/pkg/e" "github.com/robfig/cron" "io/ioutil" "log" "net/http" "strconv" "time" "../../pkg/app" //"time" "../../pkg/setting" ) func GetDorm(c *gin.Context) { appG := app.Gin{C: c} if setting.ServerSetting.GRFD != "1"{ //格润富德 appG.Response(http.StatusOK, e.SUCCESS, nil) return } dataByte, _ := ioutil.ReadAll(c.Request.Body) fsion := gofasion.NewFasion(string(dataByte)) pastureid := fsion.Get("pastureid").ValueStr() err := GetMaterialCategory(pastureid) //饲料分类 if err != nil{ appG.Response(http.StatusOK, e.ERROR, "饲料分类同步失败:"+err.Error()) return } err = GetCowCategory(pastureid) // 牲畜类别 if err != nil{ appG.Response(http.StatusOK, e.ERROR, "牲畜类别同步失败:"+err.Error()) return } err = GetDormBar(pastureid) // 栏舍 if err != nil{ appG.Response(http.StatusOK, e.ERROR, "栏舍同步失败:"+err.Error()) return } err = GetMaterial(pastureid) //饲料 if err != nil{ appG.Response(http.StatusOK, e.ERROR, "饲料同步失败:"+err.Error()) return } err = GetFormula(pastureid) // 配方 if err != nil{ appG.Response(http.StatusOK, e.ERROR, "配方同步失败:"+err.Error()) return } appG.Response(http.StatusOK, e.SUCCESS, nil) } func GetDormBar(pastureid string)error { //appG := app.Gin{C: c} //dataByte, _ := ioutil.ReadAll(c.Request.Body) //fsion := gofasion.NewFasion(string(dataByte)) //sqlnamestr := fsion.Get("name").ValueStr() //offset := fsion.Get("offset").ValueDefaultInt(0) //pagecount := fsion.Get("pagecount").ValueDefaultInt(0) //returntype := fsion.Get("returntype").ValueDefaultStr("map") data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:88/kaps-cow/api/tmr/getDorm") if data != nil { var feedp util.Feedp json.Unmarshal(data, &feedp) status := feedp.Status feedpData := feedp.Data if status == 0 { //dataByte, _ := ioutil.ReadAll(c.Request.Body) //fsion := gofasion.NewFasion(string(dataByte)) //pastureid := fsion.Get("pastureid").ValueStr() // 开启事务 tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() //feedpData := feedpData[:10] valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,bname FROM bar WHERE pastureid = ?",pastureid).QueryString() mt := make(map[string]string) for _, v := range valuesMap { mt[v["bname"]] = v["backup2"] } ise := false for _, val := range feedpData { penId := val.PenId penName := val.PenName cowCount := val.CowCount ccountRatio := val.CcountRatio //createdAt := val.CreatedAt modifiedAt := val.ModifiedAt isexec := false if _,ok :=mt[penName]; ok{ if mt[penName] == modifiedAt{ continue } }else{ isexec = true } ise = true fmt.Println(penId, penName, cowCount, ccountRatio,modifiedAt,mt[penName]) ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into bar(id,pastureid,backup1,backup2,bname,enable) "+ " values(?,?,?,?,?,0)"+ " ON DUPLICATE KEY UPDATE backup1=?,backup2=?", ids, pastureid, penId,modifiedAt, penName,penId,modifiedAt) if err != nil { return err } //_, err = tx.Exec("insert into feedp(id,pastureid,barid,barname,ccount,ratio,ccountratio) "+ // " values(?,?,(select id from bar where pastureid=? and bname=?),?,(if(?='',0,?)),REPLACE(?,'%',''),REPLACE(?,'%','')*(if(?='',0,?)))"+ // " ON DUPLICATE KEY UPDATE barname=?,ccount=(if(?='',0,?)),ratio=REPLACE(?,'%',''),ccountratio=REPLACE(?,'%','')*(if(?='',0,?))", // ids, pastureid, pastureid, penName, penName, cowCount, cowCount, ccountRatio, ccountRatio, cowCount, cowCount, penName, // cowCount, cowCount, ccountRatio, ccountRatio, cowCount, cowCount) if isexec{ //不配置配方,不去新增feedp _, err = tx.Exec(`UPDATE feedp set ccount=(if(?='',0,?)),ratio=REPLACE(?,'%',''),ccountratio=REPLACE(?,'%','')*(if(?='',0,?))/100 where barid = (select id from bar where pastureid=? and bname=?) and pastureid = ?`, cowCount, cowCount, ccountRatio, ccountRatio, cowCount, cowCount, pastureid,penName,pastureid) if err != nil { return err } _, err = tx.Exec(`UPDATE fpdetail fpd JOIN feedp fp ON fp.pastureid = fpd.pastureid AND fp.barid =fpd.barid SET fpd.weight = weight *(fp.ccount*fp.ratio/fpd.cowcount/fpd.ccountradio) WHERE fpd.pastureid = ? and barid =(select id from bar where pastureid=? and bname=?)`,pastureid,pastureid,penName) if err != nil { return err } _, err = tx.Exec("call updateLPPbyFPChange((select id from bar where pastureid=? and bname=?),?)",pastureid,penName,pastureid) if err != nil { return err } } } if ise{ _, err = tx.Exec(`UPDATE fpdetail fpd JOIN feedp fp ON fp.pastureid = fpd.pastureid AND fp.barid =fpd.barid SET fp.feedweight = fp.feedweight *(fp.ccount*fp.ratio/fpd.cowcount/fpd.ccountradio), fp.ftweight = fp.ftweight *(fp.ccount*fp.ratio/fpd.cowcount/fpd.ccountradio), fpd.ccountradio =fp.ratio , fpd.cowcount =fp.ccount WHERE fpd.pastureid = ? `,pastureid) if err != nil { return err } } } } return nil } func GetMaterial(pastureid string) error{ data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:88/kaps-cow/api/tmr/getMaterial") if data != nil { var feed util.Feed json.Unmarshal(data, &feed) status := feed.Status feedpData := feed.Data if status == 0 { // 开启事务 tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,fname FROM feed WHERE pastureid = ?",pastureid).QueryString() mt := make(map[string]string) for _, v := range valuesMap { mt[v["fname"]] = v["backup2"] } for _, val := range feedpData { fId := val.FId fName := val.FName price := val.Price dryMatter := val.DryMatter //autoChange := val.AutoChange //allowDev := val.AllowDev feedclassName := val.FeedclassName createdAt := val.CreatedAt modifiedAt := val.ModifiedAt if _,ok :=mt[fName]; ok{ if mt[fName] == modifiedAt{ continue } } fmt.Println(fName, feedclassName, createdAt, modifiedAt) ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into feed(id,pastureid,backup1,backup2,fname,fclass,fclassid,uprice,dry) "+ " values(?,?,?,?,?,?,(select id from feedclass where fcname=? and pastureid=?),(if(?='',0,?)),(if(?='' or ?='~',0,?)))"+ " ON DUPLICATE KEY UPDATE backup1=?,backup2=?,fname=?,fclass=?,fclassid=(select id from feedclass where fcname=? and pastureid=?),uprice=(if(?='',0,?)),dry=(if(?='' or ?='~',0,?))", ids, pastureid, fId,modifiedAt, fName, feedclassName, feedclassName, pastureid, price, price, dryMatter, dryMatter, dryMatter, fId,modifiedAt, fName, feedclassName, feedclassName, pastureid, price, price, dryMatter, dryMatter, dryMatter) if err != nil { return err } } } } return nil } func GetMaterialCategory(pastureid string)error { data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:88/kaps-cow/api/tmr/getMaterialCategory") if data != nil { var feedClass util.FeedClass json.Unmarshal(data, &feedClass) status := feedClass.Status feedpData := feedClass.Data if status == 0 { //dataByte, _ := ioutil.ReadAll(c.Request.Body) //fsion := gofasion.NewFasion(string(dataByte)) //pastureid := fsion.Get("pastureid").ValueStr() // 开启事务 tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() for _, val := range feedpData { feedclassName := val.FeedclassName feedclassId := val.FeedclassId createdAt := val.CreatedAt modifiedAt := val.ModifiedAt fmt.Println(feedclassId, feedclassName, createdAt, modifiedAt) ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into feedclass(id,pastureid,fcname,backup1,bigfeedclassid,bigfeedclassname,sort,`enable`) values(?,?,?,?,?,?,?,?)"+ " ON DUPLICATE KEY UPDATE fcname=?,backup1=?", ids, pastureid, feedclassName, feedclassId, 3, "精粗各半", 0, 1, feedclassName, feedclassId) if err != nil { return err } } } } return nil } func GetCowCategory(pastureid string)error { data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:88/kaps-cow/api/tmr/getCowCategory") if data != nil { var cowClass util.CowClass json.Unmarshal(data, &cowClass) status := cowClass.Status feedpData := cowClass.Data if status == 0 { //dataByte, _ := ioutil.ReadAll(c.Request.Body) //fsion := gofasion.NewFasion(string(dataByte)) //pastureid := fsion.Get("pastureid").ValueStr() // 开启事务 tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() for _, val := range feedpData { cowClassCode := val.CowClassCode cowClassName := val.CowClassName createdAt := val.CreatedAt modifiedAt := val.ModifiedAt fmt.Println(cowClassCode, cowClassName, createdAt, modifiedAt) ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into cowclass(id,pastureid,backup1,classname) values(?,?,?,?)"+ " ON DUPLICATE KEY UPDATE backup1=?,classname=?", ids, pastureid, cowClassCode, cowClassName, cowClassCode, cowClassName) if err != nil { return err } } } } return nil } func GetFormula(pastureid string)error { data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:88/kaps-cow/api/tmr/getFormula") if data != nil { var feedTemplet util.FeedTemplet json.Unmarshal(data, &feedTemplet) status := feedTemplet.Status feedpData := feedTemplet.Data if status == 0 { //dataByte, _ := ioutil.ReadAll(c.Request.Body) //fsion := gofasion.NewFasion(string(dataByte)) //pastureid := fsion.Get("pastureid").ValueStr() // 开启事务 tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,tname FROM feedtemplet WHERE pastureid = ?",pastureid).QueryString() mt := make(map[string]string) for _, v := range valuesMap { mt[v["tname"]] = v["backup2"] } for _, val := range feedpData { ftId := val.FtId ftName := val.FtName feedList := val.FeedList //createdAt := val.CreatedAt modifiedAt := val.ModifiedAt if _,ok :=mt[ftName]; ok{ if mt[ftName] == modifiedAt{ continue } } ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into feedtemplet(id,pastureid,ccid,backup1,backup2,tname,fttypeid,fttype) values(?,?,null,?,?,?,1,'饲喂配方')"+ " ON DUPLICATE KEY UPDATE backup1=?,tname=?,backup2= ?", ids, pastureid, ftId,modifiedAt, ftName, ftId, ftName,modifiedAt) if err != nil { return err } tx.Exec("delete from ftdetail where ftid=(select id from feedtemplet where pastureid=? and tname=?)",pastureid, ftName) for _, val := range feedList { fId := val.FId fName := val.FName fodderWeight := val.FodderWeight mixNo := val.MixNo ids, err := setting.SnowIds.NextId() if err != nil { ids = time.Now().UnixNano() logging.Info("create SnowIds err", err) } _, err = tx.Exec("insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort) "+ " values(?,?,(select id from feedtemplet where pastureid=? and tname=? limit 1),(select id from feed where pastureid=? and backup1=? limit 1),?,(if(?='',0,?)),(if(?='',0,?)))" + "ON DUPLICATE KEY UPDATE fweight=(if(?='',0,?)),sort=(if(?='',0,?))", ids, pastureid, pastureid, ftName, pastureid, fId, fName, fodderWeight, fodderWeight, mixNo, mixNo,fodderWeight,fodderWeight, mixNo, mixNo) if err != nil { return err } _, err = tx.Exec("call updateFPbyFTChange((select id from feedtemplet where pastureid=? and tname=? limit 1),?,(select fttypeid from feedtemplet where pastureid=? and tname=? limit 1))",pastureid,ftName,pastureid,pastureid,ftName) if err != nil { return err } } } } } return nil } func AddOtherDevice() { tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() queryIdList, err1 := tx.SQL("select d.id,d.projname projName from downloadedplan d where d.mydate=date_format(NOW(),'%Y-%m-%d') and iscompleted=1 and d.isuse=0 " + " and d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch' AND column_name = 'pastureid') ").Query().List() queryDataList, err2 := tx.SQL("select d.id id,d.projname projName,round(d.lweight,2) lWeight,date_format(d.mydate,'%Y-%m-%d') as loadDate,d.SORT as tmrNo,d.Times as times,ft.backup1 as ftId,d.templetName as ftName,f.backup1 as fId,"+ " de.Fname as fName,fc.FCNAME as feedclassName,de.SORT as sort,de.feedallowratio as allowableError, "+ " cast(ifnull(de.LWEIGHT,0) as decimal(10,2)) as expWeight,cast(ifnull(de.ActualWeightMinus,0) as decimal(10,2)) as actualWeight,"+ " date_format(de.intime,'%Y-%m-%d %H:%i:%s') as endTime ,d.tmrtname as tName ,'' dName "+ " from downloadedplan d LEFT JOIN downloadplandtl1 de on d.id=de.PID and d.pastureid=de.pastureid "+ " LEFT JOIN feed f on de.fid=f.id and f.pastureid=d.pastureid LEFT JOIN feedtemplet ft on d.tempid=ft.id and ft.pastureid=d.pastureid "+ " LEFT JOIN feedclass fc on f.fclassid=fc.id and fc.pastureid=d.pastureid "+ " where d.mydate=date_format(NOW(),'%Y-%m-%d') and iscompleted=1 and d.isuse=0 " + " and d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch' AND column_name = 'pastureid') ").Query().List() if err1 == nil && err2 == nil { for i := 0; i < len(queryIdList); i++ { id := queryIdList[i]["id"] projName := queryIdList[i]["projName"] listData := make(map[string]interface{}) listData["farmId"] = 4090 listData["id"] = id listData["projName"] = projName feedList := []interface{}{} for j := 0; j < len(queryDataList); j++ { id2 := queryDataList[j]["id"] if id == id2 { dataList := make(map[string]interface{}) dataList["tmrNo"] = queryDataList[j]["tmrNo"] dataList["times"] = queryDataList[j]["times"] dataList["loadDate"] = queryDataList[j]["loadDate"] dataList["ftId"] = queryDataList[j]["ftId"] dataList["ftName"] = queryDataList[j]["ftName"] dataList["fId"] = queryDataList[j]["fId"] dataList["tName"] = queryDataList[j]["tName"] dataList["feedclassName"] = queryDataList[j]["feedclassName"] dataList["fName"] = queryDataList[j]["fName"] dataList["sort"] = queryDataList[j]["sort"] dataList["allowableError"] = queryDataList[j]["allowableError"] expWeight, _ := strconv.ParseFloat(queryDataList[j]["expWeight"].(string), 64) actualWeight, _ := strconv.ParseFloat((queryDataList[j]["actualWeight"]).(string), 64) lWeight, _ := strconv.ParseFloat(queryDataList[j]["lWeight"].(string), 64) dataList["expWeight"] = expWeight dataList["actualWeight"] = actualWeight dataList["lWeight"] = lWeight dataList["endTime"] = queryDataList[j]["endTime"] dataList["dName"] = queryDataList[j]["dName"] feedList = append(feedList, dataList) } } listData["data"] = feedList jsonStr, _ := json.Marshal(listData) postData := make(map[string]string) postData["formData"] = string(jsonStr) err = util.PostWithFormData("POST", "http://120.48.30.31:88/kaps-cow/api/tmr/addOtherDevice", &postData) if err != nil{ fmt.Println("AddOtherDevice err:",err) logging.Error("AddOtherDevice err:",err) } } } } func AddOtherDeviceFeeding() { tx := restful.Engine.NewSession() err := tx.Begin() defer func() { switch { case err != nil: logging.Error("tx.Begin 事务启动失败__error:", err) if tx != nil { tx.Rollback() } default: if tx != nil { err = tx.Commit() } } if tx != nil { tx.Close() } }() queryIdList, err1 := tx.SQL("select d.id,d.projname projName from downloadedplan d where d.mydate=date_format(NOW(),'%Y-%m-%d') and iscompleted=1 and d.isuse=0 " + " and d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch' AND column_name = 'pastureid')").Query().List() queryDataList, err2 := tx.SQL("SELECT d.id id,d.projname projName,date_format(d.mydate,'%Y-%m-%d') as dropDate,d.Times as times,d.SORT as tmrNo,"+ " bar.backup1 as penId,d2.fname as penName,fp.CCOUNT as cowCount, d2.SORT as sort,d.templetName ftName, ft.backup1 ftId,"+ " ifnull(d2.LWEIGHT,0) as expWeight,d2.ActualWeightMinus as actualWeight,date_format(d2.intime,'%Y-%m-%d %H:%i:%s') as endTime,d.tmrtname as tName,'' dName "+ " from downloadedplan d LEFT JOIN downloadplandtl2 d2 on d.id=d2.PID and d.pastureid=d2.pastureid "+ " LEFT JOIN bar on d2.fbarid=bar.id and bar.pastureid=d2.pastureid LEFT JOIN feedp fp on d2.fbarid=fp.barid and fp.pastureid=d2.pastureid "+ " LEFT JOIN feedtemplet ft on d.tempid=ft.id and ft.pastureid=d.pastureid "+ " where d.mydate=date_format(NOW(),'%Y-%m-%d') and iscompleted=1 and d.isuse=0 " + " and d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch' AND column_name = 'pastureid') ").Query().List() if err1 == nil && err2 == nil { for i := 0; i < len(queryIdList); i++ { id := queryIdList[i]["id"] projName := queryIdList[i]["projName"] listData := make(map[string]interface{}) listData["farmId"] = 4090 listData["id"] = id listData["projName"] = projName feedList := []interface{}{} for j := 0; j < len(queryDataList); j++ { id2 := queryDataList[j]["id"] if id == id2 { dataList := make(map[string]interface{}) dataList["dropDate"] = queryDataList[j]["dropDate"] dataList["times"] = queryDataList[j]["times"] dataList["tmrNo"] = queryDataList[j]["tmrNo"] dataList["tName"] = queryDataList[j]["tName"] dataList["dName"] = queryDataList[j]["dName"] expWeight, _ := strconv.ParseFloat(queryDataList[j]["expWeight"].(string), 64) actualWeight, _ := strconv.ParseFloat((queryDataList[j]["actualWeight"]).(string), 64) dataList["expWeight"] = expWeight dataList["actualWeight"] = actualWeight dataList["endTime"] = queryDataList[j]["endTime"] dataList["penId"] = queryDataList[j]["penId"] dataList["penName"] = queryDataList[j]["penName"] dataList["cowCount"] = queryDataList[j]["cowCount"] dataList["sort"] = queryDataList[j]["sort"] dataList["ftId"] = queryDataList[j]["ftId"] dataList["ftName"] = queryDataList[j]["ftName"] feedList = append(feedList, dataList) } } listData["data"] = feedList jsonStr, _ := json.Marshal(listData) postData := make(map[string]string) postData["formData"] = string(jsonStr) err = util.PostWithFormData("POST", "http://120.48.30.31:88/kaps-cow/api/tmr/addOtherDeviceFeeding", &postData) if err != nil{ fmt.Println("AddOtherDeviceFeeding err:",err) logging.Error("AddOtherDeviceFeeding err:",err) }else { _,err = tx.Exec(`update downloadedplan set isuse=1 where mydate=date_format(NOW(),'%Y-%m-%d') and iscompleted=1 and isuse=0 and pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch' AND column_name = 'pastureid') `) if err != nil{ logging.Error("update downloadedplan err:",err) } } } } //data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:86/kaps-cow/api/tmr/getMaterial") } func PostTmrData(){ defer func() { // 必须要先声明defer if err := recover(); err != nil { fmt.Printf("CronTest pnic err%+v \n", err) logging.Error("panic recover err ", err) //println("pnic err",err.(error).Error()) // 这里的err其实就是panic传入的内容,55 } }() println("开始执行") AddOtherDevice() AddOtherDeviceFeeding() } func CronGRFD() { defer func() { // 必须要先声明defer if err := recover(); err != nil { fmt.Printf("CronTest pnic err%+v \n", err) logging.Error("panic recover err ", err) } }() log.Println("Starting CronWXwork...") c := cron.New() _, err := c.AddFunc("0/3 * * * *", PostTmrData) //* * * * *, 从分钟开始 每5分钟 if err != nil { println("cron4 err", err.Error()) } c.Start() }