grfdApi.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "tmr-watch/conf/setting"
  12. "tmr-watch/http/handle/restful"
  13. "tmr-watch/pkg/app"
  14. "tmr-watch/pkg/logging"
  15. "tmr-watch/pkg/util"
  16. "github.com/Anderson-Lu/gofasion/gofasion"
  17. "github.com/gin-gonic/gin"
  18. "github.com/hequan2017/go-admin/pkg/e"
  19. "github.com/robfig/cron"
  20. "github.com/xormplus/xorm"
  21. )
  22. // 本部分是格润富德牧场系统 的下发和上传功能(可咨询刘欢)
  23. func GetDorm(c *gin.Context) {
  24. appG := app.Gin{C: c}
  25. if setting.ServerSetting.GRFD != "1" { //是否启用(格润富德)
  26. appG.Response(http.StatusOK, e.SUCCESS, nil)
  27. return
  28. }
  29. logging.Info("GetDorm", c.Keys, c.Request.RemoteAddr)
  30. dataByte, _ := ioutil.ReadAll(c.Request.Body)
  31. fsion := gofasion.NewFasion(string(dataByte))
  32. pastureid := fsion.Get("pastureid").ValueStr()
  33. //下发
  34. err := GetMaterialCategory(pastureid) //饲料分类
  35. if err != nil {
  36. appG.Response(http.StatusOK, e.ERROR, "饲料分类同步失败:"+err.Error())
  37. return
  38. }
  39. err = GetCowCategory(pastureid) // 牲畜类别
  40. if err != nil {
  41. appG.Response(http.StatusOK, e.ERROR, "牲畜类别同步失败:"+err.Error())
  42. return
  43. }
  44. err = GetDormBar(pastureid) // 栏舍
  45. if err != nil {
  46. appG.Response(http.StatusOK, e.ERROR, "栏舍同步失败:"+err.Error())
  47. return
  48. }
  49. err = GetMaterial(pastureid) //饲料
  50. if err != nil {
  51. appG.Response(http.StatusOK, e.ERROR, "饲料同步失败:"+err.Error())
  52. return
  53. }
  54. err = GetFormula(pastureid) // 配方
  55. if err != nil {
  56. appG.Response(http.StatusOK, e.ERROR, "配方同步失败:"+err.Error())
  57. return
  58. }
  59. appG.Response(http.StatusOK, e.SUCCESS, nil)
  60. }
  61. func GetDormBar(pastureid string) error {
  62. //appG := app.Gin{C: c}
  63. //dataByte, _ := ioutil.ReadAll(c.Request.Body)
  64. //fsion := gofasion.NewFasion(string(dataByte))
  65. //sqlnamestr := fsion.Get("name").ValueStr()
  66. //offset := fsion.Get("offset").ValueDefaultInt(0)
  67. //pagecount := fsion.Get("pagecount").ValueDefaultInt(0)
  68. //returntype := fsion.Get("returntype").ValueDefaultStr("map")
  69. data := util.Send_Message1("{\"farmId\":4090}", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/getDorm")
  70. if data != nil {
  71. var feedp util.Feedp
  72. json.Unmarshal(data, &feedp)
  73. status := feedp.Status
  74. feedpData := feedp.Data
  75. if status == 0 {
  76. //dataByte, _ := ioutil.ReadAll(c.Request.Body)
  77. //fsion := gofasion.NewFasion(string(dataByte))
  78. //pastureid := fsion.Get("pastureid").ValueStr()
  79. // 开启事务
  80. tx := restful.Engine.NewSession()
  81. err := tx.Begin()
  82. defer func() {
  83. switch {
  84. case err != nil:
  85. logging.Error("tx.Begin 事务启动失败__error:", err)
  86. if tx != nil {
  87. tx.Rollback()
  88. }
  89. default:
  90. if tx != nil {
  91. err = tx.Commit()
  92. }
  93. }
  94. if tx != nil {
  95. tx.Close()
  96. }
  97. }()
  98. //feedpData := feedpData[:10]
  99. // 根据上次修改时间判断是否进行更新
  100. valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,bname FROM bar WHERE pastureid = ?", pastureid).QueryString()
  101. mt := make(map[string]string)
  102. for _, v := range valuesMap {
  103. mt[v["bname"]] = v["backup2"]
  104. }
  105. //已关闭的栏舍不启用
  106. _, err = tx.Exec("update bar set enable = 2 where pastureid = ? and enable = 0",
  107. pastureid)
  108. if err != nil {
  109. return err
  110. }
  111. _, err = tx.Exec("update bar set enable = 0 where pastureid = ? and enable < 2",
  112. pastureid)
  113. if err != nil {
  114. return err
  115. }
  116. logging.Info("GetDorm feedpData:", feedpData)
  117. for _, val := range feedpData {
  118. penId := val.PenId
  119. penName := val.PenName
  120. cowCount := val.CowCount
  121. ccountRatio := val.CcountRatio
  122. //createdAt := val.CreatedAt
  123. modifiedAt := val.ModifiedAt
  124. isexec := false
  125. if _, ok := mt[penName]; ok {
  126. //if mt[penName] == modifiedAt{
  127. // continue
  128. //}
  129. } else {
  130. isexec = true
  131. }
  132. //ise = true
  133. ids, err := setting.SnowIds.NextId()
  134. if err != nil {
  135. ids = time.Now().UnixNano()
  136. logging.Info("create SnowIds err", err)
  137. }
  138. //首先将所有栏舍禁用
  139. _, err = tx.Exec("update bar set bname = ? where bcode = ?",
  140. penName, penId)
  141. if err != nil {
  142. return err
  143. }
  144. _, err = tx.Exec("insert into bar(id,pastureid,bcode,backup1,backup2,bname,enable) "+
  145. " values(?,?,?,?,?,?,1)"+
  146. " ON DUPLICATE KEY UPDATE bcode=?,backup2=?,enable=if(enable = 2,0,1)",
  147. ids, pastureid, penId, penId, modifiedAt, penName, penId, modifiedAt)
  148. if err != nil {
  149. return err
  150. }
  151. // break
  152. // 下发不修改系数,只修改牛头数
  153. _, err = tx.Exec("insert into feedp(id,pastureid,barid,barname,ccount,ratio,ccountratio) "+
  154. " values(?,?,(select id from bar where pastureid=? and bname=?),?,(if(concat(?)='',0,?)),REPLACE(?,'%',"+
  155. "''),REPLACE(?,'%','')*(if(concat(?)='',0,?))/100)"+
  156. " ON DUPLICATE KEY UPDATE barname=?,ccount=if(concat(?)='',0,?),ccountratio=ratio*ccount/100",
  157. ids, pastureid, pastureid, penName, penName, cowCount, cowCount, ccountRatio, ccountRatio, cowCount, cowCount, penName,
  158. cowCount, cowCount)
  159. if err != nil {
  160. return err
  161. // return err ors.New(fmt.Sprintf("%s", string(data)))
  162. }
  163. // break
  164. if !isexec { //第一次新增栏舍,不去更新feedp
  165. _, err = tx.Exec(` UPDATE feedp fp
  166. SET
  167. fp.ftweight= IFNULL(IF(
  168. (SELECT sysopt.inforvalue FROM sysopt WHERE sysopt.pastureid= fp.pastureid AND sysopt.inforname='isLockCount')=0,
  169. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid ),0)*ccountratio,
  170. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid AND ftdetail.islockcount=0),0)*ccountratio +
  171. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid AND ftdetail.islockcount=1),0)*ccount
  172. ),0),fp.feedweight = IFNULL(IF(
  173. (SELECT sysopt.inforvalue FROM sysopt WHERE sysopt.pastureid= fp.pastureid AND sysopt.inforname='isLockCount')=0,
  174. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid ),0)*ccountratio,
  175. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid AND ftdetail.islockcount=0),0)*ccountratio +
  176. IFNULL((SELECT SUM(fweight) FROM ftdetail WHERE ftdetail.ftid =fp.ftid AND ftdetail.pastureid=fp.pastureid AND ftdetail.islockcount=1),0)*ccount
  177. ),0) +fp.supplyweight
  178. WHERE fp.pastureid = ? AND fp.barid =(SELECT id FROM bar WHERE pastureid=? AND bname=?)`, pastureid, pastureid, penName)
  179. if err != nil {
  180. return err
  181. }
  182. _, err = tx.Exec(` UPDATE fpdetail fpd
  183. INNER JOIN feedp fp
  184. ON fpd.barid = fp.barid AND fpd.pastureid = fp.pastureid
  185. SET
  186. fpd.ccountradio =fp.ratio,
  187. fpd.cowcount =fp.ccount,
  188. fpd.weight = fp.feedweight*fpd.tratio/100,
  189. ptsrate=fp.supplyweight/(fp.feedweight)
  190. WHERE fp.pastureid = ? AND fp.barid =(SELECT id FROM bar WHERE pastureid=? AND bname=?)`, pastureid, pastureid, penName)
  191. if err != nil {
  192. return err
  193. }
  194. _, err = tx.Exec("call updateLPPbyFPChange((select id from bar where pastureid=? and bname=?),?)", pastureid, penName, pastureid)
  195. if err != nil {
  196. return err
  197. }
  198. }
  199. }
  200. _, err = tx.Exec("update bar set enable = 0 where pastureid = ? and enable = 2",
  201. pastureid)
  202. if err != nil {
  203. return err
  204. }
  205. }
  206. }
  207. return nil
  208. }
  209. func GetMaterial(pastureid string) error {
  210. data := util.Send_Message1("{\"farmId\":4090}", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/getMaterial")
  211. if data != nil {
  212. var feed util.Feed
  213. json.Unmarshal(data, &feed)
  214. status := feed.Status
  215. feedpData := feed.Data
  216. if status == 0 {
  217. // 开启事务
  218. tx := restful.Engine.NewSession()
  219. err := tx.Begin()
  220. defer func() {
  221. switch {
  222. case err != nil:
  223. logging.Error("tx.Begin 事务启动失败__error:", err)
  224. if tx != nil {
  225. tx.Rollback()
  226. }
  227. default:
  228. if tx != nil {
  229. err = tx.Commit()
  230. }
  231. }
  232. if tx != nil {
  233. tx.Close()
  234. }
  235. }()
  236. valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,fname FROM feed WHERE pastureid = ?", pastureid).QueryString()
  237. mt := make(map[string]string)
  238. for _, v := range valuesMap {
  239. mt[v["fname"]] = v["backup2"]
  240. }
  241. for _, val := range feedpData {
  242. fId := val.FId
  243. fName := val.FName
  244. price := val.Price
  245. dryMatter := val.DryMatter
  246. //autoChange := val.AutoChange
  247. //allowDev := val.AllowDev
  248. feedclassName := val.FeedclassName
  249. //createdAt := val.CreatedAt
  250. modifiedAt := val.ModifiedAt
  251. fmt.Println(fName)
  252. if _, ok := mt[fName]; ok {
  253. if mt[fName] == modifiedAt {
  254. continue
  255. }
  256. }
  257. ids, err := setting.SnowIds.NextId()
  258. if err != nil {
  259. ids = time.Now().UnixNano()
  260. logging.Info("create SnowIds err", err)
  261. }
  262. _, err = tx.Exec("insert into feed(id,pastureid,feedcode,backup1,backup2,fname,fclass,fclassid,uprice,dry) "+
  263. " values(?,?,?,?,?,?,?,(select id from feedclass where fcname=? and pastureid=?),(if(?='',0,?)),(if(?='' or ?='~',0,?)))"+
  264. " ON DUPLICATE KEY UPDATE feedcode=?,backup2=?,fname=?,fclass=?,fclassid=(select id from feedclass where fcname=? and pastureid=?),"+
  265. " uprice=(if(?='',uprice,?)),dry=(if(?='' or ?='~',dry,?))",
  266. ids, pastureid, fId, fId, modifiedAt, fName, feedclassName, feedclassName, pastureid, price, price, dryMatter, dryMatter, dryMatter, fId, modifiedAt, fName, feedclassName, feedclassName, pastureid, price, price, dryMatter, dryMatter, dryMatter)
  267. if err != nil {
  268. return err
  269. }
  270. _, err = tx.Exec(" insert into feednur(id,pastureid,fid,fname,price,dry,fndate) "+
  271. " values(?,?,(select id from feed where fname=? and pastureid=?),?,(if(?='',0,?)),(if(?='' or ?='~',0,?)),now() ) "+
  272. " ON DUPLICATE KEY UPDATE price=(if(?='',0,?)),dry=(if(?='' or ?='~',0,?)),fndate=now() ",
  273. ids, pastureid, fName, pastureid, fName, price, price, dryMatter, dryMatter, dryMatter, price, price, dryMatter, dryMatter, dryMatter)
  274. if err != nil {
  275. fmt.Println(err)
  276. return err
  277. }
  278. }
  279. }
  280. }
  281. return nil
  282. }
  283. func GetMaterialCategory(pastureid string) error {
  284. data := util.Send_Message1("{\"farmId\":4090}", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/getMaterialCategory")
  285. if data != nil {
  286. var feedClass util.FeedClass
  287. json.Unmarshal(data, &feedClass)
  288. status := feedClass.Status
  289. feedpData := feedClass.Data
  290. if status == 0 {
  291. //dataByte, _ := ioutil.ReadAll(c.Request.Body)
  292. //fsion := gofasion.NewFasion(string(dataByte))
  293. //pastureid := fsion.Get("pastureid").ValueStr()
  294. // 开启事务
  295. tx := restful.Engine.NewSession()
  296. err := tx.Begin()
  297. defer func() {
  298. switch {
  299. case err != nil:
  300. logging.Error("tx.Begin 事务启动失败__error:", err)
  301. if tx != nil {
  302. tx.Rollback()
  303. }
  304. default:
  305. if tx != nil {
  306. err = tx.Commit()
  307. }
  308. }
  309. if tx != nil {
  310. tx.Close()
  311. }
  312. }()
  313. for _, val := range feedpData {
  314. feedclassName := val.FeedclassName
  315. feedclassId := val.FeedclassId
  316. //createdAt := val.CreatedAt
  317. //modifiedAt := val.ModifiedAt
  318. ids, err := setting.SnowIds.NextId()
  319. if err != nil {
  320. ids = time.Now().UnixNano()
  321. logging.Info("create SnowIds err", err)
  322. }
  323. _, err = tx.Exec("insert into feedclass(id,pastureid,fcname,fccode,backup1,bigfeedclassid,bigfeedclassname,sort,`enable`) values(?,?,?,?,?,?,?,?,?)"+
  324. " ON DUPLICATE KEY UPDATE fccode=?,backup1=?",
  325. ids, pastureid, feedclassName, feedclassId, feedclassId, 3, "精粗各半", 0, 1, feedclassId, feedclassId)
  326. if err != nil {
  327. return err
  328. }
  329. }
  330. }
  331. }
  332. return nil
  333. }
  334. func GetCowCategory(pastureid string) error {
  335. data := util.Send_Message1("{\"farmId\":4090}", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/getCowCategory")
  336. if data != nil {
  337. var cowClass util.CowClass
  338. json.Unmarshal(data, &cowClass)
  339. status := cowClass.Status
  340. feedpData := cowClass.Data
  341. if status == 0 {
  342. //dataByte, _ := ioutil.ReadAll(c.Request.Body)
  343. //fsion := gofasion.NewFasion(string(dataByte))
  344. //pastureid := fsion.Get("pastureid").ValueStr()
  345. // 开启事务
  346. tx := restful.Engine.NewSession()
  347. err := tx.Begin()
  348. defer func() {
  349. switch {
  350. case err != nil:
  351. logging.Error("tx.Begin 事务启动失败__error:", err)
  352. if tx != nil {
  353. tx.Rollback()
  354. }
  355. default:
  356. if tx != nil {
  357. err = tx.Commit()
  358. }
  359. }
  360. if tx != nil {
  361. tx.Close()
  362. }
  363. }()
  364. for _, val := range feedpData {
  365. cowClassCode := val.CowClassCode
  366. cowClassName := val.CowClassName
  367. //createdAt := val.CreatedAt
  368. //modifiedAt := val.ModifiedAt
  369. //fmt.Println(pastureid,cowClassCode, cowClassName, createdAt, modifiedAt)
  370. ids, err := setting.SnowIds.NextId()
  371. if err != nil {
  372. ids = time.Now().UnixNano()
  373. logging.Info("create SnowIds err", err)
  374. }
  375. _, err = tx.Exec("insert into cowclass(id,pastureid,classcode,backup1,classname) values(?,?,?,?,?) "+
  376. " ON DUPLICATE KEY UPDATE classcode=?",
  377. ids, pastureid, cowClassCode, cowClassCode, cowClassName, cowClassCode)
  378. if err != nil {
  379. return err
  380. }
  381. }
  382. }
  383. }
  384. return nil
  385. }
  386. func GetFormula(pastureid string) error {
  387. data := util.Send_Message1("{\"farmId\":4090}", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/getFormula")
  388. if data != nil {
  389. var feedTemplet util.FeedTemplet
  390. json.Unmarshal(data, &feedTemplet)
  391. status := feedTemplet.Status
  392. feedpData := feedTemplet.Data
  393. if status == 0 {
  394. //dataByte, _ := ioutil.ReadAll(c.Request.Body)
  395. //fsion := gofasion.NewFasion(string(dataByte))
  396. //pastureid := fsion.Get("pastureid").ValueStr()
  397. // 开启事务
  398. tx := restful.Engine.NewSession()
  399. err := tx.Begin()
  400. defer func() {
  401. switch {
  402. case err != nil:
  403. logging.Error("tx.Begin 事务启动失败__error:", err)
  404. if tx != nil {
  405. tx.Rollback()
  406. }
  407. default:
  408. if tx != nil {
  409. err = tx.Commit()
  410. }
  411. }
  412. if tx != nil {
  413. tx.Close()
  414. }
  415. }()
  416. valuesMap, _ := tx.SQL("SELECT ifnull(backup2,'-1')backup2,tname FROM feedtemplet WHERE pastureid = ?", pastureid).QueryString()
  417. mt := make(map[string]string)
  418. for _, v := range valuesMap {
  419. mt[v["tname"]] = v["backup2"]
  420. }
  421. for _, val := range feedpData {
  422. ftId := val.FtId
  423. ftName := val.FtName
  424. feedList := val.FeedList
  425. //createdAt := val.CreatedAt
  426. modifiedAt := val.ModifiedAt
  427. if _, ok := mt[ftName]; ok {
  428. if mt[ftName] == modifiedAt {
  429. continue
  430. }
  431. }
  432. ids, err := setting.SnowIds.NextId()
  433. if err != nil {
  434. ids = time.Now().UnixNano()
  435. logging.Info("create SnowIds err", err)
  436. }
  437. _, err = tx.Exec("insert into feedtemplet(id,pastureid,ccid,tcode,backup1,backup2,tname,fttypeid,fttype) values(?,?,null,?,?,?,?,1,'饲喂配方') "+
  438. " ON DUPLICATE KEY UPDATE tcode=?,backup2= ?",
  439. ids, pastureid, ftId, ftId, modifiedAt, ftName, ftId, modifiedAt)
  440. if err != nil {
  441. return err
  442. }
  443. valuesMap2, _ := tx.SQL("select id,ftid,fname,fid,fweight,autosecond,autosecondname from ftdetail where ftid= "+
  444. " (select id from feedtemplet where pastureid=? and tname=? limit 1 )", pastureid, ftName).QueryString()
  445. tx.Exec("delete from ftdetail where ftid=(select id from feedtemplet where pastureid=? and tname=?) ", pastureid, ftName)
  446. for _, val := range feedList {
  447. fId := val.FId
  448. fName := val.FName
  449. fodderWeight := val.FodderWeight
  450. mixNo := val.MixNo
  451. allowableError := val.AllowableError
  452. autosecond := val.Autosecond
  453. tx.Exec("update feed set allowratio=if(?='',allowratio,?) where pastureid=? and fname=? ", allowableError, allowableError, pastureid, fName)
  454. if valuesMap2 != nil {
  455. for _, v := range valuesMap2 {
  456. fName2 := v["fname"]
  457. autosecond2 := v["autosecond"]
  458. if fName == fName2 && (autosecond2 != "") {
  459. autosecond = autosecond2
  460. }
  461. }
  462. }
  463. ids, err := setting.SnowIds.NextId()
  464. if err != nil {
  465. ids = time.Now().UnixNano()
  466. logging.Info("create SnowIds err", err)
  467. }
  468. _, err = tx.Exec("insert into ftdetail(id,pastureid,ftid,fid,fname,fweight,sort,autosecond,autosecondname,feedgroup) "+
  469. " values(?,?,(select id from feedtemplet where pastureid=? and tname=? limit 1),"+
  470. " (select id from feed where pastureid=? and backup1=? limit 1),?,?,?,(if(?='',0,?)),?,?) ",
  471. ids, pastureid, pastureid, ftName, pastureid, fId, fName, fodderWeight, mixNo, autosecond, autosecond, autosecond, fName)
  472. if err != nil {
  473. return err
  474. }
  475. _, 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)
  476. if err != nil {
  477. return err
  478. }
  479. }
  480. }
  481. }
  482. }
  483. return nil
  484. }
  485. func AddOtherDevice() {
  486. tx := restful.Engine.NewSession()
  487. err1 := tx.Begin()
  488. defer func() {
  489. switch {
  490. case err1 != nil:
  491. logging.Error("tx.Begin 事务启动失败__error:", err1)
  492. if tx != nil {
  493. tx.Rollback()
  494. }
  495. default:
  496. if tx != nil {
  497. err1 = tx.Commit()
  498. }
  499. }
  500. if tx != nil {
  501. tx.Close()
  502. }
  503. }()
  504. queryIdList, err1 := tx.SQL(`SELECT d.pid +UNIX_TIMESTAMP(d.mydate) id,d.pid did,d.projname projName ,DATE_FORMAT(d.mydate,'%Y-%m-%d') mydate
  505. FROM downloadedplan d
  506. WHERE (d.mydate=DATE_FORMAT(NOW(),'%Y-%m-%d')OR d.mydate=DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y-%m-%d') )
  507. AND d.isuse=0
  508. AND d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch2' AND column_name = 'pastureid')
  509. AND (SELECT COUNT(*) FROM downloadplandtl1 d1 WHERE d.id=d1.PID AND d.pastureid=d1.pastureid AND d1.type = 0)>0
  510. AND (SELECT COUNT(*) FROM downloadedplan WHERE pastureid = d.pastureid AND downloadedplan.lpplantype=1 and mydate = d.mydate AND pid = d.pid AND iscompleted = 0) = 0
  511. GROUP BY d.pid +UNIX_TIMESTAMP(d.mydate)`).Query().List()
  512. queryDataList, err2 := tx.SQL(`SELECT d.pid +UNIX_TIMESTAMP(d.mydate) 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,
  513. de.Fname AS fName,fc.FCNAME AS feedclassName,de.SORT AS sort,de.feedallowratio AS allowableError,
  514. CAST(IFNULL(de.LWEIGHT,0) AS DECIMAL(10,2)) AS expWeight,CAST(IFNULL(de.ActualWeightMinus,0) AS DECIMAL(10,2)) AS actualWeight,
  515. DATE_FORMAT(de.intime,'%Y-%m-%d %H:%i:%s') AS endTime ,d.tmrtname AS tName ,'' dName
  516. FROM downloadedplan d JOIN downloadplandtl1 de ON d.id=de.PID AND d.pastureid=de.pastureid AND de.type = 0
  517. 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
  518. LEFT JOIN feedclass fc ON f.fclassid=fc.id AND fc.pastureid=d.pastureid
  519. WHERE (d.mydate=DATE_FORMAT(NOW(),'%Y-%m-%d') OR d.mydate=DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y-%m-%d') ) AND d.isuse=0
  520. AND d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch2' AND column_name = 'pastureid')
  521. AND (SELECT COUNT(*) FROM downloadplandtl1 d1 WHERE d.id=d1.PID AND d.pastureid=d1.pastureid AND d1.type = 0)>0
  522. AND (SELECT COUNT(*) FROM downloadedplan WHERE pastureid = d.pastureid AND downloadedplan.lpplantype=1 and mydate = d.mydate AND pid = d.pid AND iscompleted = 0) = 0
  523. group by d.pid,de.Fname,d.mydate`).Query().List()
  524. if err1 == nil && err2 == nil {
  525. for i := 0; i < len(queryIdList); i++ {
  526. id := queryIdList[i]["id"]
  527. projName := queryIdList[i]["projName"]
  528. listData := make(map[string]interface{})
  529. listData["farmId"] = 4090
  530. listData["id"] = id
  531. listData["projName"] = projName
  532. feedList := []interface{}{}
  533. for j := 0; j < len(queryDataList); j++ {
  534. id2 := queryDataList[j]["id"]
  535. if id == id2 {
  536. dataList := make(map[string]interface{})
  537. dataList["tmrNo"] = queryDataList[j]["tmrNo"]
  538. dataList["times"] = queryDataList[j]["times"]
  539. dataList["loadDate"] = queryDataList[j]["loadDate"]
  540. dataList["ftId"] = queryDataList[j]["ftId"]
  541. dataList["ftName"] = queryDataList[j]["ftName"]
  542. dataList["fId"] = queryDataList[j]["fId"]
  543. dataList["tName"] = queryDataList[j]["tName"]
  544. dataList["feedclassName"] = queryDataList[j]["feedclassName"]
  545. dataList["fName"] = queryDataList[j]["fName"]
  546. dataList["sort"] = queryDataList[j]["sort"]
  547. dataList["allowableError"] = queryDataList[j]["allowableError"]
  548. xorm.String(queryDataList[j]["expWeight"])
  549. expWeight, _ := strconv.ParseFloat(xorm.String(queryDataList[j]["expWeight"]), 64)
  550. actualWeight, _ := strconv.ParseFloat(xorm.String(queryDataList[j]["actualWeight"]), 64)
  551. lWeight, _ := strconv.ParseFloat(xorm.String(queryDataList[j]["lWeight"]), 64)
  552. dataList["expWeight"] = expWeight
  553. dataList["actualWeight"] = actualWeight
  554. dataList["lWeight"] = lWeight
  555. dataList["endTime"] = queryDataList[j]["endTime"]
  556. dataList["dName"] = queryDataList[j]["dName"]
  557. feedList = append(feedList, dataList)
  558. }
  559. }
  560. listData["data"] = feedList
  561. jsonStr, _ := json.Marshal(listData)
  562. postData := make(map[string]string)
  563. postData["formData"] = string(jsonStr)
  564. err := util.PostWithFormData("POST", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/addOtherDevice", &postData)
  565. if (err != nil) && (strings.Contains(err.Error(), "ID已存在") == false) {
  566. logging.Error("AddOtherDevice err:", err)
  567. } else {
  568. _, err = tx.Exec(`update downloadedplan set isuse=1 where pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight'
  569. AND table_schema = 'tmrwatch2' AND column_name = 'pastureid') and pid =? and mydate = ? `, queryIdList[i]["did"], queryIdList[i]["mydate"])
  570. if err != nil {
  571. logging.Error("update downloadedplan err:", err)
  572. }
  573. }
  574. }
  575. }
  576. }
  577. func AddOtherDeviceFeeding() {
  578. tx := restful.Engine.NewSession()
  579. err1 := tx.Begin()
  580. defer func() {
  581. switch {
  582. case err1 != nil:
  583. logging.Error("tx.Begin 事务启动失败__error:", err1)
  584. if tx != nil {
  585. tx.Rollback()
  586. }
  587. default:
  588. if tx != nil {
  589. err1 = tx.Commit()
  590. }
  591. }
  592. if tx != nil {
  593. tx.Close()
  594. }
  595. }()
  596. // TODO isuse2 =0 待定
  597. queryIdList, err1 := tx.SQL(`SELECT d.pid +UNIX_TIMESTAMP(d.mydate) id,d.pid did,d.projname projName,DATE_FORMAT(d.mydate,'%Y-%m-%d') mydate
  598. FROM downloadedplan d
  599. WHERE (d.mydate=DATE_FORMAT(NOW(),'%Y-%m-%d')OR d.mydate=DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y-%m-%d') )
  600. AND iscompleted=1 AND d.isuse2=0
  601. AND (SELECT COUNT(*) FROM downloadplandtl2 d2 WHERE d.id=d2.PID AND d.pastureid=d2.pastureid AND d2.type = 0)>0
  602. AND (SELECT COUNT(*) FROM downloadedplan WHERE pastureid = d.pastureid AND mydate = d.mydate AND pid = d.pid AND iscompleted = 0) = 0
  603. `).Query().List()
  604. queryDataList, err2 := tx.SQL(` SELECT d.pid +UNIX_TIMESTAMP(d.mydate) id,d.projname projName,DATE_FORMAT(d.mydate,'%Y-%m-%d') AS dropDate,d.Times AS times,d.SORT AS tmrNo,
  605. bar.bcode AS penId,d2.fname AS penName,fp.CCOUNT AS cowCount, d2.SORT AS sort,d.templetName ftName, ft.backup1 ftId,
  606. IFNULL(d2.LWEIGHT,0) AS expWeight,IF(d2.ActualWeightMinus<0,0,d2.ActualWeightMinus) AS actualWeight,DATE_FORMAT(d2.intime,'%Y-%m-%d %H:%i:%s') AS endTime,d.tmrtname AS tName,'' dName
  607. FROM downloadedplan d JOIN downloadplandtl2 d2 ON d.id=d2.PID AND d.pastureid=d2.pastureid AND d2.type = 0
  608. LEFT JOIN bar ON d2.fbarid=bar.id AND bar.pastureid=d2.pastureid LEFT JOIN feedpdate fp ON d2.fbarid=fp.barid AND fp.pastureid=d2.pastureid AND fp.date = d2.date
  609. LEFT JOIN feedtemplet ft ON d.tempid=ft.id AND ft.pastureid=d.pastureid
  610. WHERE (d.mydate=DATE_FORMAT(NOW(),'%Y-%m-%d')OR d.mydate=DATE_FORMAT(DATE_ADD(NOW(),INTERVAL -1 DAY),'%Y-%m-%d') ) AND iscompleted=1 AND d.isuse2=0
  611. AND d.pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight' AND table_schema = 'tmrwatch2' AND column_name = 'pastureid')
  612. `).Query().List()
  613. if err1 == nil && err2 == nil {
  614. for i := 0; i < len(queryIdList); i++ {
  615. id := queryIdList[i]["id"]
  616. projName := queryIdList[i]["projName"]
  617. listData := make(map[string]interface{})
  618. listData["farmId"] = 4090
  619. listData["id"] = id
  620. listData["projName"] = projName
  621. feedList := []interface{}{}
  622. for j := 0; j < len(queryDataList); j++ {
  623. id2 := queryDataList[j]["id"]
  624. if id == id2 {
  625. dataList := make(map[string]interface{})
  626. dataList["dropDate"] = queryDataList[j]["dropDate"]
  627. dataList["times"] = queryDataList[j]["times"]
  628. dataList["tmrNo"] = queryDataList[j]["tmrNo"]
  629. dataList["tName"] = queryDataList[j]["tName"]
  630. dataList["dName"] = queryDataList[j]["dName"]
  631. expWeight, _ := strconv.ParseFloat(xorm.String(queryDataList[j]["expWeight"]), 64)
  632. actualWeight, _ := strconv.ParseFloat(xorm.String(queryDataList[j]["actualWeight"]), 64)
  633. dataList["expWeight"] = expWeight
  634. dataList["actualWeight"] = actualWeight
  635. dataList["endTime"] = queryDataList[j]["endTime"]
  636. dataList["penId"] = queryDataList[j]["penId"]
  637. dataList["penName"] = queryDataList[j]["penName"]
  638. dataList["cowCount"] = queryDataList[j]["cowCount"]
  639. dataList["sort"] = queryDataList[j]["sort"]
  640. dataList["ftId"] = queryDataList[j]["ftId"]
  641. dataList["ftName"] = queryDataList[j]["ftName"]
  642. feedList = append(feedList, dataList)
  643. }
  644. }
  645. listData["data"] = feedList
  646. jsonStr, _ := json.Marshal(listData)
  647. postData := make(map[string]string)
  648. postData["formData"] = string(jsonStr)
  649. err := util.PostWithFormData("POST", setting.ServerSetting.GRFDURL+"/grfd-cow/api/tmr/addOtherDeviceFeeding", &postData)
  650. if err != nil {
  651. logging.Error("AddOtherDeviceFeeding err:", err)
  652. } else {
  653. _, err = tx.Exec(`update downloadedplan set isuse2=1 where pastureid =(SELECT column_default FROM information_schema.COLUMNS WHERE table_name = 'recweight'
  654. AND table_schema = 'tmrwatch2' AND column_name = 'pastureid') and pid =? and mydate = ? `, queryIdList[i]["did"], queryIdList[i]["mydate"])
  655. if err != nil {
  656. logging.Error("update downloadedplan err:", err)
  657. }
  658. }
  659. }
  660. }
  661. //data := util.Send_Message1("{\"farmId\":4090}", "http://120.48.30.31:86/kaps-cow/api/tmr/getMaterial")
  662. }
  663. // PostTmrData 定时任务
  664. func PostTmrData() {
  665. defer func() { // 必须要先声明defer
  666. if err := recover(); err != nil {
  667. logging.Error("panic recover err ", err)
  668. }
  669. }()
  670. //上传饲料
  671. AddOtherDevice()
  672. //上传栏舍
  673. AddOtherDeviceFeeding()
  674. }
  675. func CronGRFD() {
  676. defer func() { // 必须要先声明defer
  677. if err := recover(); err != nil {
  678. fmt.Printf("CronTest pnic err%+v \n", err)
  679. logging.Error("CronGRFD panic recover err ", err)
  680. }
  681. }()
  682. log.Println("Starting CronWXwork...")
  683. c := cron.New()
  684. err := c.AddFunc("0/30 * * * *", PostTmrData) //* * * * *, 从分钟开始 每30分钟执行一次
  685. if err != nil {
  686. println("cron4 err", err.Error())
  687. }
  688. c.Start()
  689. }