|
@@ -0,0 +1,468 @@
|
|
|
+package api
|
|
|
+
|
|
|
+import (
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "../../pkg/app"
|
|
|
+ "../../pkg/e"
|
|
|
+ "../../pkg/logging"
|
|
|
+ "../../pkg/setting"
|
|
|
+ "../../routers/restful"
|
|
|
+
|
|
|
+ "github.com/Anderson-Lu/gofasion/gofasion"
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
+ "github.com/xormplus/xorm"
|
|
|
+)
|
|
|
+
|
|
|
+type feedtemplet struct {
|
|
|
+ Id int64 `xorm:"id"`
|
|
|
+ Ccname string `xorm:"ccname"`
|
|
|
+ Cname string `xorm:"tname"`
|
|
|
+}
|
|
|
+
|
|
|
+type tmrStruct struct {
|
|
|
+ Id int64 `xorm:"id"`
|
|
|
+ Tname string `xorm:"tname"`
|
|
|
+ Maxstirfeed float64 `xorm:"maxstirfeed"`
|
|
|
+}
|
|
|
+
|
|
|
+type lpplanStruct struct {
|
|
|
+ Id int64 `xorm:"id"`
|
|
|
+ Tmrname string `xorm:"tmrname"`
|
|
|
+ Tmrid int64 `xorm:"tmrid"`
|
|
|
+ Sort int64 `xorm:"sort"`
|
|
|
+ Sel int64 `xorm:"sel"`
|
|
|
+ Times int64 `xorm:"times"`
|
|
|
+ Ftname string `xorm:"ftname"`
|
|
|
+ Ftid int64 `xorm:"ftid"`
|
|
|
+ Maxweight float64 `xorm:"maxweight"`
|
|
|
+ Sumweight float64 `xorm:"sumweight"`
|
|
|
+ Sumcowcount int64 `xorm:"sumcowcount"`
|
|
|
+ Pastureid string `xorm:"pastureid"`
|
|
|
+}
|
|
|
+
|
|
|
+type sysopt struct {
|
|
|
+ Inforvalue int `xorm:"inforvalue"`
|
|
|
+}
|
|
|
+
|
|
|
+type lpplanQueryInfo struct {
|
|
|
+ Pastureid int64 `xorm:"pastureid"`
|
|
|
+ Lppid int64 `xorm:"id"`
|
|
|
+ Maxweight float64 `xorm:"maxweight"`
|
|
|
+ Lweight float64 `xorm:"lweight"`
|
|
|
+ Lweighthis float64 `xorm:"lweighthis"`
|
|
|
+ Barid int64 `xorm:"barid"`
|
|
|
+ Barname string `xorm:"barname"`
|
|
|
+ Sort int64 `xorm:"sort"`
|
|
|
+ Tmrid int64 `xorm:"tmrid"`
|
|
|
+ Tmrname string `xorm:"tmrname"`
|
|
|
+ Cowcount int64 `xorm:"cowcount"`
|
|
|
+ Ccountradio float64 `xorm:"ccountradio"`
|
|
|
+ Background string `xorm:"background"`
|
|
|
+ Times int64 `xorm:"times"`
|
|
|
+ Ftid int64 `xorm:"ftid"`
|
|
|
+}
|
|
|
+
|
|
|
+type fpdetailQueryInfo struct {
|
|
|
+ Fpdid int64 `xorm:"fpdid"`
|
|
|
+ Ptsuse float64 `xorm:"ptsuse"`
|
|
|
+ Ptuse float64 `xorm:"ptuse"`
|
|
|
+ Weight float64 `xorm:"weight"`
|
|
|
+ Barid int64 `xorm:"barid"`
|
|
|
+ Barname string `xorm:"barname"`
|
|
|
+ Cowcount int64 `xorm:"cowcount"`
|
|
|
+ Ccountradio float64 `xorm:"ccountradio"`
|
|
|
+}
|
|
|
+
|
|
|
+type lpplandtl1 struct {
|
|
|
+ Pastureid int64 `xorm:"pastureid"`
|
|
|
+ Lppid int64 `xorm:"lppid"`
|
|
|
+ Barid int64 `xorm:"barid"`
|
|
|
+ Barname string `xorm:"barname"`
|
|
|
+ Fpdid int64 `xorm:"fpdid"`
|
|
|
+ Fttype int64 `xorm:"fttype"`
|
|
|
+ Lweight float64 `xorm:"lweight"`
|
|
|
+ Sort int64 `xorm:"sort"`
|
|
|
+ Tmrid int64 `xorm:"tmrid"`
|
|
|
+ Tmrname string `xorm:"tmrname"`
|
|
|
+ Cowcount int64 `xorm:"cowcount"`
|
|
|
+ Ccountradio float64 `xorm:"ccountradio"`
|
|
|
+ Background string `xorm:"background"`
|
|
|
+ Lweighthis float64 `xorm:"lweighthis"`
|
|
|
+}
|
|
|
+
|
|
|
+//撒料计划 自动生成
|
|
|
+func Autogeneration(c *gin.Context) {
|
|
|
+ appG := app.Gin{C: c}
|
|
|
+ dataByte, _ := ioutil.ReadAll(c.Request.Body)
|
|
|
+ fsion := gofasion.NewFasion(string(dataByte))
|
|
|
+ pastureid := fsion.Get("pastureid").ValueStr()
|
|
|
+ typeIN := fsion.Get("type").ValueInt64()
|
|
|
+
|
|
|
+ tx := restful.Engine.NewSession()
|
|
|
+ feedtempletlist, err := getfeedtemplet(pastureid, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ tmrlist, err := gettmr(pastureid, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ times, err := gettimes(pastureid, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ lpplanlist, err := getLpplanlist(pastureid, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // var wg sync.WaitGroup
|
|
|
+ // wg.Add(len(feedtempletlist))
|
|
|
+ for _, tem := range feedtempletlist {
|
|
|
+
|
|
|
+ // go func(tem *feedtemplet) {
|
|
|
+ // defer wg.Done()
|
|
|
+ count, err := getLpplanCount(tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, tmr := range tmrlist {
|
|
|
+ for i := 1; i <= times; i++ {
|
|
|
+ exist := false
|
|
|
+ for _, lpp := range lpplanlist {
|
|
|
+
|
|
|
+ // session.Where("pastureid = ? ", pastureid)
|
|
|
+ // session.Where("times = ? ", times)
|
|
|
+ // session.Where("tmrid = ? ", tmrid)
|
|
|
+ // session.Where("ftid = ? ", ftid)
|
|
|
+ if lpp.Tmrid == tmr.Id && lpp.Times == int64(i) && lpp.Ftid == tem.Id {
|
|
|
+ exist = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // exist, err := getLpplanExist(tmr.Id, tem.Id, i, pastureid, tx)
|
|
|
+ // if err != nil {
|
|
|
+ // appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ if !exist {
|
|
|
+ ids, err := setting.SnowIds.NextId()
|
|
|
+ if err != nil {
|
|
|
+ ids = time.Now().UnixNano()
|
|
|
+ logging.Info("create SnowIds err", err)
|
|
|
+ }
|
|
|
+ count++
|
|
|
+ lpplan := &lpplanStruct{
|
|
|
+ Id: ids,
|
|
|
+ Tmrname: tmr.Tname,
|
|
|
+ Tmrid: tmr.Id,
|
|
|
+ Sort: count,
|
|
|
+ Sel: 1,
|
|
|
+ Times: int64(i),
|
|
|
+ Ftname: tem.Cname,
|
|
|
+ Ftid: tem.Id,
|
|
|
+ Maxweight: tmr.Maxstirfeed,
|
|
|
+ Sumweight: 0,
|
|
|
+ Sumcowcount: 0,
|
|
|
+ Pastureid: pastureid,
|
|
|
+ }
|
|
|
+ err = addLpplan(lpplan, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // }(tem)
|
|
|
+ }
|
|
|
+
|
|
|
+ go func(typeIN int64, pastureid string, tx *xorm.Session) {
|
|
|
+ err = autogeneration(typeIN, pastureid, tx)
|
|
|
+ if err != nil {
|
|
|
+ appG.Response(http.StatusOK, e.ERROR, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }(typeIN, pastureid, tx)
|
|
|
+ appG.Response(http.StatusOK, e.SUCCESS, true)
|
|
|
+}
|
|
|
+
|
|
|
+//查看配方模板
|
|
|
+func getfeedtemplet(pastureid string, tx *xorm.Session) ([]*feedtemplet, error) {
|
|
|
+ data := make([]*feedtemplet, 0)
|
|
|
+ err := tx.Table("feedtemplet").Select("id,ccname,tname").Where("pastureid = ? ", pastureid).Find(&data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("getfeedtemplet-error", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return data, nil
|
|
|
+}
|
|
|
+
|
|
|
+//查看tmr设备
|
|
|
+func gettmr(pastureid string, tx *xorm.Session) ([]*tmrStruct, error) {
|
|
|
+ data := make([]*tmrStruct, 0)
|
|
|
+ session := tx.Table("tmr")
|
|
|
+
|
|
|
+ session.Select("TRIM(id) id,tname,maxstirfeed")
|
|
|
+ session.Where("pastureid = ? ", pastureid)
|
|
|
+ session.Where("enable = 1")
|
|
|
+ session.In("tclassid", "1,2,3")
|
|
|
+
|
|
|
+ err := session.Find(&data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("gettmr-error", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return data, nil
|
|
|
+}
|
|
|
+
|
|
|
+//判断计划种是否有该车次
|
|
|
+func getLpplanExist(tmrid, ftid int64, times int, pastureid string, tx *xorm.Session) (bool, error) {
|
|
|
+ session := tx.Table("lpplan")
|
|
|
+
|
|
|
+ session.Where("pastureid = ? ", pastureid)
|
|
|
+ session.Where("times = ? ", times)
|
|
|
+ session.Where("tmrid = ? ", tmrid)
|
|
|
+ session.Where("ftid = ? ", ftid)
|
|
|
+
|
|
|
+ exist, err := session.Exist()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("getLpplanExist-error", err)
|
|
|
+ return false, err
|
|
|
+ }
|
|
|
+ return exist, nil
|
|
|
+}
|
|
|
+
|
|
|
+type lpplanList struct {
|
|
|
+ Tmrid int64 `xorm:"tmrid"`
|
|
|
+ Times int64 `xorm:"times"`
|
|
|
+ Ftid int64 `xorm:"ftid"`
|
|
|
+}
|
|
|
+
|
|
|
+func getLpplanlist(patsureid string, tx *xorm.Session) ([]*lpplanList, error) {
|
|
|
+ session := tx.Table("lpplan")
|
|
|
+ session.Select("times,tmrid,ftid")
|
|
|
+ session.Where("pastureid = ? ", patsureid)
|
|
|
+ data := make([]*lpplanList, 0)
|
|
|
+ err := session.Find(&data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("getLpplanlist-error", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return data, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 添加车次计划
|
|
|
+func addLpplan(lpplan *lpplanStruct, tx *xorm.Session) error {
|
|
|
+ _, err := tx.Table("lpplan").Insert(lpplan)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("addLpplan-error", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+//获取车次数量
|
|
|
+func getLpplanCount(tx *xorm.Session) (int64, error) {
|
|
|
+ count, err := tx.Table("lpplan").Count()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("getLpplanCount-error", err)
|
|
|
+ return 0, err
|
|
|
+ }
|
|
|
+ return count, err
|
|
|
+}
|
|
|
+
|
|
|
+//获取班次信息
|
|
|
+func gettimes(pastureid string, tx *xorm.Session) (int, error) {
|
|
|
+ session := tx.Table("sysopt")
|
|
|
+
|
|
|
+ session.Where("pastureid = ? ", pastureid)
|
|
|
+ session.Where("inforname = 'times' ")
|
|
|
+
|
|
|
+ data := new(sysopt)
|
|
|
+ _, err := session.Get(data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("gettimes-error", err)
|
|
|
+ return 0, err
|
|
|
+ }
|
|
|
+ return data.Inforvalue, nil
|
|
|
+}
|
|
|
+
|
|
|
+func autogeneration(typeIN int64, pastureid string, tx *xorm.Session) error {
|
|
|
+
|
|
|
+ tx.Begin()
|
|
|
+ if typeIN == 1 {
|
|
|
+ _, err := tx.SQL(`DELETE FROM lpplandtl1 WHERE pastureid = ?`, pastureid).Execute()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-1", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = tx.SQL(`update fpdetail
|
|
|
+ set ptuse = 0,ptsuse=0
|
|
|
+ WHERE pastureid = ?`, pastureid).Execute()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-2", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ lpplansession := tx.SQL(`select
|
|
|
+ t1.sort,t1.tmrid,t1.tmrname,
|
|
|
+ t1.pastureid,t1.id ,t1.maxweight,ifnull(t2.lweight,0) as lweight from lpplan t1
|
|
|
+ left join ( select ifnull(sum(lweight),0) as lweight,lppid from lpplandtl1 where pastureid =? GROUP BY lppid) t2 on t1.id = t2.lppid
|
|
|
+ where t1.pastureid = ? and t1.maxweight > ifnull(t2.lweight,0) `, pastureid, pastureid)
|
|
|
+
|
|
|
+ lpplanlist := make([]*lpplanQueryInfo, 0)
|
|
|
+
|
|
|
+ err := lpplansession.Find(&lpplanlist)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-3", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, lpplan := range lpplanlist {
|
|
|
+ fpdetailsession := tx.Table("fpdetail").Alias("fpd")
|
|
|
+ fpdetailsession.Select("fpd.barid,fpd.barname,fpd.id as fpdid ,fpd.weight as weight,ifnull(fpd.ptuse,0) as ptuse,ifnull(fpd.ptsuse,0) as ptsuse,fpd.barid,fpd.barname,fpd.cowcount,fpd.ccountradio")
|
|
|
+ fpdetailsession.Join("inner", []string{"lpplan", "lpp"},
|
|
|
+ "lpp.pastureid = fpd.pastureid ").And("lpp.ftid = fpd.ptid").And(
|
|
|
+ "lpp.times = fpd.times").And("lpp.id = ?", lpplan.Lppid)
|
|
|
+ fpdetailsession.Where("fpd.pastureid = ? ", pastureid)
|
|
|
+ fpdetailsession.GroupBy("fpd.id")
|
|
|
+
|
|
|
+ fpdetaillist := make([]*fpdetailQueryInfo, 0)
|
|
|
+ err = fpdetailsession.Find(&fpdetaillist)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-4", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, fpdetail := range fpdetaillist {
|
|
|
+ // //剩余料
|
|
|
+ weight := fpdetail.Weight*(1-fpdetail.Ptsuse) - fpdetail.Ptuse
|
|
|
+ if lpplan.Maxweight <= lpplan.Lweight || weight == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ var insertlweight float64
|
|
|
+ if lpplan.Maxweight-lpplan.Lweight > weight {
|
|
|
+ insertlweight = weight
|
|
|
+ } else {
|
|
|
+ insertlweight = lpplan.Maxweight - lpplan.Lweight
|
|
|
+ }
|
|
|
+ lpplan.Lweight += insertlweight
|
|
|
+ lpplan.Lweighthis = insertlweight
|
|
|
+ fpdetail.Ptuse += insertlweight
|
|
|
+
|
|
|
+ // updatefpd := tx.Table("fpdetail").Alias("fpd")
|
|
|
+ // updatefpd.Join("INNER", []string{"lpplan", "lpp"}, "lpp.pastureid = fpd.pastureid")
|
|
|
+ // updatefpd.Where("lpp.ftid = fpd.ptid").And("lpp.times = fpd.times")
|
|
|
+ // _, err = updatefpd.Update(fpdetail)
|
|
|
+ _, err = tx.SQL(` update fpdetail fpd join lpplan lpp on lpp.pastureid = fpd.pastureid and lpp.ftid = fpd.ptid and lpp.times = fpd.times
|
|
|
+ set fpd.ptuse = ? where fpd.id = ? `, fpdetail.Ptuse, fpdetail.Fpdid).Execute()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-5", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ lpplandtlExecute, err := tx.SQL(`select id from lpplandtl1 where pastureid= ?
|
|
|
+ and lppid = ? and fpdid =? and fttype = ? `, pastureid, lpplan.Lppid, fpdetail.Fpdid, 1).Exist()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-6", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if lpplandtlExecute {
|
|
|
+ lpplandtl1query := new(lpplandtl1)
|
|
|
+ query := tx.Table("lpplandtl1")
|
|
|
+ query.Where("pastureid = ?", pastureid)
|
|
|
+ query.Where("lppid = ?", lpplan.Lppid)
|
|
|
+ query.Where("fpdid = ?", fpdetail.Fpdid)
|
|
|
+ query.Where("fttype = 1")
|
|
|
+ _, err = query.Get(lpplandtl1query)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-7", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ upLpplandtl1 := tx.Table("lpplandtl1")
|
|
|
+ data := &lpplandtl1{
|
|
|
+ Pastureid: lpplan.Pastureid,
|
|
|
+ Lppid: lpplan.Lppid,
|
|
|
+ Barid: fpdetail.Barid,
|
|
|
+ Barname: fpdetail.Barname,
|
|
|
+ Fpdid: fpdetail.Fpdid,
|
|
|
+ Fttype: 1,
|
|
|
+ Lweight: lpplandtl1query.Lweight + insertlweight,
|
|
|
+ Sort: lpplan.Sort,
|
|
|
+ Tmrid: lpplan.Tmrid,
|
|
|
+ Tmrname: lpplan.Tmrname,
|
|
|
+ Cowcount: fpdetail.Cowcount,
|
|
|
+ Ccountradio: fpdetail.Ccountradio,
|
|
|
+ // Background: lpplan.Background,
|
|
|
+ Lweighthis: insertlweight,
|
|
|
+ }
|
|
|
+ upLpplandtl1.Where("pastureid = ?", pastureid)
|
|
|
+ upLpplandtl1.Where("lppid = ?", lpplan.Lppid)
|
|
|
+ upLpplandtl1.Where("fpdid = ?", fpdetail.Fpdid)
|
|
|
+ upLpplandtl1.Where("fttype = 1")
|
|
|
+ _, err = upLpplandtl1.Update(data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-8", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data := &lpplandtl1{
|
|
|
+ Pastureid: lpplan.Pastureid,
|
|
|
+ Lppid: lpplan.Lppid,
|
|
|
+ Barid: lpplan.Barid,
|
|
|
+ Barname: lpplan.Barname,
|
|
|
+ Fpdid: fpdetail.Fpdid,
|
|
|
+ Fttype: 1,
|
|
|
+ Lweight: insertlweight,
|
|
|
+ Sort: lpplan.Sort,
|
|
|
+ Tmrid: lpplan.Tmrid,
|
|
|
+ Tmrname: lpplan.Tmrname,
|
|
|
+ Cowcount: lpplan.Cowcount,
|
|
|
+ Ccountradio: lpplan.Ccountradio,
|
|
|
+ Background: lpplan.Background,
|
|
|
+ Lweighthis: insertlweight,
|
|
|
+ }
|
|
|
+
|
|
|
+ addLpplandtl1 := tx.Table("lpplandtl1")
|
|
|
+ _, err = addLpplandtl1.Insert(data)
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-9", err)
|
|
|
+ tx.Rollback()
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ err = tx.Commit()
|
|
|
+ if err != nil {
|
|
|
+ log.Println("autogeneration-error-10", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|